JDBC总结——JDBC工具类
程序员文章站
2022-05-19 11:57:25
...
文章目录
JDBC工具类
一、JDBC工具类概述
1、定义JDBC工具类的目的
每次使用JDBC的时候都要书写冗长的代码段,不符合复用的理念,于是要单独写一个类,将通用的JDBC操作写到一个类中,便于重复使用和精简代码。
2、封装的操作
1)properties配置文件 封装获取链接 释放资源提高代码复用性
2)类加载时加载驱动
3)ThreadLocal 控制事务
4)连接池 提高资源利用率
5)rowmapper封装 减少代码冗余
6)template封装 减少dao层代码冗余
二、JDBC工具类的封装
1、dbcp.properties
driverClassName=com.mysql.cj.jdbc.Driver
url=jdbc:mysql://localhost:3306/mybase?useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC&useSSL=false
username=root
password=123
initialSize=10
maxActive=50
maxIdle=20
minIdle=5
maxWait=60000
connectionProperties=useUnicode=true;characterEncoding=utf-8
defaultAutoCommit=true
defaultTransactionIsolation=READ_COMMITTED
2、JdbcUtil3.java
import java.io.*;
import java.sql.*;
import java.util.Properties;
import javax.sql.DataSource;
import org.apache.commons.dbcp.BasicDataSourceFactory;
/**
* 类说明:
* 用于加载驱动获取链接,然后返回结果集
*/
public class JdbcUtil3 {
//声明连接池
static DataSource pool = null;
//创建properties
static Properties pro = new Properties();
//创建ThreadLocal<Connection>,可以为同一个线程保存同一个连接,为不同的线程保存不同的连接。
private static ThreadLocal<Connection> tl = new ThreadLocal<Connection>();
//加载驱动
static{
InputStream is = null;
try{
is = JdbcUtil1.class.getResourceAsStream("/conf/dbcp.properties");
//加载文件
pro.load(is);
//Class.froName(pro.getProperty("driverClassName"));
//创建连接池
pool = BasicDataSourceFactory.createDataSource(pro);
}catch(Exception e){
e.printStackTrace();
}finally{
try {
is.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
//获取链接
public static Connection getConnection() throws Exception{
Connection conn = tl.get();
if(conn==null){
String url = pro.getProperty("url");
String user = pro.getProperty("username");
String password = pro.getProperty("password");
//从连接池中获取链接
//conn = DriverManager.getConnection(url, user, password);
conn = pool.getConnection();
//将链接保存到当前线程
tl.set(conn);
}
return conn;
}
//释放资源/关闭链接
public static void release(ResultSet rs,PreparedStatement pstm,Connection conn) throws Exception{
if(rs!=null){
rs.close();
}
if(pstm!=null){
pstm.close();
}
if(conn!=null){
conn.close();
tl.remove(); //将链接从当前线程移除
}
}
}
3、JdbcTemplate.java
import java.sql.*;
import java.util.*;
import rowmapper.RowMapper;
/**
* 类说明:
* 用于封装增删查改操作
*/
public class JdbcTemplate<T> {
static Connection conn = null;
static PreparedStatement pstm = null;
static ResultSet rs = null;
/*
* 查询方法
* 查询结果1条T queryForObject(sql,object..args,RowMapper rm)
* 查询结果多条List<T> queryForList(sql,object...args,RowMapper rm);
*/
public T queryForObject(String sql,RowMapper<T> rm,Object...args){
T t = null;
try {
conn = JdbcUtil3.getConnection();
pstm = conn.prepareStatement(sql);
if(args.length!=0){
for(int i=0;i<args.length;i++){
pstm.setObject(i+1, args[i]);
}
}
rs = pstm.executeQuery();
if(rs.next()){
t = rm.mappreRow(rs);
}
} catch (Exception e) {
// TODO Auto-generated catch block
System.out.println("数据库链接出现问题");
}finally{
try {
JdbcUtil3.release(rs, pstm, conn);
} catch (Exception e) {
// TODO Auto-generated catch block
System.out.println("释放资源出现问题");
}
}
return t;
}
//查询多条
public List<T> queryForList(String sql, RowMapper<T> rm, Object...args){
List<T> list = null;
try {
conn = JdbcUtil3.getConnection();
pstm = conn.prepareStatement(sql);
if(args.length!=0){
for(int i=0;i<args.length;i++){
pstm.setObject(i+1, args[i]);
}
}
rs = pstm.executeQuery();
list = new ArrayList();
while(rs.next()){
T t = rm.mappreRow(rs);
list.add(t);
}
} catch (Exception e) {
// TODO Auto-generated catch block
System.out.println("数据库链接出现问题");
}finally{
try {
JdbcUtil3.release(rs, pstm, conn);
} catch (Exception e) {
// TODO Auto-generated catch block
System.out.println("释放资源出现问题");
}
}
return list;
}
/*
* 操作方法
* void update(sql, object...args)
*/
//更改操作
public void update(String sql,Object...args){
try {
conn = JdbcUtil3.getConnection();
System.out.println("template:"+conn);
pstm = conn.prepareStatement(sql);
//args的长度如果不是0,说明有参数,有参数就说明sql是个半成品
if(args.length!=0){
for(int i=0;i<args.length;i++){
pstm.setObject(i+1, args[i]);
}
}
pstm.executeUpdate();
} catch (Exception e) {
System.out.println("数据库发生异常");
}finally{
try{
JdbcUtil3.release(null, pstm, conn);
} catch (Exception e){
System.out.println("释放资源出现问题");
}
}
}
}
上一篇: JS中时间按月份进行有效期判断