一、类图分析
我是的dbutils这个工具来实现的,先是用单例模式来创建jdbcutils类,使用的时候通过继承的方式来设计beanDao模板类。
二、代码实现
1、JDBCUtils.java
/**
* @author: GaoYang
* @Company http://www.geq2020.top
* @className: jdbcUtils.java
* @Description: TODO
*/
public class JDBCUtils {
// 创建当前类对象
private static JDBCUtils dbutils;
// 准备连接对象
private Connection conn;
// 准备连接属性
private String driver;
private String url;
private String userName;
private String passWord;
/**
*使用单例模式创建工具类对象
**/
// 1、私有化构造方法
private JDBCUtils() {
super();
}
// 2、创建实例化对象,添加双重校验锁,保障线程安全
public static JDBCUtils getDbUtils() {
if(dbutils == null) {
synchronized (JDBCUtils.class) {
if(dbutils == null) {
dbutils =new JDBCUtils();
}
}
}
return dbutils;
}
/**
* 创建连接对象,连接数据
*/
// 1、通过读取配置文件,获取并设置数据库连接属性(Properties是获取.properties文件里的数据流)
public void initFromProperties(Properties p) {
driver = p.getProperty("driver");
url = p.getProperty("url");
userName = p.getProperty("username");
passWord = p.getProperty("password");
try {
Class.forName(driver);
conn = DriverManager.getConnection
(url,userName,passWord);
} catch (Exception e) {
e.printStackTrace();
}
}
// 2、创建连接对象
public Connection getConn() {
System.out.println("utils"+this.conn);
return this.conn;
}
}
2、连接属性
driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/shop
username=root
password=123456
3、BeanDao.java
/**
* @author: GaoYang
* @Company http://www.geq2020.top
* @className: BeanDao.java
* @Description: TODO
*/
public class BeanDao<T> {
private static Connection conn;
QueryRunner qr = new QueryRunner();
public BeanDao(Connection conn) {
this.conn = conn;
}
// 返回数据集合(查询所有、模糊查询等)
public List<T> listQuery(String sql,Class<T> clazz,Object...objects) throws Exception{
return qr.query(conn,sql,new BeanListHandler<T>(clazz),objects);
}
// 返回单个实例
public T queryOne(String sql,Class<T> clazz,Object object) throws SQLException {
return qr.query(conn,sql,new BeanHandler<T>(clazz),object);
}
// 添加之后返回主键
public int addWithBackPK(String sql, Object...params) throws Exception {
PreparedStatement preparedStatement = conn.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS);
int i = 1;
for (Object obj : params) {
preparedStatement.setObject(i, obj);
i++;
}
preparedStatement.executeUpdate();
ResultSet generatedKeys = preparedStatement.getGeneratedKeys();
long generateKey = 0;
while (generatedKeys.next()) {
generateKey = generatedKeys.getLong(1);
}
return (int)generateKey;
}
// 更新数据
public int update(String sql,Object...objects) throws SQLException {
return qr.update(conn,sql,objects);
}
// 批量更新
public int updateBatch(String sql, Object[][] objects) throws SQLException {
return qr.batch(conn, sql,objects).length;
}
// 释放资源
public void closeConn() throws SQLException {
conn.close();
}
}
4、UersDao.java
/**
* @author: GaoYang
* @Company http://www.geq2020.top
* @className: UserDao.java
* @Description: TODO
*/
public class UserDao extends BeanDao<User>{
/**
* 继承BeanDao类
* @param conn
*/
public UserDao(Connection conn) {
super(conn);
}
}
5、测试类
/**
* @author: GaoYang
* @Company http://www.geq2020.top
* @className: test.java
* @Description: TODO
*/
public class test {
private static Connection conn;
private static UserDao ud = null;
public static void main(String[] args) {
try {
System.out.println("开始加载数据库配置资源...");
// 读取properties配置文件的配置信息getResourceAsStream是一个输入流
InputStream is = initServlet.class.getResourceAsStream("/db.properties");
// 创建properties对象,用来存出获取到流
Properties pro = new Properties();
// 将流封装到properties对象
pro.load(is);
// 创建JDBC工具类对象
JDBCUtils jdbcUtils = JDBCUtils.getDbUtils();
// 加载资源,并实例化Connection对象
jdbcUtils.initFromProperties(pro);
System.out.println("数据库配置资源加载完成...");
} catch (IOException e) {
e.printStackTrace();
}
// 获取Conn数据库连接对象(通过单例方式)
conn = JDBCUtils.getDbUtils().getConn();
// 将连接对象赋值给
ud = new UserDao(conn);
// 准备sql
String sql = "select * from user";
// 创建返回值对象
List<User> list = null;
try {
// 接受结果集
list = ud.listQuery(sql, User.class);
} catch (Exception e) {
e.printStackTrace();
}
// 遍历结果级
if(list != null) {
for(User u:list) {
System.out.println(u.toString());
}
}
}
}
三、应用到web项目中
在web项目中使用这种方式,我们可以在服务器初始化的时候,通过重写Servlet初始化方法init(),来创建Connection对象,这样我们就可以在服务器开启后就实现了Connetion对象的创建。
InitServlet
@WebServlet("/init.do")
public class initServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* @see
*/
public initServlet() {
super();
}
/**
* 当服务器初始化的时候,进行开启连接数据库
*/
@Override
public void init() throws ServletException {
try {
super.init();
System.out.println("开始加载数据库配置资源...");
// 读取properties配置文件的配置信息getResourceAsStream是一个输入流
InputStream is = initServlet.class.getResourceAsStream("db.properties");
// 创建properties对象,用来存出获取到流
Properties pro = new Properties();
// 将流封装到properties对象
pro.load(is);
// 创建JDBC工具类对象
JDBCUtils jdbcUtils = JDBCUtils.getDbUtils();
// 去创建了对象
jdbcUtils.initFromProperties(pro);
System.out.println("数据库配置资源加载完成...");
} catch (IOException e) {
e.printStackTrace();
}
}
}
这样我们就将一个较为灵活的工具类给实现了!如有更好的方法,欢迎指教!