JDBC和一下重要的jar包,分层结构

系列文章目录

JDBC和方便使用的jar包 

一、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'; -- and
password='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

三、分层思想

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值