目录
数据库连接JDBC
数据库连接池Druid
数据库连接JDBC
JDBC是Java Data Base Connectivity的缩写即Java数据库连接,JDBC所要学习的东西,就是Java操作各种关系型数据库的一套API,其中Java定义好了接口,各个数据库厂商分别对这些接口进行了实现,如果我们要操作MySQL,那么就需要用MySQL家的实现类,也就是对应的jar,我们习惯性的说是MySQL驱动。该驱动可以通过该网址下载。
导入驱动jar包之后就可以可以操作对应的数据库了,该驱动jar包,提供了各种API。
我们创建一个DbUtil类,通过调用对应的API,来实现对数据库连接的操作。
import java.sql.Connection;import java.sql.DriverManager;public class DbUtil {private static String url = "jdbc:mysql://localhost:3306/newsblog?useSSL=false&serverTimezone=UTC";private static String user = "root";private static String password = "root";public static Connection getCon() {Connection con = null;try {Class.forName("com.mysql.cj.jdbc.Driver");// MySQL 8可以自动加载,这句可以省略con = DriverManager.getConnection(url, user, password);} catch (Exception e) {e.printStackTrace();}return con;}}
下面通过一个查询操作,来进行演示Java操作数据库的流程。
// 可以看出,这些接口都是Java官方定义好的,MySQL官方只是实现了这些接口import java.sql.Connection;import java.sql.ResultSet;import java.sql.Statement;public class Demo1 {public static void main(String[] args) throws Exception {String sql = "select * from user where userId = 1";Connection con = DbUtil.getCon();Statement stmt = con.createStatement();ResultSet resultSet = stmt.executeQuery(sql);while (resultSet.next()) {System.out.println(resultSet.getString("userName"));}stmt.close();con.close();}}
到这里,我们就把Java操作数据库给跑起来了,上面用到了很多API,可能大家还不太熟悉,那么接下来,让我来进行介绍一些常用的API。
DriverManager类,这是一个类,是Java官方定义好的,在java.sql包下,该类的主要作用可以获取数据库连接,通过getConnection()方法。
Connection接口,这是数据库连接对象,可以理解为数据库连接之后会获得该对象。该对象主要是用来获取执行SQL的对象,另外还可以管理事务。这个接口提供了一些API
createStatement(),该方法是获取一个普通的执行SQL的对象。
prepareStatement(sql),该方法是获取一个预编译的执行SQL的对象(防止SQL注入)。
setAutoCommit(false),开启事务
commit(),提交事务
rollback(),回滚事务
Statement接口,主要是用来执行SQL语句的,该接口也提供了一些API
excuseUpdate(sql),用来执行数据定义语言DDL和数据增删改语言DML
excuseQuery(sql),用来执行数据查询语言DQL,该方法的返回值是一个结果集对象ResutSet
Result接口,这是查询语句的返回值的结果集对象。该结果集对象也提供了相应的API
next()方法,用来遍历该结果集,如果该方法的返回值是true,说明有数据,反之亦反之。
getXxx(参数),用来获取某一个结果的具体数据。
PreparedStatement接口,该接口继承Statement接口,可以解决SQL注入的问题。Statement执行SQL时,需要拼接字符串,所以有SQL的问题,但PreparedStatement,使用占位符来进行解决。然后通过setXxx()来进行对占位符进行设置值,这里给出一个查询案例。
public class Main {public static void main(String[] args) throws Exception {String sql = "select * from user where userId = ?";Class.forName("com.mysql.cj.jdbc.Driver");// MySQL 8可以自动加载,这句可以省略Connection con = DbUtil.getCon();PreparedStatement pstmt = con.prepareStatement(sql);pstmt.setInt(1, 1);// 占位符的下标从1开始,如果有多个,分别是1 2 3 ...ResultSet resultSet = pstmt.executeQuery();while (resultSet.next()) {System.out.println(resultSet.getString("userName"));}pstmt.close();con.close();}}
数据库连接池Druid
我们使用JDBC的时候,每次操作数据库,都要创建连接,操作完成之后又要释放连接,这样来回创建连接和释放连接比较耗费资源,所以提出一种技术,创建的连接放到一个池子里,每次操作数据库只需要在池子里拿就行了,用完再放到池子里,于是出现了数据库连接池。这里进行介绍Druid连接池。
Java官方对连接池也提供了接口DataSource,在javax.sql包下,该接口提供了一个getConnection()方法。Druid只是对这个接口进行了实现,还有像C3P0也是实现了该接口的规范。如果我们要使用Druid,首先我们需要先导入Druid的jar包,然后我们就可以使用了。
在使用Druid之前,我们需要写一个配置文件druid.properties,来进行配置数据库的用户名密码等。
driverClassName=com.mysql.cj.jdbc.Driverurl=jdbc:mysql://localhost:3306/newsblog?useSSL=false&serverTimezone=UTCcharacterEncoding=utf-8username=rootpassword=root#初始化物理连接的个数initialSize=5#最大连接池数量maxActive=10#获取连接时最大等待时间maxWait=3000
当我们把配置文件写好之后,就可以通过Druid数据库连接池来获取连接了,这里给出一个Demo
public class DruidUtil {public static Connection getCon() {Connection con = null;try {Properties prop = new Properties();prop.load(new FileInputStream("druid.properties"));DataSource dataSource = DruidDataSourceFactory.createDataSource(prop);con = dataSource.getConnection();} catch (Exception e) {e.printStackTrace();}return con;}}
获取到连接之后,后面对数据库的操作和JDBC是一样的。