学习目标:
- 了解JDBC的概念
- 学习JDBC的使用步骤
- 了解JDBC对象
- 了解JDBC控制事务
- 了解封装通用的JDBC工具
- 了解JDBCUtil
- 了解连接池第三方插件
学习内容:
- 掌握JDBC的概念
- 学习JDBC的使用步骤
- 掌握JDBC对象
- 掌握JDBC控制事务
- 掌握封装通用的JDBC工具
- 学习JDBCUtil
- 学习连接池第三方插件
学习产出:
1、概念:Java Database Connectivity Java java语言操作数据库
本质:官方定义的一套操作所有关系型数据库的规则,即接口。各个数据库厂商去实现这套接口,提供数据库驱动jar包。我们可以使用这套接口编程,真正执行代码的是驱动jar包中的实现类。
2、使用步骤
//1、导入驱动jar包,复制jar包到项目lib文件夹下
//2、注册驱动,Class.forName(String className) 使用装载当前类的类装载器来装载制定的类
Class.forName("com.mysql.cj.jdbc.Driver");
//3、获取数据库连接对象 Connection
Connection connection= DriverManager.getConnection("localhost","root","root");
//4、定义sql
String sql="select * from student";
//5、获取一个执行sql语句的对象statement
Statement stmt=connection.createStatement();
//6、执行sql语句,返回一个ResultSet对象(里面包含查询出来的结果)
ResultSet rs= stmt.executeQuery(sql);
//7、从ResultSet对象获取数据
while(rs.next()){
int id=rs.getInt("id");
String name=rs.getString("name");
System.out.println("id:"+id+"name:"+name);
}
//8、释放资源
rs.close();
stmt.close();
connection.close();
3、JDBC对象
- DriverManager(驱动管理类)
管理一组 JDBC 驱动程序的基本服务
1)注册驱动
2)获取数据库链接
getConnection(String url,String user,String password)
- Connection(数据库了解对象)–DDL
连接对象
1)获取执行SQL对象
//普通执行SQL对象
Statement createStatement()
//预编译SQL的执行SQL对象:防止SQL注入
PreparedStatement prepareStatement(sql)
//执行存储过程的对象
CallableStatement prepareCall(sql)
- Statement–DML
提供了执行语句和获取结果的基本方法;
excuteUpdate(sql)执行DML和DDL
- ResultSet–DQL
结果集对象,封装查询结果
获取数据,getxxx(xxx:数据类型) - PreparedStatement
执行sql的对象
可以用来防止sql注入
设置占位符
String username = "zs";
String password = "123";
String sqlString = "select * from user where username = ? and password = ?";
PreparedStatement preparedStatement = connection.prepareStatement(sqlString);
preparedStatement.setString(1, username);
preparedStatement.setString(2, password);
ResultSet resultSet = preparedStatement.executeQuery();
4、控制事务
步骤
- 开启事务
- 提交事务/回滚事务
使用Connection对象管理事务
//开启事物
setAutoCommit(bollean autoCommit):true// 调用该方法设置参数为false,即开启事务。在执行sql之前开启
//提交事物
commit()// 当所有sql都执行完提交事务
//回滚事物
rollback()// 出现错误回滚事务,在catch中回滚事务
5、 封装通用的JDBC工具
创建JdbcUtil工具类
封装获取连接getConnection和关闭方法close
//JDBCutils
public static Connection getConnection(){
Connection connection=null;
try{
//获取类根目录
ClassLoader loader=JDBCutils.class.getClassLoader();
//读取文件内容,转成字节输入流
InputStream inputStream= loader.getResourceAsStream("jdbc.properties");
Properties properties=new Properties();
//加载inputstream,解析里面的内容
properties.load(inputStream);
String driver=properties.getProperty("jdbc.driver");
String url=properties.getProperty("jdbc.url");
String username=properties.getProperty("jdbc.username");
String password=properties.getProperty("jdbc.password");
//注册驱动
Class.forName("driver");
//连接数据库
connection= DriverManager.getConnection(url,username,password);
}catch(Exception e){
e.printStackTrace();
}
return connection;
}
public static void close(Connection connection, Statement stmt, ResultSet rs){
try{ //关闭资源
if(rs!=null){
rs.close();
}
if(stmt!=null){
stmt.close()
}
if(connection!=null) {
connection.close();
}
}catch(Exception e){
e.printStackTrace();
}
}
public static void main(String[] args) {
//connection!
Connection connection=JDBCutils.getConnection();
PreparedStatement stmt=null;
ResultSet rs=null;
try {
stmt=connection.prepareStatement("select * from student");
stmt.executeQuery();
while(rs.next()){
System.out.println(rs.getString("name"));
}
}catch (SQLException throwables){
throwables.printStackTrace();
}finally {
//close!
JDBCutils.close(connection,stmt,rs);
}
}
//配置文件
//提取jdbc配置参数到独立文件
//在src下创建文件 jdbc.properties
jdbc.driver=com.mysql.cj.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/test19?userSSL=false&serverTimezone=Asia/Shanghai
jdbc.username=root
jdbc.password=root
6、JDBCUtil
- 数据库连接池
说明:一个容器(集合),存放数据库连接的容器
当系统初始化后,容器被创建,容器会申请一些连接对象,当用户访问数据库时,从容器中获取连接对象,用画访问完后,会将连接对象归还给容器
好处:节约资源;用户访问高效。 - 标准接口
DataSource javax.sql包下的- 方法
- 获取连接:getConnection()
- 归还连接:Connection.close()
如果连接对象Connection是从连接池中获取的,那么调用Connection.close()方法,则不会再关闭连接了,而是归还连接
- 获取properties
- 方法
7、连接池第三方插件
Druid:数据库连接池技术,阿里巴巴提供的,德鲁伊
- 导入jar包,druid
- 定义配置文件
- 是properties形式的
- 可以叫任意名称,放在任意目录下
- 加载配置文件
//druid
public class JDBCutils1 {
private static DataSource dataSource;
static{
try{
ClassLoader loader=JDBCutils1.class.getClassLoader();
InputStream inputStream=loader.getResourceAsStream("druid.properties");
Properties properties=new Properties();
properties.load(inputStream);
dataSource= DruidDataSourceFactory.createDataSource(properties);
}catch(Exception e){
e.printStackTrace();
}
}
public static Connection getConnection(){
Connection connection=null;
try{
//连接数据库
connection= dataSource.getConnection();
}catch(Exception e){
e.printStackTrace();
}
return connection;
}
public static void close(Connection connection, Statement stmt, ResultSet rs){
try{ //关闭资源
if(rs!=null){
rs.close();
}
if(stmt!=null){
stmt.close();
}
if(connection!=null) {
connection.close();
}
}catch(Exception e){
e.printStackTrace();
}
}
}
//druid配置文件
#properties配置文件
driverClassName=com.mysql.cj.jdbc.Driver
url=jdbc:mysql://localhost:3306/test19?userSSL=false&serverTimezone=Asia/Shanghai
username=root
password=root