JDBC知识点
程序员文章站
2022-05-29 15:58:48
...
JDBC
- 概念:Java DataBase Connectivity ( Java 数据库连接 ) --> Java语言操作数据库
- 本质:是官方(SUN公司)定义的一套操作所有关系型数据库的规则,即接口。各个数据库厂商去实现这套接口,提供数据库驱动 jar 包,我们可以使用这套接口(JDBC)编程,真正执行的代码是驱动 jar 包中的实现类
快速入门
- 步骤
- 导入驱动 jar 包
- 复制 mysql-connector-java.jar 到项目的 libs 目录下
- 右键 libs --> add as Library
- 注册驱动
- 获取数据库连接对象 Connection
- 定义 sql
- 获取执行 sql 语句的对象 Statement
- 执行 sql,接收返回结果
- 处理结果
- 释放资源
- 导入驱动 jar 包
//1.注册驱动
Class.forName("com.mysql.jdbc.Driver");
//2.获取数据库对象
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/test","root","root1901");
//3.定义 sql 语句
String sql = "update laptop set speed = 130 where model = 2001";
//4.获取执行 sql 的对象 Statement
Statement stmt = conn.createStatement();
//5.执行 sql
int count = stmt.executeUpdate(sql);
//6.处理结果
System.out.println(count);
//7.释放资源
stmt.close();
conn.close();
各个对象详解
DriverManager(驱动管理对象)
- 注册驱动:告诉程序该使用哪一个数据库驱动 jar
-
static void registerDriver(Driver driver)
:注册与给定的驱动程序 DriverManager - 使用方法:
Class.forName("com.mysql.jdbc.Driver");
- 注意:mysql 5 之后的 jar 包可以省略注册驱动的步骤
-
- 获取数据库连接
- 方法:
static Connection getConnection(String url,String user,String password);
- 参数
- Url:指定连接的路径
- 语法:
jdbc:mysql://ip地址(域名):端口号/数据库名称
- 例子:
jdbc:mysql://localhost:3306:db1
- 细节:如果连接的是本机的 mysql 服务器,并且 mysql 服务端默认端口是 3306,则 url 可以简写为
jdbc:mysql:///数据库名称
- 语法:
- user:用户名
- password:密码
- 实例:
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/test","root","root");
- Url:指定连接的路径
- 方法:
Connection(数据库连接对象)
- 功能
- 获取执行 sql 的对象
Statement createStatement()
PreparedStatement prepareStatement(String sql)
- 管理事务
- 开启事务:
setAutoCommit(boolean autoCommit)
:调用该方法设置参数为 false,即开启事务 - 提交事务:
commit()
- 回滚事务:
rollback()
- 开启事务:
- 获取执行 sql 的对象
Statement(执行 sql 的对象)
- 执行 sql
-
boolean execute(String sql)
:可以执行任意的 sql (了解即可) -
int executeUpdate(String sql)
:执行 DML(insert、update、delete) 语句、DDL(create、alter、drop) 语句 -
ResultSet executeQuery(String sql)
:执行 DQL(select) 语句
-
ResultSet(结果集对象,封装查询结果)
- next():游标向下移动一行(mysql数据库的下一行),判断当前行是否是最后一行末尾(如果是返回false,如果不是返回true)
- getXxx(参数):获取数据
- Xxx:代表数据类型
- 如:int getInt(), String getString()
- 参数:
- Int:代表列的编号,从1开始。如:getString(1)
- String:代表列的名称。如:getDouble(“salary”);
- Xxx:代表数据类型
PrepareStatement(执行 sql 的对象)
- SQL注入问题:在拼接 sql 时,有一些 sql 的特殊关键字参与字符串的拼接。会造成安全性问题
- 解决 sql 注入问题:使用 PrepareStatement 对象来解决
- 预编译的 SQL:参数使用 ? 作为占位符
- 步骤
- 导入驱动 jar 包
- 注册驱动
- 获取数据库连接对象 Connection
- 定义 sql
- 注意:sql的参数使用 ? 作为占位符。如:
select * from user where username = ? and password = ?;
- 注意:sql的参数使用 ? 作为占位符。如:
- 获取执行 sql 语句的对象 PrepareStatement Connection.prepareStatement(String sql)
- 给 ? 赋值
- 方法:
setXxx(参数1,参数2)
- 参数1:? 的位置,编号从1开始
- 参数2:? 的值
- 方法:
- 执行 sql,接收返回结果
- 处理结果
- 释放资源
-
注意:后期都会使用 PrepareStatement 来完成增删改查的所有操作
- 可以防止 SQL 注入
- 效率更高
抽取JDBC工具类:JDBCUtils
JDBC控制事务
- 事务:一个包含多个步骤的业务操作。如果这个业务操作被事务管理,则这多个步骤要么同时成功,要么同时失败。
- 使用 Connection 对象来管理事务
- 开启事务:
setAutoCommit(boolean autoCommit)
:调用该方法设置参数为 false,即开启事务- 在执行 sql 之前开启事务
- 提交事务:
commit()
- 当所有 sql 都执行完提交事务
- 回滚事务:
rollback()
- 在 catch 中回滚事务
- 开启事务:
数据库连接池
- 概念:其实就是一个容器(集合),存放数据库连接的容器
- 当系统初始化好后,容器被创建,容器中会申请一些连接对象,当用户来访问数据库时,从容器中获取连接对象,用户访问完之后,会将连接对象归还给容器
- 好处
- 节约资源
- 用户访问高效
- 实现
- 标准接口:DataSource javax.sql包下的
- 方法:获取连接:
getConnection()
- 归还连接:如果连接对象 Connection 是从连接池中获取的,那么调用 Connection.close()方法,则不会再关闭连接了,而是归还连接
- 方法:获取连接:
- 一般我们不去实现它,由数据库厂商实现
- C3P0:数据库连接池技术
- Druid:数据库连接池实现技术,由阿里巴巴提供
- 标准接口:DataSource javax.sql包下的
C3P0:数据库连接池技术
- 步骤
- 导入 jar 包(两个):c3p0.jar 和 machange-commons-java.jar(不要忘记导入数据库驱动 jar 包)
- 定义配置文件:
- 名称:c3p0.properties 或者 c3p0-config.xml
- 路径:直接将文件放在 src 目录下即可
- 创建核心对象:数据库连接池对象 CombpPooledDataSource
- 获取连接:getConnection
//1.创建数据库连接池对象(使用默认配置)
DataSource ds = new ComboPooledDataSource();
//1.1创建数据库连接池对象(使用指定配置)
DataSource ds1 = new ComboPooledDataSource("otherc3p0");
//2.获取连接对象
Connection conn = ds.getConnection();
Druid:数据库连接池实现技术
- 步骤
- 导入 jar 包:druid.jar
- 定义配置文件
- 是 properties 形式的
- 可以叫任意名称,可以放在任意目录下
- 获取数据库连接池对象:通过工厂来获取 DruidDataSourceFactory
//1.导入 jar 包
//2.定义配置文件
//3.加载配置文件
Properties pro = new Properties();
InputStream is =DruidDemo.class.getClassLoader().getResourceAsStream("druid.properties");
pro.load(is);
//4.获取连接池对象
DataSource ds = DruidDataSourceFactory.createDataSource(pro);
//5.获取连接
Connection conn = ds.getConnection();
- 定义工具类
- 定义一个类 JDBCUtils
- 提供静态代码块加载配置文件,初始化连接池对象
- 提供方法
- 获取连接方法:通过数据库连接池获取连接
- 释放资源
- 获取连接池的方法
public class JDBCUtils {
private static DataSource ds;
static {
try{
//1.加载配置文件
Properties pro = new Properties();
pro.load(JDBCUtils.class.getClassLoader().getResourceAsStream("druid.properties"));
//2.获取 DataSource
ds = DruidDataSourceFactory.createDataSource(pro);
} catch (IOException e){
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
}
//获取连接
public static Connection getConnection() throws SQLException {
return ds.getConnection();
}
//释放资源
public static void close(Statement stmt,Connection conn){
if(stmt != null){
try{
stmt.close();
} catch (SQLException e){
e.printStackTrace();
}
}
if(conn != null){
try{
conn.close(); //归还连接
} catch (SQLException e){
e.printStackTrace();
}
}
}
public static void close(ResultSet rs, Statement stmt,Connection conn){
if(rs != null){
try{
rs.close();
} catch (SQLException e){
e.printStackTrace();
}
}
if(stmt != null){
try{
stmt.close();
} catch (SQLException e){
e.printStackTrace();
}
}
if(conn != null){
try{
conn.close(); //归还连接
} catch (SQLException e){
e.printStackTrace();
}
}
}
//获取连接池的方法
public static DataSource getDataSource(){
return ds;
}
}
Spring JDBC
- Spring 框架对 JDBC 的简单封装。提供了一个 JDBCTemplate 对象简化 JDBC 的开发
- 步骤
- 导入 jar 包
- 创建 JdbcTemplate 对象。依赖于数据源 DataSource
- JdbcTemplate template = new JdbcTemplate(ds);
- 调用 JdbcTemplate 的方法来完成 CRUD 操作
- update():执行DML语句:增、删、改、查语句
-
queryForMap():查询结果将结果集封装为 map 集合(将列名作为key,将值作为value,只能将一条记录封装为一个map集合)
- 注意:这个方法查询的结果集长度只能是1
-
queryForList():查询结果将结果集封装为 list 集合
- 注意:将每一条记录封装为一个Map集合,再将Map集合装载到List集合中
-
query():查询结果,将结果封装为 JavaBean 对象
- query的参数:RowMapper
- 一般我们使用 BeanPropertyRowMapper 实现类。可以完成数据到 JavaBean 的自动封装
new BeanPropertyRowMapper<类型>(类型.class)
- query的参数:RowMapper
-
queryForObject():查询结果,将结果封装为对象
- 一般用于聚合函数的查询
下一篇: 数据库定义语言