一、概述
JDBC(Java Database Connectivity,Java数据库连接)就是使用Java语言操作关系型数据库的一套API。JDBC本质上是一套操作所有关系型数据库的规则,即接口,各个关系型数据库要去实现这个接口,就需要提供各自的数据库驱动jar包。程序员使用这套接口(JDBC)编程,真正执行的代码是驱动jar包中的实现类。
二、JDBC的使用
1.步骤
(1)创建工程,导入对应的驱动jar包
项目下创建lib目录与src同级,将下载的文件中的jar包放到lib文件夹下 。
【注意】光导入驱动jar包还不行,需要注册驱动代码才能识别这个jar包。
(2)注册驱动(MySQL5后可省略)
Class.forName("com.mysql.jdbc.Driver");
【tips】使用Class.forName("com.mysql.jdbc.Driver")后,jvm会加载这个类,然后进入com.mysql.jdbc.Driver,会立即注册驱动。
(3)与数据库建立连接
Connection conn = DriverManager.getConnection(url, username, password);
(4)定义sql语句
String sql = "update account set money=2000 where id=1;";
(5)获取执行sql语句的对象
Statement stmt = conn.createStatement();
(6)执行sql语句
int i = stmt.executeUpdate(sql);//返回受影响的行数
(7)处理结果
(8)释放资源
2.API详解
(1)DriverManager
驱动管理类,用来注册驱动和获取数据库连接。
1)注册驱动:
Class.forName("com.mysql.jdbc.Driver");【tips】:MySQL5之后的驱动jar包不需要手动注册驱动的步骤了,会自动进行驱动的注册。
2)获取连接:
static Connection getConnection(String url, String user, String password) |
尝试建立与给定数据库URL的连接。 |
【注意】如果连接的是本机mysql服务器且mysql服务器默认端口号是3306,则url可省略IP和端口号:jdbc:mysql:///数据库名称?参数键值对。
(2)Connection
数据库连接对象,用来获取执行sql语句的对象和管理事务。
1)获取执行sql对象
Statement createStatement() |
创建一个 Statement对象,用于将SQL语句发送到数据库。 |
PreparedStatement prepareStatement(String sql) |
预编译sql的执行sql对象,防止sql注入。 |
CallableStatement prepareCall(String sql) |
创建一个 CallableStatement对象来调用数据库存储过程。 |
2)JDBC中的事务管理
void setAutoCommit(boolean autoCommit) |
将此连接的自动提交模式设置为给定状态:true表示自动提交事务,false表示手动提交事务。 |
void commit() |
提交事务。 |
void rollback() |
回滚事务。 |
try { //开启事务 conn.setAutoCommit(false); int i1 = stmt.executeUpdate(sql1); System.out.println(i1); int i2= stmt.executeUpdate(sql2); System.out.println(i1); //提交事务 conn.commit(); } catch (SQLException e) { //回滚事务 conn.rollback(); e.printStackTrace(); }
(3)Statement
用于执行静态SQL语句并返回其生成的结果的对象。
【tips】executeUpdate(sql)的返回值:如果执行DDL语句,执行成功后也可能返回0;如果执行DML语句,返回受影响的行数。
int executeUpdate(String sql) |
执行DDL、DML语句。 |
ResultSet executeQuery(String sql) |
执行DQL语句,返回结果集对象。 |
(4)★ResultSet:结果集对象,封装了DQL查询语句的结果。
获取查询结果 |
boolean next() |
将光标从当前位置向下移动一行,并返回该行是否为有效行(有数据的行),有效行则返回true。 |
xxx getXxx(参数) | 获取参数。xxx代表数据类型,参数是列的编号(int类型,列编号从1开始!)或列名(String类型)。 |
②一般用while循环来实现获取查询结果。
while (rSet.next()) { int id = rSet.getInt(1); String username = rSet.getString(2); System.out.println("id:" + id + "," + "username" + username); System.out.println("-------------------"); }③ResultSet用完也需要释放资源。
(5)★PreparedStatement
1)PreparedStatement是Statement的子类,用来预编译SQL语句并执行,防止SQL注入问题(如何防止?:将敏感字符进行转义)。
从上面的“获取执行SQL语句对象”开始往下不一样了:
①定义sql语句:参数用占位符"?"来代替,具体参数后续设置(预编译sql);
String sql = "select * from tb_user where username=? and password=?;";//用"?"代替要接收的数据②获取sql执行对象PreparedStatement:需要传入sql语句!
PreparedStatement pstmt = conn.prepareStatement(sql);//需要传入sql语句③设置?参数:使用setXxx(参数1,参数2)设置"?"的值:
Xxx:"?"的数据类型
参数1:要设置的"?"在sql语句中的序号,从1开始
参数2:要设置的"?"的值
pstmt.setString(1,"张三"); pstmt.setString(2,"12");
④执行sql语句:在创建sql对象时已经传入sql语句了,在执行时就不需要传sql语句了!
ResultSet res = pstmt.executeQuery();//无参
4)PreparedStatement的原理?为什么说PreparedStatement预编译SQL性能更高?
在定义sql语句时使用了占位符"?",获取PreparedStatement对象时把sql语句发送给mysql服务器,对sql进行检查和编译(这些步骤比较耗时);当执行sql时就不需要再执行对sql进行检查和编译的步骤了,速度更快;另外,如果sql语句模板一样,则只需要进行一次检查和编译。
三、数据库连接池
1.简介
DataSource(数据源)是 jdk 提供的一个接口,然后只提供了两个 getConnection 方法,是跟数据库连接有关的接口,可以通过它来获取数据库连接。
DruidDataSource 是阿里巴巴写出来的一个DataSource实现类,它不仅可以获取数据库连接,还把这些数据库连接管理了起来,也就是所谓的数据库连接池。
数据库连接池是一个负责分配和管理数据库连接(Connection)的容器。
2.数据库连接池的优点
(1)实现了资源复用:它允许应用程序重复使用一个现有的数据库连接,而不是每次连接都重新建立一个;
(2)提高了系统的响应速度;
(3)避免了数据库连接遗漏:它可以释放空闲时间超过最大空闲时间的数据库连接,来避免因为没有释放数据库连接而引起的数据库连接遗漏。
3.Druid的使用步骤
(1)导入jar包
将"druid-1.2.8.jar"复制到项目的lib目录下,并Add as library。
(2)定义配置文件
在src目录下创建一个druid.properties文件,里面写上配置数据库的信息和连接的信息,如url、username、password等,跟之前的JDBC连接方式一样,只是抽取出来写到一个文件里面了。
(3)加载配置文件
通过Properties的load方法来加载配置文件。
(4)获取数据库连接池对象
通过DruidDataSourceFactory(Druid数据源工厂)中的DataSource createDataSource(Properties prop)方法来获取数据连接池对象(其实是DataSource实现类的对象)。
(5)获取连接
通过DataSource中的getConnection()方法获取连接。
//(1)导入jar包druid-1.2.8.jar //(2)定义配置文件 //(3)加载配置文件 Properties prop = new Properties(); prop.load(new FileInputStream("E:\\IDEA_Project\\JDBC\\src\\durid.properties")); //(4)获取数据库连接池对象 DataSource dataSource = DruidDataSourceFactory.createDataSource(prop); //(5)获取连接 Connection conn = dataSource.getConnection();【tips】通过DataSorce访问跟 JDBC 方式相比,省略了实例化数据库连接驱动 Driver 驱动这一步。