JDBC进阶

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

通过连接池获得连接对象

(二)实现方式

  1. DBCP: Spring推荐的
  2. C3P0: Hibernate推荐的
  3. 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;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值