介绍

Java DataBase Connectivity(数据库连接)

  • 概念
    用于执行SQL语句的 Java API,可以为多种关系型数据库提供统一的资源访问,它本身就是由Java编写的
    JDBC对于程序员来说就是一套API,对数据库厂商而言,是接口模型。

  • 简单来说:JDBC可以做三件事

    1. 建立数据库的连接
    2. 发送操作数据库的SQL语句
    3. 返回数据库查询出的结果集
  • 开发步骤:

    1. 导包
    2. 注册驱动
    3. 连接数据库
    4. 发送SQL语句
    5. 设置占位符 *
    6. 执行SQL语句
    7. 关闭访问资源
  • 注意
    占位符:避免mysql注入。有值,但是不确定值是多少。
    增、删、改:executeUpdate()
    查:excuteQuery()

看代码

  • JDBC通信规则涉及的API
    1. java.sql.Driver接口
      声明了用于建立通信通道的方法名由Driver接口修饰对象相当于”隧道工人” Driver obj
    2. java.sql.Connection接口
      声明了用于维护通信通道的方法名由Connection接口修饰对象,相当于”道路养护工” Connection obj
    3. java.sql.PreparedStatement接口
      声明了用于推送通信信息的方法名由PreparedStatement接口修饰对象,相当于”快递小哥” PreparedStatement obj
    4. java.sql.ResultSet接口
      声明了操作查询之后生成的临时表的方法名由ResultSet接口修饰的对象,相当于”临时表管理员” ResultSet obj
    5. java.sql.DriverManager类
      负责调用由数据库厂商提供的Driver接口实现类的实例对象去打通通道,相当于”监工”
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
// 查询例子:
// 注册驱动
Class.forName("com.mysql.jdbc.Driver");

// 链接数据库(维护通道)
Connection connection = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/test?useUnicode=true&characterEncoding=utf8", "root", "123456");

// 编写sql语句 并且准备 推送/接收通信
String sql = "select * from emp";
PreparedStatement ps = connection.prepareStatement(sql);


// 执行通信之查询
ResultSet rs = ps.executeQuery(); //此处是查询,返回的是结果集
// 遍历结果集
while (rs.next()){
System.out.print(rs.getInt("empno") + "\t");
System.out.print(rs.getString("ename") + "\t");
System.out.print(rs.getString("job") + "\t");
}

// 批量操作并且开启事务
con.setAutoCommit(false); //设置开启事务

for(int i=50;i<55;i++){
ps.setInt(1, i);
ps.setString(2, "dept_"+i);
ps.setString(3, "上海");
ps.addBatch(); //类似集合,每次加入
}
ps.executeBatch();//通知ps将batch中sql语句一次性推送推送过去
con.commit();//成功则推送
con.rollback();//失败则回滚

// 最后关闭流
rs.close();
ps.close();
connection.close();
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
// 新增例子:
// 注册驱动
Class.forName("com.mysql.jdbc.Driver");

//链接数据库
Connection conn = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/gz2107?useUnicode=true&characterEncoding=utf8", "root", "123456");

//编写sql语句
String sql = "insert into emp (name,salary,age) VALUES (?,?,?);";

//设置sql语句
PreparedStatement ps = conn.prepareStatement(sql);

//根据sql和表设置占位符
ps.setString(1, "Peng");
ps.setInt(2, 3000);
ps.setInt(3, 22);

//发送sql语句
ps.executeUpdate(); //此处是增删改用到的,返回值是int类型

注意!!!

1
2
3
4
5
6
7
8
9
ps.executeUpdate() 与 ps.executeQuery()区别:

1.推送的SQL语句类型不同
ps.executeUpdate():负责推送DML语句(Insert/update/delete)
ps.executeQuery():负责推送DQL语句(select)

2.返回结果不同
ps.executeUpdate():返回 int 类型数据;表示本次插入了多少行数据,或者删除了多少行数据,或者更新了多少行数据
ps.executeQuery():返回 ResultSet 类型,表示本次查询时得到的这个临时表

数据库连接池

  • 存在的问题
    普通的JDBC数据库连接使用的是DriverManager来获取,每次向数据库建立连接的时候都要将connection加载到内存。频繁链接断开这样的方式极大地消耗大量的资源和时间。

  • 概念
    数据库连接建立一个”缓冲池”,预选在缓冲池中放入一定数量的连接,当需要建立数据库连接时,只需要从”缓冲池”中取一个使用完毕之后再放回去。数据库连接池负责分配,管理和释放数据库连接,允许应用程序重复使用一个现有的数据库连接,而不是重新建立。

  • 常用的数据库连接池。
    C3P0【已经没落】
    druid【德鲁伊】alibaba 开源项目
    DBCP 全称:DataBase Connection Pool。Apache的一个开源项目

dao

Data Access Object【数据访问逻辑】

  • 概念
    封装了数据访问的细节,对于其它层来说是透明的,看不见的。
  • 如何写一个DAO?
    1. 实体类【pojo、entity】
      为了方便处理数据库中的记录,可以定义一个与数据库中的表对应的实体类。
      即表名—类名,列名—属性名。
    2. dao接口
      声明一些数据访问方法,这些方法都是抽象的。
    3. dao接口的实现类
      用于实现dao接口中具体的数据库访问细节。
    4. dao工厂
      根据配置信息来获取不同的dao实现对象。