Java模拟用户名密码登录验证(JDBC)

0、示例程序说明

  • 演示登录验证,用户通过终端输入用户名与密码,程序连接数据库查询合法性;
  • 基本步骤:
    • 获取数据库连接对象
    • 获取SQL执行对象
    • 执行SQL获取结果对象
    • 处理结果
  • 执行SQL语句有两个类,Statement与PrepareStatement,后者是前者的子类,后者有防SQL流入的功能

1、封装工具类操作数据库

package com.yusian.utils;

import java.io.FileReader;
import java.io.IOException;
import java.net.URL;
import java.sql.*;
import java.util.Properties;

public class Utils {
    private static String url;  // 数据库连接url
    private static String user; // 数据库用户名
    private static String pass; // 数据库密码
    private static String driver;

    /**
     * 读取配置文件初始化参数值
     */
    static {
        // 通过ClassLoader获取配置文件的路径
        ClassLoader loader = Utils.class.getClassLoader();
        URL jdbc = loader.getResource("jdbc.properties");
        try {
            // 通过Properties类读取配置文件中的数据,赋值给静态变量
            Properties prop = new Properties();
            prop.load(new FileReader(jdbc.getPath()));
            url = prop.getProperty("url");
            user = prop.getProperty("user");
            pass = prop.getProperty("pass");
            driver = prop.getProperty("driver");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    /**
     * 获取数据库连接
     * @return 数据库连接对象Connection
     * @throws SQLException
     */
    public static Connection getConnection() throws SQLException {
        // 注册MySQL驱动类
        try {
            Class.forName(driver);
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
        // 获取MySQL连接对象
        return DriverManager.getConnection(url, user, pass);
    }

    /**
     * 释放更新类数据库操作对象
     * @param conn 数据库连接对象
     * @param stmt SQL语句执行对象
     */
    public static void releaseExcuteUpdate(Connection conn, Statement stmt) {
        releaseCloseableObject(stmt);
        releaseCloseableObject(conn);
    }

    /**
     * 释放查询类数据库操作对象
     * @param conn 数据库连接对象
     * @param stmt SQL执行对象
     * @param retSet 查询结果
     */
    public static void releaseExecuteQuery(Connection conn, Statement stmt, ResultSet retSet) {
        releaseCloseableObject(retSet);
        releaseExcuteUpdate(conn, stmt);
    }
    /**
     * 释放资源
     * @param object 需要释放的资源对象
     */
    private static void releaseCloseableObject(AutoCloseable object) {
        if (object == null) return;
        try {
            object.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

[……]

继续阅读

Java简单完整数据库操作全过程(JDBC)

1、基本概念与步骤

1.1 初始化JDBC

jdbc定义的是一套接口,每种数据库类型都有各自的实现,我们调用的都是接口,编译器可能并不清楚该采用哪种实例,所以需要先初始化。

Class.forName("com.mysql.jdbc.Driver");

1.2 数据库连接对象(Connection类)

String connectUrl = "jdbc:mysql://example.domain.com:3306/db3?useSSL=false";
Connection conn = DriverManager.getConnection(connectUrl, "user", "password");

1.3 执行SQL(Statement类)

两个重要的方法:

  • executeUpdate 执行DML语句和DDL语句,即数据或库表的增删改操作;
  • executeQuery 执行DQL语句,即数据库的查询操作;
String sql = "select * from xxx";
Statement stmt = conn.createStatement();
ResultSet resultSet = stmt.executeQuery(sql);
while (resultSet.next()) {
    String uname = resultSet.getString("column1");
    int balance = resultSet.getInt("column2");
    System.out.println(uname + "--" + balance);
}

1.4 释放资源

stmt.close();
conn.close();

[……]

继续阅读

数据库设计的一般范式

1、数据库表设计的几种情况

/*
数据库设计:
    1、一对一
        添加唯一外键指向另一张表的主键
    2、一对多
        多的一方设置外键指向一的一方主键
    3、多对多
        借助第三张表来实现关联,第三张表分别设置2个字段设置外键分别指向两张表的主键,并且设置为联合主键
*/
/*
    旅游分类:categary
    旅游线路:line
    用户:user
    旅游分类(一) --- 旅游线路(多)
    用户(多) --- 旅游线路(多)
*/

-- 用户表:id, username, gender, age,主键id,自[......]

继续阅读

MySQ中事务的基本概念

/*** 事务 ***/
# 如果一个包含多个步骤的业务操作,被事务管理,那么这些操作要么同时成功,要么同时失败。
# 默认情况下单条sql语句都是自动提交事务
# 操作:
#      1、开启事务:start transaction
#      2、回滚:rollback
#      3、提交:commit
# MySQL事务默认的提交方式是自动提交,即每条SQL语句都是一个事务
# 查看提交方式 select @@autocommit
SELECT @@autocommit; 

# 事务四大特征
#      1、原子性:不可分割的最小单元,要么同时成功,要么同时失败
#[......]

继续阅读