JDBC-DAO
DAO:Data Access Object,数据访问对象
DAO就是将JAVA对表的操作封装成对象
一张表对应一个实体类,那么一张表的操作对应一个DAO对象
在Java操作数据库时,我们将对同一张表的操作封装起来,供业务层Service去调用,这个类就是DAO层
在dao目录下建立xxxDao接口
在dao目录下建立impl目录建立实现类
在dao目录下建立BaseDAO父类
BaseDAO
基本上每一个数据表都应该有一个对应的DAO接口及其实现类
我们发现所有表的CURD代码重复率很高,所以我们可以将这些重复的代码设计一个公共的父类
注:BaseDAO中是不写SQL代码的,而DAO的实现类是需要写具体的SQL功能的
DAO处理一共分为六步
- 注册驱动
- 获取链接
- 预编译SQL语句
- 为占位符赋值,执行SQL,接受返回结果
- 处理结果
- 释放资源
其中,1、2、6三部我们通过JDBCUtil完成,需要编写BaseDao提取出3、4、5的代码冗余部分
在这里,我们设计三个方法去完成公共部分的增删改查功能:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113
| import com.xiaobai.schedule.util.JDBCUtilV2;
import java.lang.reflect.Field; import java.sql.*; import java.util.ArrayList; import java.util.List;
public class BaseDAO {
public int executeUpdate(String sql, Object... params) throws SQLException { Connection connection = JDBCUtilV2.getConnection(); PreparedStatement preparedStatement = connection.prepareStatement(sql); if (params != null && params.length > 0) { for (int i = 0; i < params.length; i++) { preparedStatement.setObject(i + 1, params[i]); } } int i = preparedStatement.executeUpdate(); preparedStatement.close(); JDBCUtilV2.close(); return i; }
public <T> List<T> executeQuery(Class<T> clazz, String sql, Object... params) throws Exception { Connection connection = JDBCUtilV2.getConnection(); PreparedStatement preparedStatement = connection.prepareStatement(sql); if (params != null && params.length > 0) { for (int i = 0; i < params.length; i++) { preparedStatement.setObject(i + 1, params[i]); } }
ResultSet resultSet = preparedStatement.executeQuery(); ResultSetMetaData metaData = resultSet.getMetaData(); int columnCount = metaData.getColumnCount(); List<T> list = new ArrayList<T>(); while (resultSet.next()) { T t = clazz.newInstance(); for (int i = 1; i <= columnCount; i++) { Object value = resultSet.getObject(i); String fieldName = metaData.getColumnLabel(i);
Field field = clazz.getDeclaredField(fieldName); field.setAccessible(true); field.set(t, value); } list.add(t); }
resultSet.close(); preparedStatement.close(); JDBCUtilV2.close(); return list; }
public <T> T executeQueryBean(Class<T> clazz, String sql, Object... params) throws Exception { List<T> list = executeQuery(clazz, sql, params); if (list != null && list.size() > 0) { return list.get(0); } return null; } }
|
DAO实现类
在编写BaseDAO 查询的时候,我们注意到一个事情
当利用反射获取到该类的属性时,我们传入的参数时结果集中列的名字
但是Java中使用的是驼峰命名法,也就是说:类中属性名≠结果集列名
我们可以通过给结果集列名起别名的方法解决这个问题
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66
| package com.xiaobai.dao.impl;
import com.xiaobai.dao.BaseDAO; import com.xiaobai.dao.UserDao; import com.xiaobai.pojo.User;
import java.sql.SQLException; import java.util.List;
public class UserDaoImpl extends BaseDAO implements UserDao {
@Override public List<User> selectAll() { try { String sql = "select u_id userId,u_name userName,u_salary userSalary,u_age userAge from user"; return executeQuery(User.class, sql, null); } catch (Exception e) { throw new RuntimeException(e); } }
@Override public User selectByUserId(int id) { try { String sql = "select u_id userId,u_name userName,u_salary userSalary,u_age userAge from user where u_id = ?"; return executeQueryBean(User.class, sql, id); } catch (Exception e) { throw new RuntimeException(e); } }
@Override public int insert(User user) { try { String sql = "INSERT INTO user(u_name, u_salary, u_age) VALUES (?, ?, ?)"; return executeUpdate(sql, user.getUserName(), user.getUserSalary(), user.getUserAge()); } catch (SQLException e) { throw new RuntimeException(e); } }
@Override public int update(User user) { try { String sql = "UPDATE user SET u_salary = ? WHERE u_id = ?"; return executeUpdate(sql, user.getUserSalary(), user.getUserId()); } catch (SQLException e) { throw new RuntimeException(e); } }
@Override public int delete(int id) { try { String sql = "DELETE FROM user WHERE u_id = ?"; return executeUpdate(sql, id); } catch (SQLException e) { throw new RuntimeException(e); } } }
|