数据库Dao层封装减少代码冗余

1、定义DaseDao属性

 	private Connection conn = null;
    private PreparedStatement ps = null;
    private ResultSet rs = null;

2、封装增删改方法

    /**
     * 更新方法
     * @param sql 修改sql语句
     * @param objects 问号表达式的实例
     * @return 更新结果(失败为-1)
     */
    public int update(String sql,Object... objects){
        try {
            conn = JDBCUtils.getConnection();
            ps = conn.prepareStatement(sql);
            if (objects != null  && objects.length != 0){
                for (int i = 0; i < objects.length; i++) {
                    ps.setObject(i+1, objects[i]);
                }
            }
            return ps.executeUpdate();
        } catch (SQLException e) {
            e.printStackTrace();
        }finally {
            JDBCUtils.close(conn, ps);
        }
        return -1;
    }

3.1、封装查询方法,需要用到反射和泛型,返回一个list集合

  /**
     * 查询
     * @param sql 查询sql语句
     * @param objects 问号表达式的实例
     * @return 执行结果(list集合)
     */
    public List<T> query(String sql,Class<T> clazz,Object... objects){
        List<T> list = new ArrayList<>();
        try {
            conn = JDBCUtils.getConnection();
            ps = conn.prepareStatement(sql);
            //获取?表达式完整值
            if (objects != null && objects.length != 0){
                for (int i = 0; i < objects.length; i++) {
                    ps.setObject(i+1, objects[i]);
                }
            }
            //执行sql,获得结果集
            rs = ps.executeQuery();
            //ResultSetMetaData类完成查询结果和查询结果中各种列的信息
            ResultSetMetaData metaData = rs.getMetaData();
            //获取查询到的列的数量
            int columnCount = metaData.getColumnCount();
            while (rs.next()){
                T t = clazz.getConstructor().newInstance();//反射获取类的实例
                for (int i = 0; i < columnCount; i++) {
                    //获取db列名
                    String columnName = metaData.getColumnName(i + 1);
                    //反射获取类的属性
                    Field field = clazz.getDeclaredField(columnName);
                    //允许暴力获取
                    field.setAccessible(true);
                    //给类的属性赋值
                    setFieldValue(field,t,i,rs);
                }
                list.add(t);
            }
            return list;
        } catch (Exception e) {
            e.printStackTrace();
        }finally {
            JDBCUtils.close(conn, ps, rs);
        }
        return null;
    }

3.2、setFiledValue方法代码:这里需要判断属性的类型,可以根据需要自由增删

   private void setFieldValue(Field field, T t, int i, ResultSet rs) throws IllegalAccessException, SQLException {
        //判断属性的类型,符相应的值
        String typeName = field.getType().getName();
        if (typeName.equals(int.class.getName()) || typeName.equals(Integer.class.getName())){
            field.set(t, rs.getInt(i+1));
        }else if (typeName.equals(boolean.class.getName()) || typeName.equals(Boolean.class.getName())){
            field.set(t,rs.getBoolean(i+1));
        }else if (typeName.equals(String.class.getName())){
            field.set(t,rs.getString(i+1));
        }else if (typeName.equals(double.class.getName()) || typeName.equals(Double.class.getName())){
            field.set(t,rs.getDouble(i+1));
        }else if (typeName.equals(char.class.getName()) || typeName.equals(Character.class.getName())){
            field.set(t,(char)rs.getObject(i+1));
        }else if (typeName.equals(Date.class.getName())){
            field.set(t,rs.getDate(i+1));
        }else if (typeName.equals(long.class.getName()) || typeName.equals(Long.class.getName())){
            field.set(t,rs.getLong(i+1));
        }else {
            field.set(t, rs.getObject(i+1));
        }
    }

4、封装count方法,用于获取查询总条数,便于做分页

/**
     * 获取查询条数
     * @param sql 查询sql语句
     * @param objects 问号表达式的实例
     * @return 查询条数
     */
    public long queryCount(String sql,Object... objects){
        try {
            conn = JDBCUtils.getConnection();
            ps = conn.prepareStatement(sql);
            if (objects != null  && objects.length != 0){
                for (int i = 0; i < objects.length; i++) {
                    ps.setObject(i+1, objects[i]);
                }
            }
            ResultSet rs = ps.executeQuery();
            if (rs.last()){
                return rs.getRow();
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }finally {
            JDBCUtils.close(conn, ps, rs);
        }
        return -1L;
    }

工具:
1、druid的工具类:

package com.xmcc.util;

import com.alibaba.druid.pool.DruidDataSourceFactory;

import javax.sql.DataSource;
import java.io.IOException;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;

/*
	1. 声明静态数据源成员变量
	2. 创建连接池对象
	3. 定义公有的得到数据源的方法
	4. 定义得到连接对象的方法
	5. 定义关闭资源的方法
 */
public class JDBCUtils {
	// 1.	声明静态数据源成员变量
	private static DataSource ds;

	// 2. 创建连接池对象
	static {
		// 加载配置文件中的数据
		InputStream is = JDBCUtils.class.getClassLoader().getResourceAsStream("druid.properties");
		Properties pp = new Properties();
		try {
			pp.load(is);
			// 创建连接池,使用配置文件中的参数
			ds = DruidDataSourceFactory.createDataSource(pp);
		} catch (IOException e) {
			e.printStackTrace();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	// 3. 定义公有的得到数据源的方法
	public static DataSource getDataSource() {
		return ds;
	}

	// 4. 定义得到连接对象的方法
	public static Connection getConnection() throws SQLException {
		return ds.getConnection();
	}

	// 5.定义关闭资源的方法
	public static void close(Connection conn, Statement stmt, ResultSet rs) {
		if (rs != null) {
			try {
				rs.close();
			} catch (SQLException e) {}
		}

		if (stmt != null) {
			try {
				stmt.close();
			} catch (SQLException e) {}
		}

		if (conn != null) {
			try {
				conn.close();
			} catch (SQLException e) {}
		}
	}

	// 6.重载关闭方法
	public static void close(Connection conn, Statement stmt) {
		close(conn, stmt, null);
	}
}

2、druid.properties

driverClassName=com.mysql.jdbc.Driver
url=jdbc:mysql://127.0.0.1:3306/                  ----------数据库地址
username=                                         ----------数据库名
password=                                         ----------数据库密码
initialSize=5                                     ---------初始链接数
maxActive=10                                      ----------最大链接数
maxWait=3000                                      ---------超时时间

猜你喜欢

转载自blog.csdn.net/qq_39668217/article/details/87946938