JDBC

关键词:JDBC; DriverManager; Connection; Statement

非常的常用,会伴随所有的web开发,需要重点掌握。

概念:Java DataBase Connectivity Java操作数据库。

sun公司制定了JDBC,定义了一套接口。但是具体的实现类是交给各个数据库厂商自己定义的。

快速入门

步骤:

  1. 导入驱动jar包 mysql-connector-java-5.1.37-bin.jar(我是8.0.12版本)

    • 复制mysql-connector-java-5.1.37-bin.jar到项目的libs目录下
    • 右键-->Add As Library
  2. 注册驱动

  3. 获取数据库连接对象 Connection

  4. 定义SQL

  5. 获取执行sql语句的对象statement

  6. 执行sql,接受返回问题

  7. 处理结果

  8. 释放释放资源

遇到两个问题:
1.java connector版本低,找了很久,才找到mysql8版本对应的jar包。
2.一开始运行不同,需要在连接数据库的字符串中加入 serverTimezone=UTC

// 1. 导入驱动jar包
// 2.注册驱动
Class.forName("com.mysql.jdbc.Driver");
// 3.获取数据库连接对象
Connection conn =DriverManager.getConnection("jdbc:mysql://localhost:3306/db3", "root", "12345678");
// 4.定义sql语句
String sql ="update account set balance = 500 where id = 1";
// 5.获取执行sql的对象 Statement
Statement stmt = conn.createStatement();
// 6.执行sql
int count = stmt.executeUpdate(sql);
// 7.处理结果
System.out.println(count);
// 8.释放资源
stmt.close();
conn.close();

详解各个对象

1. DriverManager

功能1:注册驱动

告诉程序该使用哪一个数据库驱动jar
static void registerDriver(Driver driver) :注册与给定的驱动程序 DriverManager 。
使用: Class.forName("com.mysql.jdbc.Driver");
注意:mysql5之后的驱动jar包可以省略注册驱动的步骤。

功能2: 获取数据库连接

方法:static Connection getConnection(String url, String user, String password)

参数

  • url:指定连接的路径
    • 语法:jdbc:mysql://ip地址(域名):端口号/数据库名称
    • 例子:jdbc:mysql://localhost:3306/db3
    • 细节:如果连接的是本机mysql服务器,并且mysql服务默认端口是3306,则url可以简写为:jdbc:mysql:///数据库名称
  • user:用户名
  • password:密码

2. Connection

功能
获取执行sql对象

  • Statement createStatement()
  • PreparedStatement prepareStatement(String sql)

管理事务

  • 开启事务:setAutoCommit(boolean autoCommit) :调用该方法设置参数为false,即开启事务
  • 提交事务:commit()
  • 回滚事务:rollback()

3. Statement

  • 执行sql
    • (了解)boolean execute(String sql) :可以执行任意的sql
    • int executeUpdate(String sql) :执行DML语句、DDL语句。(这种更重要)
      • 返回值:受影响的行数,大于0表示执行成功,反之失败。
    • ResultSet executeQuery(String sql) :执行DQL(select)语句
  • 练习:account表 添加一条记录

4. ResultSet:

执行DQL时,虽然SQL执行成功了,但是在java的结果窗口中还没有显示出来,所以resultset就是来做这些事情的。
在执行DQL的时候使用,为了把结果显示在java的结果窗口中。

  • boolean next(): 游标向下移动一行,判断当前行是否是最后一行末尾(是否有数据),如果是,则返回false,如果不是则返回true
  • getXxx(参数):获取数据
    • Xxx:代表数据类型 如: int getInt() , String getString()
    • 参数:
      1. int:代表列的编号,从1开始 如: getString(1)
      2. String:代表列名称。 如: getDouble("balance")
// 让游标向下移动一行 
rs.next();
// 获取数据 
int id = rs.getInt(1);      //获取第一列 String name = rs.getString("name");
double balance = rs.getDouble(3);

System.out.println(id + "---" + name + "---" + balance);

这样操作一下只能打印一行的内容,完整打印需要遍历整个表,加循环。while(rs.next())

练习
定义一个方法,查询emp表的数据将其封装为对象,然后装载集合,返回。

  • 定义emp类
  • 定义方法 public list findAll() {}
  • 实现方法 select * from emp;

调用非静态方法,要创建一个对象。

5.PreparedStatement:

执行sql的对象

  • sql注入问题:拼接sql时,有一些sql的特殊关键字参与字符串的拼接。会造成安全性问题。
  • 解决sql注入问题:使用PreparedStatement对象来解决
  • 预编译的SQL:参数使用?作为占位符

