在src目录下创建配置文件db.properties,(相应的驱动和url根据自己的实际情况改)

driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/mydb2
user=root
password=

新建一个工具包util,包中创建工具类DbUtil:

import java.io.FileInputStream;
import java.io.IOException;
import java.lang.reflect.Field;
import java.sql.*;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Properties;
@SuppressWarnings("all")
//数据库操作工具类
public class DbUtil {
    private static final String DRIVER ;
    private static final String URL ;
    private static final String USER ;
    private static final String PASSWORD ;

    static {
        //加载配置文件、读取其内容
        Properties properties = new Properties();
        try {
            properties.load(new FileInputStream("src\\db.properties"));
        } catch (IOException e) {
            e.printStackTrace();
        }
        DRIVER=properties.getProperty("driver");
        URL=properties.getProperty("url");
        USER=properties.getProperty("user");
        PASSWORD=properties.getProperty("password");
    }
    //获取数据库连接
    public static Connection geyConnection(){
        //加载其驱动
        try {
            Class.forName(DRIVER);
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
        //获取数据库连接
        Connection connection = null;
        try {
            connection = DriverManager.getConnection(URL, USER, PASSWORD);
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return connection;
    }
    //释放资源
    public static void close(Connection connection, Statement statement, ResultSet resultSet){
        try {
            connection.close();
        } catch (SQLException e) {
            e.printStackTrace();
        }

        try {
            statement.close();
        } catch (SQLException e) {
            e.printStackTrace();
        }

        try {
            resultSet.close();
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }

在工具类中写DML封装方法

//DML操作方法封装
public static boolean dmlOpration(String dmlSQL,Object[] params) {
    //调用自定义方法获取数据库连接
    Connection connection = geyConnection();
    PreparedStatement preparedStatement=null;
    try {
        //预编译SQL语句
        preparedStatement = connection.prepareStatement(dmlSQL);
        //调用preparedStatement的setObject()方法,动态将SQL语句中的每个问号赋值到已占位的位置
        if (params!=null){
            for (int i = 0; i <params.length ; i++) {
                preparedStatement.setObject((i+1),params[i]);
            }
        }
        //返回SQL语句执行后,数据库影响行数,再根据数据库的影响行数,判断DML语句是否执行成功
        return preparedStatement.executeUpdate()>0?true:false;
    } catch (SQLException e) {
        e.printStackTrace();
    }finally {
        //调用自己封装的方法,释放资源
        close(connection,preparedStatement,null);
    }
    //如果有异常,返回false
    return false;
}

DQL方法封装:方法1

方法1:将查询结果的每一行作为一个map对象,每个键值对,存放一个表的值,
      key存放列标,value存放对应列表在这一行的值,然后将每个map对象存放在ArrayList集合中
//方法1
public static ArrayList<HashMap<String,Object>> dqlOpration1(String dqlSQL,Object[] params){
    //创建存放map的ArrayList集合
    ArrayList<HashMap<String, Object>> mapArrayList = new ArrayList<>();
    Connection connection=null;
    PreparedStatement preparedStatement=null;
    ResultSet resultSet=null;
    //调用自己封装的方法获取数据库连接
    connection = geyConnection();
    try {
        //预编译SQL语句,获取预编译的对象
        //SQL语句已预编译并存储在PreparedStatement对象中,然后可以使用该对象多次有效地执行此语句。
        preparedStatement = connection.prepareStatement(dqlSQL);
        if (params!=null){
            for (int i = 0; i <params.length ; i++) {
                //调用preparedStatement的setObject()方法,动态将SQL语句中的每个问号赋值到已占位的位置
                preparedStatement.setObject((i+1),params[i]);
            }
        }
        //执行对象,返回结果集
        resultSet = preparedStatement.executeQuery();

        //获取结果集对象的属性
        ResultSetMetaData metaData = resultSet.getMetaData();
        //调用属性的方法,获取列的总数
        int columnCount = metaData.getColumnCount();
        //调用结果集对象的方法,遍历行
        //resultSet的next()方法,如果下一行不为空,返回true,否则返回false
        while (resultSet.next()){
            HashMap<String, Object> hashMap = new HashMap<>();
            //遍历列
            int cIndex=1;//列序号
            while (cIndex<=columnCount){
                //调用属性的方法,获取指定列的建议标题用于打印输出和显示。
                String columnLabel = metaData.getColumnLabel(cIndex);
                //调用结果集对象的getObject(String columnLabel)获取此的当前行中指定列的值
                Object object = resultSet.getObject(columnLabel);
                //将对应的列标作为key,值作为value保存在map中
                hashMap.put(columnLabel,object);
                cIndex++;
            }
            //将每一行的map对象放在ArrayList中
            mapArrayList.add(hashMap);
        }
        //返回ArrayList
        return mapArrayList;
    } catch (SQLException e) {
        e.printStackTrace();
    }
    finally {
        close(connection,preparedStatement,resultSet);
    }
    //如果异常返回空值
    return null;
}

测试DQL封装方法1

import util.DbUtil;

import java.util.ArrayList;
import java.util.HashMap;

public class Test1 {
    public static void main(String[] args) {
        ArrayList<HashMap<String, Object>> hashMaps = DbUtil.dqlOpration1("select * from emp", null);
        for (HashMap<String, Object> map:hashMaps) {
            System.out.println(map);
        }
    }
}

DQL方法封装:方法2

利用反射获取字段值,将每一行的值看成一个类的对象,列名就是类的属性,每一行的对应的值就是对象的属性值
//方法2

//泛型方法声明都有一个类型参数声明部分(由尖括号分隔),该类型参数声明部分在方法返回类型之前
public static <T> ArrayList<T> dqlOpration2(String dqlSQL,Object[] params,Class<T> tClass){
    ArrayList<T> arrayList = new ArrayList<>();

    Connection connection=null;
    PreparedStatement preparedStatement=null;
    ResultSet resultSet=null;

    //调用自己封装的方法获取数据库连接
    connection = geyConnection();
        //预编译SQL语句,获取预编译的对象
        //SQL语句已预编译并存储在PreparedStatement对象中,然后可以使用该对象多次有效地执行此语句。
        try {
            preparedStatement = connection.prepareStatement(dqlSQL);
            if (params!=null){
                for (int i = 0; i <params.length ; i++) {
                    //调用preparedStatement的setObject()方法,动态将SQL语句中的每个问号赋值到已占位的位置
                    preparedStatement.setObject((i+1),params[i]);
                }
            }
            //执行对象,返回结果集
            resultSet = preparedStatement.executeQuery();

            //获取结果集对象的属性
            ResultSetMetaData metaData = resultSet.getMetaData();
            //调用属性的方法,获取列的总数
            int columnCount = metaData.getColumnCount();
            //调用结果集对象的方法,遍历行
            //resultSet的next()方法,如果下一行不为空,返回true,否则返回false
            while (resultSet.next()){
                //字节码文件创建对象
                T t = tClass.newInstance();
                //遍历列
                int cIndex=1;//列序号
                while (cIndex<=columnCount){
                    //获取列名称
                    String columnName = metaData.getColumnLabel(cIndex);
                    //获取列的值
                    Object columnValue = resultSet.getObject(columnName);
                    //调用方法返回类或接口的指定已声明字段类对象
                    Field declaredField = tClass.getDeclaredField(columnName);
                    //取消访问权限检查
                    declaredField.setAccessible(true);
                    //将获取到值设置到字段上
                    //set(Object obj, Object value)将指定对象参数上的此对象表示的字段设置为指定的新值。
                    declaredField.set(t,columnValue);
                    cIndex++;
                }
                //将每一行的map放入到arrayList中
                    arrayList.add(t);
            }
            return arrayList;
        } catch (SQLException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (InstantiationException e) {
            e.printStackTrace();
        } catch (NoSuchFieldException e) {
            e.printStackTrace();
        } finally {
            close(connection,preparedStatement,resultSet);
        }
        return null;
        }

需要先创建对应表的类,并重写toString方法

package entity;

import java.util.Date;

public class Emp {

    private int id;
    private String name;
    private String gender;
    private double salary;
    private Date join_date;
    private Integer dept_id;

    @Override
    public String toString() {
        return "Emp{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", gender='" + gender + '\'' +
                ", salary=" + salary +
                ", join_date=" + join_date +
                ", dept_id=" + dept_id +
                '}';
    }
}

测试DQL封装方法2

import entity.Emp;
import util.DbUtil;

import java.util.ArrayList;

public class Test2 {
    public static void main(String[] args) {
        ArrayList<Emp> arrayList = DbUtil.dqlOpration2("select * from emp", null,Emp.class);
        for (Emp emp:arrayList) {
            System.out.println(emp);
        }
    }
}

L.X.Q.


温柔赠于四方,自由灵魂独享