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();
		}
    }

}

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

猜你喜欢

转载自blog.csdn.net/weixin_44676935/article/details/108418087
今日推荐