JDBC工具类应该咋写?这是我的写法!

Posted GaoYang-笔迹

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JDBC工具类应该咋写?这是我的写法!相关的知识,希望对你有一定的参考价值。

一、类图分析

我是的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();
		
    


这样我们就将一个较为灵活的工具类给实现了!如有更好的方法,欢迎指教!

以上是关于JDBC工具类应该咋写?这是我的写法!的主要内容,如果未能解决你的问题,请参考以下文章

java JDBC编程学习笔记

Java 中封装JDBC连接到JDBCUtils工具类的详解

Java 中封装JDBC连接到JDBCUtils工具类的详解

单例模式你应该知道的几种写法

数据库连接的写法

JDBC连接池[关闭]