JDBC加强拓展

JDBC加强拓展

预编译SQL语句对象

PreparedStatement
概念

(1) Statement:静态的sql对象

  1. 字符串拼接

  2. sql注入,安全问题

  3. sql执行的时候才发送到数据库

(2) PreparedStatement:sql预编译对象
4. 创建PreparedStatement:就会把sql发送到mysql[效率更高]

  1. 解决Sql注入问题

(3) PreparedStatement:是Statement的一个子接口

  1. 继承关系:也会有Statement,方法和特点

  2. 子接口可以拓展父接口,有自己的特性…特有方法!

(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初始化连接池时连接数
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值