java操作数据库的通用方法(单表增删改查)
这样做的好处就非常大了,不用每次都要写
01.写sql语句
02.获取操作数据库句柄
03.设置参数
04.执行sql语句
05.如果是查询的话还要赋值
这些复杂的操作了,这样对单表的增删改查就非常方便了。
在这里我的每一行都有非常详细的注释,认真看的话应该可以看得懂,里面用到了(反射,jdbc操作数据库,获取元数据,链表,可变参,泛型,类对象等一些用法)
其实每个用法都不是很难,重要的是怎么用,然后组合。
// 通用查询
public static <T> List<T> query(String sql, Class<T> clazz, Object... param) {
PreparedStatement ps = null;
ResultSet set = null;
List<T> result = null;
// 先判断连接
if (connection == null || connection.isClosed()) {
getConnection();
}
// 获取操作数据库句柄
ps = connection.prepareStatement(sql);
// 设置参数
for (int i = 1; i <= param.length; i++) {
ps.setObject(i, param[i - 1]);
}
// 执行sql语句
set = ps.executeQuery();
while (set.next()) {
// 如果返回的set有下一个则分配一个链表空间准备保存set中的值
if (result == null) {
result = new ArrayList<T>();
}
// 根据类对象获取构造方法保存到c中
// 这里就体现了类中定义不带参构造的用处了,可以直接用来调用它不带参的构造,因为不知道带参的构造的参数到底是什么
// 有不带参的构造就可以直接获取到他的构造方法,就可以用来new对象了
Constructor<T> c = clazz.getDeclaredConstructor();
// 拿获取的构造方法新建一个对象(这个类的实例),因为后面设置属性值需要传一个对象(实例)
T a = c.newInstance();
// 获取set中保存得元数据(对数据的描述,就是表的一些信息),取出表的字段名,转成类中的属性名
ResultSetMetaData rsmd = set.getMetaData();
for (int i = 1; i <= rsmd.getColumnCount(); i++) {
// 把获取到的字段名全部先转成小写
// 把以“_”分割出来的字符保存到str字符串数组中(因为mysql中的字段名每个单词之间用“_”分割),分割出每个单词
String[] str = rsmd.getColumnName(i).toLowerCase().split("_");
// 定义一个字符串类型的fieldName用来保存转换过的字段名
String fieldName = "";
// 循环这个数组中的字符串(以“_”分割出来的单词),转成java中的属性名(小驼峰命名法),第一个单词不用首字母不用大写,之后的每个单词首字母大写
for (int j = 0; j < str.length; j++) {
// 判断,如果不是第一个那就字符串截取,截取首字母把他转成大写,再拼接起来
if (j != 0) {
str[j] = str[j].substring(0, 1).toUpperCase() + str[j].substring(1);
}
// 拼接起来保存到这个变量中,就是类中的属性名(注意这里的必须要保证数据库和java属性名之间的转换规范,把mysql中的字段名转成属性名是见了“_”就去掉“_”然后首字母大写)
fieldName += str[j];
}
// 用类对象获取属性,就可以设置属性的值了
Field f = clazz.getDeclaredField(fieldName);
// 设置访问权限,如果这个属性是私有的也可以访问到
f.setAccessible(true);
// 设置属性值(第一个属性就是通过上面类对象获取的构造创建的类,意思是设置这个类中这个字段的值),第二个就是把这个字段设为什么值
f.set(a, set.getObject(fieldName));
// 设置成功后把这个实例对象加到链表中
result.add(a);
}
return result;
}
// 通用增删改
public static int update(String sql, Object... param) {
PreparedStatement ps = null;
int result = 0;
if (connection == null || connection.isClosed()) {
getConnection();
}
// 获取操作句柄
ps = connection.prepareStatement(sql);
// 设置参数
for (int i = 1; i <= param.length; i++) {
ps.setObject(i, param[i - 1]);
}
result = ps.executeUpdate();
System.out.println("操作成功,影响了" + result + "行!");
return result;
注:代码里需要自己捕获异常
例如我再要查user表中的记录就不用写那么多复杂的代码了
List users = Database.query("SELECT * FROM user , User.class);
这样就可以查询出user表中的所有记录了。