JDBC学习
基础入门 (连接数据库的基本步骤)
-
导入驱动
jar
包 -->mysql-connercytor-java-5.1.37-bin.jar
-
注册驱动
// 通过 Class.forName("com.mysql.jdbc.Driver")
Class.forName("com.mysql.jdbc.Driver");
- 获取 数据库的连接对象 -->
Connection
// 通过 DriverManager.getConnection() 进行获取
Connection connection=DriverManager.getConnection("jdbc:mysql://localhost:3306/db3?useSSL=false","用户名","密码");
- 定义
sql
语句
String sql="sql语句体";
- 获取执行
sql
语句的对象 -->Statement
// 数据库连接对象.Statement
connection.Statement();
- 执行
sql
语句
// 比如这里是更新数据库的信息
connection.Statement().executeUpdate(sql);
- 关闭开启的资源
// 如:
connection.close();
详解各个对象
DriverManager
驱动管理对象
功能
- 注册驱动
// 注册与给定的驱动程 DriverManager
static void registerDriver(Driver driver);
// 注册驱动
Class.forName("com.mysql.jdbc.Driver");
// 通过查看源码,在 com.mysql.jdbc.Driver 类中存在静态代码块
static {
try{
java.sql.DriverManager.registerDriver(new Driver());
}catch(SQLException E){
throw new RuntimeException("Can't register driver!");
}
}
- 获取数据库连接
// 方法 ==> 是一个静态方法
static Connection getConnection(String url, String user, String password);
/*参数:
url :指定连接的路径
语法: jdbc:mysql://ip地址(域名):端口号/数据库名称
例子: jdbc:mysql://localhost:3306/db3
细节:如果连接的是本机mysql服务器,并且mysql服务默认端口是3306,则ur1可以简写为: jdbc :mysql:///数据库名称
user:用户名
password :密码
*/
Connection
数据库连接对象
功能
- 获取执行
sql
的对象
// 创建用于向数据库发送SQL语句的一 Statement 对象。
Statement createStatement();
// 创建参数化的SQL语句发送到数据库的 PreparedStatement 对象
PreparedStatement prepareStatement(String sql)
- 管理事务
// 开启事务 ==> 调用该方法设置参数为 false 即开启事务
void setAutoCommit(boolean autoCommit);
// 提交事务 ==> 使自上次提交/回滚永久释放任何数据库锁的 Connection对象目前持有的所有更改。
commit();
// 回滚事务 ==> 撤消所有更改在当前事务并释放任何数据库锁的 Connection对象目前持有。
rollback();
Statement
执行
sql
的对象
功能
- 执行
sql
语句
// 可以执行任何sql语句
boolean execute(String sql);
// 执行给定的SQL语句,这可能是一个 INSERT, UPDATE,或 DELETE语句或SQL语句不返回值,例如SQL DDL语句。
int executeUpdate(String sql); // 返回值是影响的行数, 可以通过影响的行数 判断增删改时候执行成功
// 执行给定的SQL语句,返回一个 ResultSet对象
ResultSet executeQuery(String sql) // 执行的 DQL(select) 语句
ResultSet
结果集对象
功能
// 从当前位置移动光标向前一行。
// ==> 游标向下移动一行,判断当前行是否是最后一行末尾(是否有数据), 如果是,则返回false, 如果不是则返回true
boolean next()
// 获取数据
getXxx(参数);
/*
Xxx: 表示获取数据的数据类型
参数:
1. int :代表列的编号,从1开始
如: getString(1)
2. string: 代表列名称。如: getDouble( "balance")
*/
PreparedStatement
执行
sql
的对象 (Statement
的子接口)
1. SQL注入问题:在拼接sq1时,有一些sql的特殊关键字参与字符串的拼接。会造成安全性问题
1.输入用户随便,输入密码: a' or 'a'
2. sql语句为 : select * from user where username = ' fhdsjkf' and password = 'a' or 'a'= 'a'
2.解决sq1注入问题:使用Preparedstatement对象来解决
3.预编译的SQL :参数使用?作为占位符
4.步骤:
1,导入驱动jar包mysql-connector-java-5.1.37-bin. jar
2.注册驱动
3.获取数据库连接对象Connection
4.定义sql
注意: sql的参数使用?作为占位符。如: select * from user where username = ? and password = ?;
5.获取执行sql语句的对象 Preparedstatement ==> Connection. prepareStatement(String sq1)
6.给 ? 赋值:
方法: setXxx(参数1,参数2)
参数1: ? 的位置编号从1开始
参数2: ? 的值
7.执行sql, 接受返回结果,不需要传递sql语句
8.处理结果
9.释放资源
5.注意:后期都会使用Preparedstatement来完成增删改查的所有操作
1.可以防止SQL注入
2.效率更高
JDBC控制事务
1.事务:一个包含多个步骤的业务操作。如果这个业务操作被事务管理,则这多个步骤要么同时成功,要么同时失败。
2.操作:
1.开启事务
2.提交事务
3.回滚事务
3.使用Connection对象来管理事务
开启事务: setAutoCommit(boolean autoCommit) : 调用该方法设置参数为false,即开启事务
在执行sql之前开启事务
提交事务: commit()
当所有sql语句都执行完提交事务
回滚事务: rollback()
在catch中回滚事务
数据库连接池
概念
- 其实就是一个容器 (集合), 存放数据库连接的容器。
- 当系统初始化好后,容器被创建,容器中会申请一些连接对象, 当用户来访问数据库时,从容器中获取连接对象,用户访问完之后,会将连接对象归还给数据库连接池
好处
- 节约资源
- 用户访问高效
实现
1.标准接口: Datasource ==> javax.sql包下的
1.方法:
获取连接: getConnection()
归还连接:如果连接对象Conection是从连接池中获取的,那么调用connection.close()方法, 则不会再关闭连接了。而是归还连接
2. 一般我们不去实现它,有数据库厂商来实现
1. C3P0 :数据库连接池技术
2. Druid :数据库连接池实现技术,由阿里巴巴提供的
C3P0 : 数据库连接池技术
步骤:
1.导入jar包(两个) c3p0-0.9.5.2.jar mchange-commons, java-0.2.12.jar 不要忘记导入驱动jar包
2.定义配文件:
名称: c3p0.properties 或者c3p0-config.xml
路径:直接将文件放在src目录下即可。
3.创建核心对象数据库连接池对象ComboPooledDataSource
4.获取连接: getConnection
Druid : 数据库连接池实现技术,由阿里巴巴提供的
1.步骤:
1.导入jar包druid-1.0.9.jar
2.定义配置文件:
利用Properties类进行加载配置文件
定义的配置文件可以叫任意名称,可以放在任意目录下
3.获取数据库连接池对象:通过工厂来获取 DruidDataSourceFactory.createDataSource(Properties properties)
4.获取连接: getConnection
2.定义工具类
1.定义一个类 JDBCUtils
2.提供静态代码块加载配置文件,初始化连接池对象
3.提供方法
1.获取连接方法:通过数据库连接池获取连接
2. 释放资源
3. 获取连接池的方法
Spring JDBC
JDBC Template
Spring框架对JDBC的简单封装。提供了一个JDBCTemplate对象简化JDBC的开发
步骤:
1. 导入jar包
2. 创建JdbcTemplate对象。 依赖于数据源DataSource
如: JdbcTemplate template = new JdbcTemplate(DataSource);
3.调用JdbcTemplate的方法来完成CRUD的操作
update():执行DML语句。增、删、改语句
queryForMap():查询结果将结果集封装为map集合,将列名作为key,将值作为value 将这条记录封装为一个Map集合
注意:这个方法查询的结果集长度只能是1
queryForlist():查询结果将结果集封装为list集合
注意:将每一条记录封装为一个Map集合,再将Map集合装载到List集合中
query():查询结果,将结果封装为JavaBean对象
query的参数: RowMapper
一般我们使用BeanPropertyRowMapper实现类。 可以完成数据到JavaBean的自动封装
比如: 数据库连接池对象.query(sql语句, new BeanPropertyRowMapper<类型>(类型.class))
queryForobject :查询结果,将结果封装为对象
tips: 一般用于聚合函数的查询