有三个步骤需要更改:

  • 定义sql
    • sql的参数使用 ?作为占位符。 如:select * from user where username = ? and password = ?;
String sql = "select * from user where username = ? and password = ?";
  • 获取执行sql语句的对象 PreparedStatement
//3.获取执行sql的对象 
pstmt = conn.prepareStatement(sql);
  • 给?赋值:
    方法: setXxx(参数1,参数2)
    参数1:?的位置编号 序号从1开始
    参数2:?的值
pstmt.setString(1,username);
pstmt.setString(2,password);

后期都会使用PreparedStatement来完成增删改查的所有操作。第一因为可以避免sql注入,而来效率更高。

抽取JDBC工具类:JDBCUtils

这个例子很综合,需要慢慢消化

目的:简化书写,因为原先的代码重复度太高

分析:
1.抽取一个方法用来释放资源
2.抽取一个方法获取连接对象

  • 需求:不想传递参数(麻烦),还得保证工具类的通用性。
  • 解决:配置文件
jdbc.properties
		url=
		user=
		password=

抽取connection的时候用了一种巧妙的方法,十分常用。这里我也找到为什么之前总是提取db3的原因了。

写注释的时候 输入/**然后tab会出现很多有用的自动注释。

实现代码是基于 4.resultset 得到的,具体要去看,还需要敲几次。

练习:登录案例

  1. 通过键盘录入用户名和密码
  2. 判断用户是否登录成功
select * from user where username = "" and password = "";
如果这个sql有查询结果,则成功,反之,则失败

先创建一个数据库表

CREATE TABLE USER(
	id INT PRIMARY KEY AUTO_INCREMENT,
	username VARCHAR(32),
	PASSWORD VARCHAR(32)		
	);

INSERT INTO USER VALUES(NULL,'zhangsan','123');
INSERT INTO USER VALUES(NULL,'lisi','234');

JDBC控制事务

待更新...

附录

执行DQL的代码

public static void main(String[] args) {
    Connection conn = null;
    Statement stmt = null;         //这些对象之所以要提出来,是因为后面要专门释放。
  ResultSet rs = null;
    try {
        //1. 注册驱动
  Class.forName("com.mysql.jdbc.Driver");
        //2.获取连接对象
  conn = DriverManager.getConnection("jdbc:mysql:///db4", "root", "root");
        //3.定义sql
  String sql = "select * from account";
        //4.获取执行sql对象
  stmt = conn.createStatement();
        //5.执行sql
  rs = stmt.executeQuery(sql);
        //6.处理结果
 //循环判断游标是否是最后一行末尾。  
 while(rs.next()){
      int id = rs.getInt(1);
      String name = rs.getString("name");
      double balance = rs.getDouble(3);

      System.out.println(id + "---" + name + "---" + balance);
      }

  } catch (ClassNotFoundException e) {
        e.printStackTrace();
    } catch (SQLException e) {
        e.printStackTrace();
    } finally {
        //7.释放资源    
        if(rs != null){
            try {
                rs.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }

        if(stmt != null){
            try {
                stmt.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }

        if(conn != null){
            try {
                conn.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }
}

登录案例代码

public static void main(String[] args) {
    /*1.键盘录入,接受用户名和密码
 注意!!! 输入的不是你的MySQL账户密码,而是存在数据库中那张表的数据。*/    
    Scanner sc = new Scanner(System.in);
    System.out.println("请输入用户名:");
    String username = sc.nextLine();
    System.out.println("请输入密码:");
    String password = sc.nextLine();
    //2.调用方法
  boolean flag = new JDBCDemo9().login(username, password);
    //3.判断结果,输出不同语句
  if(flag){
        //登录成功
  System.out.println("登录成功!");
    }else{
        System.out.println("用户名或密码错误!");
    }

}

/**
 * 登录方法 */ 
 public boolean login(String username ,String password){
    if(username == null || password == null){
        return false;
    }
    //连接数据库判断是否登录成功
  Connection conn = null;
    Statement stmt =  null;
    ResultSet rs = null;
    //1.获取连接
  try {
        conn =  JDBCUtils.getConnection();
        //2.定义sql
  		String sql = "select * from user where username = '"+username+"' and password = '"+password+"' ";
        System.out.println(sql);
        //3.获取执行sql的对象
  		stmt = conn.createStatement();
        //4.执行查询
  		rs = stmt.executeQuery(sql);
        //5.判断

       return rs.next();//如果有下一行,则返回true    
      } catch (SQLException e) {
          e.printStackTrace();
      }finally {
          JDBCUtils.close(rs,stmt,conn);
      }

    return false;
}
posted @ 2021-04-26 21:22  党参  阅读(64)  评论(0)    收藏  举报
页脚HTML代码