JDBC进阶
一、PreparedStatement
(一)介绍
1)概念
是Statement的子接口,表示预编译SQL语句对象
2)三大优点
1. 字符串不用拼接,使用方便
2.解决SQL注入的问题(登录验证)
SQL注入:通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意 的SQL命令
比如:在一个登录界面输入用户名和密码,如果用户名输入’or 1 = 1 可以实现免账号登录
3. 预编译:执行效率更高,速度更快
(二)使用
1.贾琏步骤一样
2.预编译,问号相当于占位符
String sql = "select * from java创建表 where username = ?";
//在拿到语句对象的时候就使用SQL
psta = con.prepareStatement(sql);
//所有占位符,需要给它添加相应的值
psta.setString(1, username);
3.执事步骤一样
二、获取主键
public void getKey(User user) {
Connection con = null;
PreparedStatement psta = null;
ResultSet rs = null;
try {
con = JDBCUtilPro.getCon();
String sql = "insert into java创建表 (username,password) values (?,?)";
psta = con.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS);
psta.setString(1, user.getUsername());
psta.setString(2, user.getPassword());
psta.execute();
//获取由于执行此Statement对象而创建所有自动生成的键
rs = psta.getGeneratedKeys();
while (rs.next()) {
System.out.println(rs.getInt(1));//getInt(1) 固定格式
}
三、事务
Transaction,简写为tx
(一)概念
一组逻辑操作单元,使数据从一种状态变换到另一种状态,是对一组操作,要么都成功,要么都失败(同生共死)
(二)四大特性ACID
A Atomic 原子性 不可分割,要成功都成功,失败退回原有状态
C Consistency 一致性 数据前后保持不变
I Isolation 隔离性 进程之间互不影响
D Durability 持久性 永久的保存数据
(三)操作
先定义开始一个事务,然后对数据作修改操作,这时如果提交(commit),这些修改就永久地保存下来,如果回退(rollback),数据库管理系统将放弃所有修改而回到开始事务时的状态
1、设置默认不提交 setAutoCommit(false);
2、操作完成,手动提交 commit();
3、失败回滚 rollback();
public void transfer(Account guo, Account gu,BigDecimal money) {
Connection con = null;
PreparedStatement psta = null;
try {
con = JDBCUtilPro.getCon();
//设置不自动提交事务
con.setAutoCommit(false);
String sql = "update account set money = ? where name = ?";
psta = con.prepareStatement(sql);
psta.setBigDecimal(1,balance(guo.getName()).subtract(money));
psta.setString(2, guo.getName());
psta.execute();
psta.setBigDecimal(1, balance(gu.getName()).add(money));
psta.setString(2, gu.getName());
psta.execute();
//设置为手动提交事务
con.commit();
} catch (Exception e) {
try {
//如果操作失败,事务回滚
con.rollback();
} catch (SQLException e1) {
e1.printStackTrace();
}
e.printStackTrace();
}finally {
JDBCUtilPro.closeIO(psta, con, null);
}
}
四、连接池
(一)概念
dataSource
通过连接池获得连接对象
(二)实现方式
- DBCP: Spring推荐的
- C3P0: Hibernate推荐的
- Druid:阿里推荐的
(三)通过BasicDataSourceFactory工厂拿到连接
public class DBCPUtilPro {
//拿到配置文件
public static Properties p = new Properties();
public static DataSource ds = null;
static{
try {
p.load(Thread.currentThread().getContextClassLoader().getResourceAsStream("jdbc.properties"));
//通过BasicDataSourceFactory工厂拿到连接
ds = BasicDataSourceFactory.createDataSource(p);
}catch (Exception e) {
e.printStackTrace();
}
}
// 拿到连接对象
public static Connection getCon() {
Connection con = null;
try {
con = ds.getConnection();
} catch (Exception e) {
e.printStackTrace();
}
return con;
}
注意事项:
在jdbc.properties里的属性名称必需要工厂的对应上
diverClassName = com.mysql.jdbc.Driver
url = jdbc:mysql://localhost:3306/mysqlday10.17
username = root
password = 123456
五、MySQL安全模式
(一)概念
设置安全参数:如果update语句,没有加where限制条件,不许改
(二)范围
只针对当前会话有效:SET (session) SQL_SAFE_UPDATES=1; 缺省session
只针对设置全局有效:SET global SQL_SAFE_UPDATES=1;