JDBC加强拓展
预编译SQL语句对象
PreparedStatement
概念
(1) Statement:静态的sql对象
-
字符串拼接
-
sql注入,安全问题
-
sql执行的时候才发送到数据库
(2) PreparedStatement:sql预编译对象
4. 创建PreparedStatement:就会把sql发送到mysql[效率更高]
- 解决Sql注入问题
(3) PreparedStatement:是Statement的一个子接口
-
继承关系:也会有Statement,方法和特点
-
子接口可以拓展父接口,有自己的特性…特有方法!
(4) 使用PreparedStatement
① 添加事务
② mysql有个叫SQL_SAFE_UPDATES的变量,为了数据库更新操作的安全性
1) 设置安全参数:如果update语句,没有加where限制条件,不许改!
a. SET SQL_SAFE_UPDATES=0; Mysql 设置[缺省session,当前查询窗口生效]
b. set global sql_safe_updates = 1; Mysql 设置[MySql全局生效]
(5) 拿到主键
Connection conn = JDBCUtilDataSource.getIns().getConn();
try {
// RETURN_GENERATED_KEYS 该常量指示生成的键应该可用于获取。
PreparedStatement ps = conn.prepareStatement("insert into account (name,money) values(?,?)",Statement.RETURN_GENERATED_KEYS);
ps.setString(1, a.getName());
ps.setDouble(2, a.getMoney());
ps.execute();
//得到返回的主键的集合
ResultSet rs = ps.getGeneratedKeys();
while(rs.next()){
System.out.println(rs.getLong(1));
}
JDBCUtilDataSource.getIns().close(null, ps, conn);
} catch (SQLException e) {
e.printStackTrace();
}
(6) PreparedStatement相较Statement使用上面的优势
① 字符串不用拼接
② 预编译:执行效率更高
③ 解决Sql注入的问题
事务
概念
在数据库中,所谓事务是指一组逻辑操作单元,使数据从一种状态变换到另一种状态。
简单理解:程序里面的一组操作,要不都成功,要不都失败;
innodb:支持事务 myisam:不支持事务
事务的操作:先定义开始一个事务,然后对数据作修改操作,这时如果提交(commit),这些修改就永久地保存下来,如果回退(rollback,rollback放在catch里面前面代码不成功时执行),数据库管理系统将放弃所作的所有修改而回到开始事务时的状态。
事务的ACID属性
原子性:指整个事务是不可以分割的工作单元(一组操作不可分割)
一致性:指数据库事务不能破坏关系数据的完整性以及业务逻辑上的一致性(数据前后需要一致)
隔离性:并发编程的时候,多个线程之间的操作不会相互影响
持久性:只要事务成功结束,就将内存中的数据持久化磁盘
处理事务两个动作
提交(commit):当整个事务中,所有的逻辑单元都正常执行成功。(在JDBC中<事务是默认提交的,必须先设置事务为手动提交(false))
---->提交事务。—数据已经提交,不能更改。
回滚(rollback):当整个事务中,有一个逻辑单元执行失败。 (抓取异常时放在catch里面)
---->回滚事务。撤销该事务中的所有操作—>恢复到最初的状态。
连接池
概念
连接池(connection)就是用来装连接对象的容器,用来维护和管理连接对象
简单理解:最开始的时候就创建一些连接对象放到连接池中,请求来了可以直接在连接池中获取连接 操作数据库,操作完成以后,释放连接回到连接池,等待下一次被请求使用
初始的时候:创建了一些连接,最小连接数
请求并发的时候:创建更多的连接,最大连接
优点:节约内存资源,维护连接对象的生命周期
常见连接池
dbcp(spring集成) druid(常用) c3p0
获取连接
//创建一个Properties对象
Properties prop = new Properties();
//读取Properties配置文件
prop.load(Thread.currentThread().getContextClassLoader().getResourceAsStream("db.properties"))
//通过BasicDataSource实现类创建连接池(实现DataSource接口)
DataSource ds = BasicDataSourceFactory.createDataSource(prop);
//获取Connection链接
Connection conn=ds.getConnection();
注:BasicDataSource类创建连接池,资源配置文件需严格按照相应命名规范书写
分类 | 属性 | 描述 |
---|---|---|
必须项 | driverClassName | 数据库驱动名称 |
必须项 | url | 数据库地址 |
必须项 | username | 用户名 |
必须项 | password | 密码 |
扩展项 | maxActive | 连接池最大连接数 |
扩展项 | maxIdle | 连接池最大空闲数 |
扩展项 | minIdle | 连接池最小空闲数 |
扩展项 | initialSize | 初始化连接池时连接数 |