系列文章目录
JDBC和方便使用的jar包
目录
系列文章目录
文章目录
一、JDBC
1.步骤
2.SQL注入
3.SQL注入解决(PreparedStatement)
4.批处理和事务控制
5.连接池
Druid连接池(德鲁伊)
6.封装为工具类
7.ThreadLocal 、小秘书
二、常用的jar包
1.Junit
2.dbutils
3. Lombok
三、分层思想
一、JDBC
JDBC(Java DataBase Connectivity)
Java数据库连接(技术) 也就是通过Java代码,连接到数据库,并可以使用SQL语句,对数据库进 行各种操作的技术。
JDBC是一种规范,他提供了一堆需要实现的接口,由不同的数据库厂商去实现JDBC接口提供jar包,这样就可以直接导入jar包使用实现类去进行与数据库的连接。
1.步骤
一共有六大步骤
注册驱动、获取数据库连接对象、获取数据库操作对象、执行sql语句(executeUpdate、executeQuery)、处理结果集、释放连接
对于结果集的处理(ResultSet)
next()方法:将光标移到下一行
getXXX(参数):获得指定列的数据,参数可以是数字也可以是列名的字符串
2.SQL注入
sql注入是一种常见的安全漏洞,利用用户输入的数据作为sql查询语句的一部分,从而改变了原始查询语句的意图,绕过身份验证进行恶意操作。
通过’ or这样去进行sql注入
select * from t_user where name='admin' and password='' or'1'='1'select * from t_user where name='' OR '1'='1'; -- andpassword='test'
3.SQL注入解决(PreparedStatement)
它是Statement的子接口
用PreparedStatement就可以解决sql注入,sql注入是根据sql语句的缺陷进行注入的
PreparedStatment可以进行对sql语句的预编译,然后可以多次使用相同的预编译语句执行不同的参数值
具体应用
使用数据库连接对象调用prepareStatement(String sql) 方法进行预编译,获得一个pstm对象
然后进行setXXX(int a ,XXX s) 进行给sql语句赋值,a代表的是sql语句第几个通配符,后面跟的是添加的数据
4.批处理和事务控制
批处理(Batch):一次操作中执行多条SQL语句,相比于一次执行一条SQL语 句,效率会提高很多。
执行批处理需要在url后加一步操作#url 最终效果private String url = "jdbc : mysql : //ip : port/ 数据库名 ?useServerPrepStmts = true";
默认情况下,在JDBC中执行的DML语句,所产生的事务,都是自动提交的。也 就是说,每执行一条DML语句,所产生的事务就会自动提交。 (也可以是设置回滚到哪里,打断点 SavePoint)
5.连接池
数据库连接池,在系统初始化时创建一定数量数据库连接对象,需要时直接从 池中取出一个空闲对象,用完后并不直接释放掉对象,而是再放到对象池中, 以便下一次对象请求可以直接复用。消除了对象创建和销毁所带来的延迟,从 而提高系统的性能。
常见的连接池:druid、C3P0、DBCP
Druid连接池(德鲁伊)
Druid连接池是阿里巴巴开源的数据库连接池项目 功能强大,性能优秀,是Java语言最好的数据库连接池之一。
Java中定义了一个数据源标准接口 javax.sql.DataSource ,通过它获取到 的数据库连接对象。再借助连接对象调用 close() 方法,不会关闭连接,而是 归还连接到连接池中
druid使用配置文件进行创建数据库连接池,并获得连接
使用properties工具类,调用load方法
DataSource dataSource = DruidDataSourceFactory . createDataSource ( properties );//利用德鲁伊连接池工厂创建连接池
6.封装为工具类
硬编码的方式使用JDBC连接四要素,进而获取数据库连接对象,扩展性差
在每个JDBC应用程序中都需要去加载配置文件获取数据库连接对象,代码重复
释放资源代码很类似,但过于繁琐,需要简化
为了简化代码使得代码变得优雅,封装了JdbcUtils
提供数据源对象,在静态代码块中进行连接池的创建
提供私有无参构造,提供静态的从数据库连接池中获取连接对象,
关闭资源的封装(可以在归还连接池中加一步设置自动提交的代码)
//JDBC 工具类public class JdbcUtils {// 数据源对象private static DataSource dataSource ;// 工具类加载时读取配置文件,获取数据源对象static {try {Properties properties = new Properties ();properties . load ( JdbcUtils . class . getClassLoader (). getResourceAsStream ( "druid.properties" ));dataSource = DruidDataSourceFactory . createDataSource ( properties );} catch ( Exception e ) {e . printStackTrace ();}}// 提供私有无参构造器private JdbcUtils () {}// 从数据库连接池中获取连接对象public static Connection getConnection () throws SQLException{return dataSource . getConnection ();}// 关闭资源public static void close ( ResultSet rs , Statement stmt ,Connection conn ) {if ( rs != null ) {try {rs . close ();} catch ( SQLException e ) {e . printStackTrace ();}}if ( stmt != null ) {try {stmt . close ();} catch ( SQLException e ) {e . printStackTrace ();}}if ( conn != null ) {try {conn . close ();} catch ( SQLException e ) {e . printStackTrace ();}}}// 关闭资源方法重载public static void close ( Statement stmt , Connection conn ) {close ( null , stmt , conn );}}
7.ThreadLocal 、小秘书
本地线程,一个用于向当前线程内存储数据的一个工具类,其本身不存储数据,只是操作当前线程内数据的工具类
特点:线程内数据共享,多线程之间数据隔离
对于一个线程上来讲,用的应该是同一个数据库的连接对象,而不是每一次去进行连接
这样就可以抽取出一个小秘书,利用本地线程的特点,小秘书从连接池拿一个conn对象放入到ThreadLocal中。
每次使用完记得要把ThreadLocal进行一次remove操作,否则会导致内存泄漏。
二、常用的jar包
1.Junit
2.dbutils
QueryRunner()有无参和有参的
无参需要自己维护,自己关闭
有参的参数传递连接池对象,DateSource,方法中就可以不传入conn对象
结果集的处理
3. Lombok
一些注解
@Data:用这个注解可以省去代码中大量的get()、 set()、 toString()等方法;
@Data : 注在类上,提供类的get、set、equals、hashCode、canEqual、toString方法
@AllArgsConstructor : 注在类上,提供类的全参构造
@NoArgsConstructor : 注在类上,提供类的无参构造
@Setter : 注在属性上,提供 set 方法
@Getter : 注在属性上,提供 get 方法
@EqualsAndHashCode : 注在类上,提供对应的 equals 和 hashCode 方法
@Log4j/@Slf4j : 注在类上,提供对应的 Logger 对象,变量名为 log