1.预编译对象PreparedStatement
1.java.sql.PreparedStatement:预编译的SQL语句的对象
(1)通过连接获取获取预编译对象的时候,将参数化的sql语句发送到数据库并保存到编译对象中:PreparedStatement preparedStatement(String sql) throws SQLexceotion;
(2)参数化的sql:insert into 表名(字段列表) values(?,?...)
(3)给占位符赋值:void setXXX(占位符序号,实际参数);
(4)执行方法:
ResultSet executeQuery():执行查询语句的方法
int executeUpdate():执行增删改的方法
2.分别使用Statement 和 PreparedStatement 模拟登录操作
1.Statement模拟登录
产生问题:SQL注入
Statement执行静态sql语句时候,由于存在字符串拼接行为.造成SQL注入
2.PreparedStatement
(1)能够防止SQL注入
(2)比Statement执行效率高
3.两者区别:
Statement对象:执行静态sql语句,存在硬编码行为(sql语句存在字符串拼接行为,会出现sql注入)
执行效率,相对较低,每次需要将sql语句发送
PreparedStatement对象:执行参数化的sql语句,将写好的参数化的sql发送到数据库,存储在预编译对象中,通过预编译对象给占位符赋值,可以赋值多次
代码:JDBC.lq.Statement_register/PreparedStatement_register
3.JDBC操作数据库,使用预编译对象:查询所有数据,增删改,查询单个数据
4.JDBC管理事务
1.将整个业务看成一个整体,需要使用Transaction事务管理
java.sql.Connection
2.方法:
(1)自动提交模式:void setAutoCommit(boolean autoCommit) throws SQLException
参数为true:表示自动提交模式
false:禁用自动提交
(2)事务回滚:void rollback() throws SQLException:撤消之前所有操作,回滚到操作之前的状态
(3)提交事务:void commit() throws SQLException:将上次提交或者回滚之后所作的所有更改都将永久性
代码:JDBC.com.lq.JDBC_Contral_Transqction
5.数据库连接池
1.连接池:创建一些固定的可重用的连接对象,当使用完连接对象之后不会将对象真正释放,而是归还到连接池,等待下一次去使用
2.数据库连接池有很多种:
c3p0--->两种方式:
方式一:src下面配置文件,名称必须是c3p0-config.xml
方式二:src下面提供c3p0.properties
dbcp:
druid:功能强大,不仅仅作为连接池,而且提供SQL Parser
3.sun提供了一个接口:java.sql.DataSource代表物理数据源的工厂,代替传统DriverManager类实现数据库的连接
4.使用步骤
(1)导入druid-1.1.10.jar包:仅仅是用来提供连接池作用的,依旧需要导入mysql驱动包,junit的jar包以及依赖包
(2)准备好德鲁伊配置文件
jdbc.properties/druid.properties(见名知意)
url=jdbc:mysql://localhost:3306/选择的数据库
username=root
password=123456
initialSize=5
maxActive=10最大连接数量
minIdle=3
DruidDataSource设置很多连接池参数:setXXX(参数值)
关联源码:
com.alibaba.druid.pool.DruidDataSource
public class DruidDataSource extends 父类 implements java.sql.DataSource
(3)获取连接对象的方法:DruidDataSource实现了DataSource的Connection
借助于DruidDataSourceFactory工厂类
public static DataSource createDataSource(Properties properties),底层使用createDataSource(Map map)
代码:JDBC.com.lq.Druid
6.模拟真实场景–JdbcUtils优化
代码:JDBC.com.JdbcUtils
public class ThreadLocal<T>extends Object:这个类提供线程局部变量。 这些变量与其正常的对应方式不同,因为访问一个的每个线程(通过其get或set方法)都有自己独立初始化的变量副本。
每个线程使用自己的Connection
ThreadLocal<Connection> threadLocal = new ThreadLocal<>();
方法:
get():获取自己的连接对象
set(Connection connection):绑定自己的连接对象
remove():将连接对象解放
7.Apache提供的开源工具类
Common-dbtuls就是针对原生jdbc的操作进行封装
步骤:
(1)导入connom-dbutils-1.7.jar
(2)操作数据库--->创建QueryRunner对象
public QueryRunner():手动提交模式
public QueryRunner(DataSource dataSource):参数为数据源,自动提交模式
(3)准备好sql语句
(4)QueryRunner对象执行sql语句
针对添加,删除,修改的sql语句通用的方式
public int update(String sql,Object...params)
参数一:sql语句
参数二:给占位符赋值
针对查询的sql语句通用的查询方法
public <T> T query(String sql,ResultSetHandler<T> rsh,Object...params)
参数一:查询的sql语句
参数二:接口
ResultSetHandler:针对查询的结果集的数据表的处理
子实现类:
(1)BeanListHandler<T>:将查询到的每一条记录封装到T中,然后将多条记录封装到List<T>集合中
public BeanListHandler(Class<? extends T> type) :参数为存储的类型的字节码文件对象
(2)BeanHandler<T>:将查询的某一条记录封装到T中,返回就是当前T
(3)ScalarHandle<T>:查询单行单列数据封装到Object中
参数三:带条件的实际参数
代码:JDBC.com.JdbcUtils_pool
8.ThreadLocal类
1.jdk提供的这个类,每个线程都有自己的连接对象
public void set(T value):将指定的连接对象绑定到当前线程中
public T get():从线程中获取连接对象
public void remove():将连接对象移除
代码:JDBC.com.JdbcUtils