一、封装数据库DML操作
public class DB_utils {
static final String URL = "jdbc:mysql://localhost:3306/dep ?serverTimezone=GMT";
static final String USER = "root";
static final String PWD = "password";
- 封装加载驱动方法
public static Connection getConnection() {
Connection connection = null;
try {
Class.forName("com.mysql.cj.jdbc.Driver");
connection = DriverManager.getConnection(URL, USER, PWD);
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
return connection;
}
封装DML语句方法,调用该方法只需传sql语句和数组
public static int execute(String sql,Object[] o) {
Connection con = null;
try {
con = getConnection();
PreparedStatement ps = con.prepareStatement(sql);
if (o!=null && o.length>0) {
for(int x=0;x<o.length;x++) {
ps.setObject(x+1, o[x]);
}
int rows = ps.executeUpdate();
return rows;
}
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
return 0;
}
}
测试类:
public class Test {
public static void main(String[] args) {
String sql = "insert into student values (?,?)";
Object[] o = new Object[2];
o[0] = "001";
o[1] = "李四";
int rows = DB_utils.execute(sql, o);
if(rows > 0)
System.out.println("成功");
else
System.out.println("失败");
}
}
二、封装数据库DQL操作
//封装DQL操作
/****
* 执行DQL操作的方法,select
*/
public static <T> List<T> executeQuery(String sql,Object[] params,Class<T> clz) {
List<T> list=new ArrayList<>();
Connection conn=null;
PreparedStatement pstat=null;
ResultSet res=null;
try {
conn=getConn();
//预编译sql语句
pstat=conn.prepareStatement(sql);
//给sql语句占位符赋值
if(params!=null&¶ms.length>0) {
for(int x=0;x<params.length;x++) {
pstat.setObject(x+1, params[x]);
}
}
//发送执行sql语句
res = pstat.executeQuery();
//获得clz对象封装的class文件中无参数构造方法
Constructor<T> constractor=clz.getConstructor(null);
//获得ResultSetMetaData对象
ResultSetMetaData rsmd = res.getMetaData();
//获得虚拟表对应的列的数据
int count = rsmd.getColumnCount();
//遍历结果集ResultSet,将resultSet结果集转化为对象的集合
while(res.next()) {
//1 创建实体类对象对象,使用反射创建实体类对象
T o=constractor.newInstance(null);
//2实体类属性赋值
//2.1给几个属性赋值(有select语句产生虚拟表中列的数目决定)
for(int x=0;x<count;x++) {
//获得查询到列的名字(列名和属性名字一样),决定给那个属性赋值
String columnName = rsmd.getColumnName(x+1);
//获得属性对应的set方法的名字
columnName=columnName.toLowerCase();
String setXxx="set"+columnName.substring(0, 1).toUpperCase()
+columnName.substring(1);
//获得列对象的java类型,获得属性对应的set方法的参数类型
String className = rsmd.getColumnClassName(x+1);
//System.out.println(setXxx+"----"+className);
//将className字符串表示的具体的数据类型转化为对应的Class对象
Class<?> parameterType = Class.forName(className);
//获得属性对应的公共的set方法setXxx对象
Method set = clz.getDeclaredMethod(setXxx,parameterType);
//获得数据查询到列对应的值
Object value = res.getObject(x+1);
//调用set方法完成对象属性赋值
set.invoke(o, value);
}
//3 将s对象放入List集合
list.add(o);
}
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}finally {
try {
res.close();
pstat.close();
conn.close();
} catch (Exception ex) {
// TODO: handle exception
ex.printStackTrace();
}
}
return list;
}
本文详细讲解如何在Java中封装数据库的DML(增删改)和DQL(查询)操作,通过实例代码展示具体实现过程。

262

被折叠的 条评论
为什么被折叠?



