MySQL基础学习知识点和重点(三)JDBC操作和连接池

文章目录

  • 一、JDBC
    • 1.1 理解JDBC
      • 1.1.1 概述
      • 1.1.2 JDBC程序的开发步骤
      • 1.1.3 JDBC程序的代码步骤
        • 1、注册驱动
        • 2、获取连接
        • 3、编写sql
        • 4、创建Statement对象
        • 5、执行Sql语句,接收结果
        • 6、关闭连接
      • 1.1.3 Statement的三个问题
        • 1.sql的拼接问题
        • 2.sql的注入问题
        • 3、sql拼接不支持blob等二进制类型
      • 1.1.4 PreparedStatement对象
    • 1.2获取自增长键值
    • 1.3 批处理
      • 1.注册驱动、获取连接、编写sql同上;
      • 2.创建PreparedStatement对象
      • 3.关闭连接
  • 二、JDBC处理事务
    • 2.1 模拟一个事务
    • 2.2和事务相关的API
    • 2.3 事务的注意事项
      • 1.同一个事务的sql必须保证是在同一个==connection对象==;
      • 2.在执行sql之前connection连接对象.setAutoCommit(false);
      • 3.如果一切正常,提交事务,Connection连接对象.commit();如果有问题,回滚事务,Connection连接对象.rollback();
      • 4.关闭连接之前,使用Connection连接对象.setAutoCommit(true);
      • 5.关闭连接 Connection连接对象.close();
  • 三、数据库连接池
    • 3.1 为什么要引入数据库连接池
    • 3.2 数据库连接池技术概述
    • 3.3 数据库连接池使用步骤
      • 1.引入Druid的jar包
      • 2.加一个配置文件
      • 3.创建连接池(一个系统一个)
      • 4. 提供一个方法,从数据库连接池中拿连接对象
  • 四、DAO
    • 4.1 概念
    • 4.2 commons-dbutils类
      • 1.DbUtils工具类
      • 2.QueryRunner工具类
      • 3.ResultSetHandler接口

一、JDBC

1.1 理解JDBC

1.1.1 概述

(1)JDBC:Java Database Connectivity JAVA连接数据库
简单的说,JDBC代表一组API(应用程序接口),一个独立于特定数据库管理系统(DBMS)、通用的SQL数据库存取和操作的公共接口(一组API)。
(2)驱动:每个数据库厂商对JDBC的接口的实现类。
JDBC的API是SUN公司提供的,而这些接口的实现类(驱动)由数据库厂商提供。
(3)JDBC、驱动和mysql数据库的流程是:
Java Application程序 先调用 JDBC 再调用数据库所对应的驱动(这里是mysql),最后进去数据库层的操作。
(4)JDBC目的:为了使java代码可以跨数据库,JDBC的代码尽量不动(少动),设计一组公共接口(标准),规定了所有操作。

1.1.2 JDBC程序的开发步骤

1、把驱动jar引入项目中
在java项目中,已经建立一个libs, 把数据库驱动:mysql-connector-java-5.1.36-bin.jar放入到文件夹中,然后添加到build-path路径下。
(驱动下载,大家可以参考。百度云网盘:https://pan.baidu.com/s/1adYbh1IUdGuKiP20h57rbQ 提取码:7xan)
2、编写JDBC代码

1.1.3 JDBC程序的代码步骤

1、注册驱动
Class.forName("驱动类的全名称");

对于mysql:驱动类的全名称有两个,都可以使用,建议新版。
新版:mysql:com.mysql.jdbc.Driver 老版:org.gjt.mm.mysql.Driver

2、获取连接

(1)String mysqlurl = “jdbc:mysql://主机地址:端口号/数据库名”
主机地址:localhost;mysql 端口号:3306, 这么数据库用test库,
url是网址,即统一资源定位符。其中jdbc是协议,mysql是子协议。
即: String url = "jdbc:mysql://localhost:3306/test";
(2)String username = "用户名";
即mysql的主机用户,一般是"root"
(3)String password = "密码";
即mysql登录密码
(4)Connection conn = DriverManager.getConnection(url,username,password);
用驱动管理类获取连接,Connection接口和DriverManager类都在java.sql包。

3、编写sql

String sql = "xxx";其中xxx即我们写的sql语句。

4、创建Statement对象

Statement st = conn.createStatement();这里是创建的Statement对象来接收sql语句的操作,但是Statement对象有三个致命问题,这在下一章节讲,以后尽量用改进的PreparedStatement对象。

5、执行Sql语句,接收结果

(1)更新:添加、修改、删除

int len = st.executeUpdate(sql);

(2)查询

ResultSet rs = st.executeQuery(sql);
while(rs.next()){
   
xxx xxx = rs.getXxx(字段名或者序号);//序号从1开始
}

==注意:==这里执行sql语句把sql代入了,而创建Statement对象时没有代入sql。这与PreparedStatement对象正好相反。写代码的时候注意下!

6、关闭连接
rs.close();
st.close();

1.1.3 Statement的三个问题

1.sql的拼接问题

例如:从键盘输入员工信息,并添加到test数据库的t_employee表中。
在1.1.3程序代码的第3步,编写sql语言时,如果我们只加入ename,tel,gender,salary信息,其他字段为null,那么sql要写的代码为:

String sql = "insert into t_employee(ename,tel,gender,salary) values('"+ename +"','"+tel+"','"+gender+"','"+salary+"')";

这里重点说下values括号里面的写法:java中的sql里传变量时使用单引号界定引进的变量,然后在变量里面用java的字符串拼接方法" + ename +"。
可以看出来,如果字段稍微多一点,这样的用Statement对象的写法很复杂。

2.sql的注入问题

sql注入问题会有造成盗取信息。
例如:根据姓名到t_employee表中查自己的信息。
在编写sql语句时,

String sql ="select * from t_employee where ename = '"+ ename +"'";

在键盘输入ename时,输入: 张三 ’ or ‘1’='1
这样的sql语句就变成了select * from t_employee where ename = ’ 张三 ’ or ‘1’='1 ’
可以注意到,这个sql在where筛选后所有行都恒成立,将把所有人的信息导出,就会发生盗取信息。

3、sql拼接不支持blob等二进制类型

这是因为因为java中字符串拼接得到的是String类型

1.1.4 PreparedStatement对象

为了解决Statement对象的三个问题,引入PreparedStatement对象。
原代码的第一步注册驱动和第二步获取连接不变。
1.为了解决sql拼接问题:
(1)编写sql:

String sql = "insert into t_employee(ename,tel,gender,salary) values(?,?,?,?)";

==注意:==此处用占位符’?'放在sql语句values中占位;
(2)创建PreparedStatement对象

PreparedStatement pst = conn.prepareStatement(sql);

要先传入sql,对带?的sql进行预编译。注意这里在创建PreparedStatement对象的时候就已经代入了sql。
(3)把?的具体值传进入

  pst.setObject(1, ename);//序号都是从1开始
  pst.setObject(2, tel);
  pst.setObject(3, gender);
  pst.setObject(4, salary);

其中1表示第一个?占位符位置,2表示第二个?占位符位置。
ename,tel,gender,salary都是用Scanner扫描的键盘输入字符串。
(4)更新执行sql

int update = pst.executeUpdate();//这里不能再传sql
  System.out.println(update>0?"添加成功"

你可能感兴趣的:(mysql)