在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.