DAO
Data Access Object
作用:
访问数据信息的类,包含了对数据的CRUD(create,read,update,delete),而不包含任何业务相关的信息。
优势:
实现功能的模块化,更有利于代码的维护和升级。
DAO可以被子类继承或直接使用。
使用:
//INSERT,UPDATE,DELETE 操作可以包含在其中
void update(String sql,Object...args);
//修改的测试 @Test public void test1(){ String sql = "update student set name='yang',password='111' where id=? "; update(sql,1); } //修改 public void update(String sql,Object...args){ Connection conn = null; PreparedStatement preparedStatement = null; try { conn = Methods.getConnection(); preparedStatement = conn.prepareStatement(sql); for(int i = 0;i<args.length;i++){ preparedStatement.setObject(i+1,args[i]); } preparedStatement.executeUpdate(); } catch (Exception e) { e.printStackTrace(); } finally { Methods.release(preparedStatement,conn,null); } }
//查询一条记录,返回对应的对象
<T> T get(Class<T> clazz,String sql,Object...args);
//查询记录测试 @Test public void test2(){ String sql = "select * from student where id = ?"; Student stu = get(Student.class,sql,1); System.out.println(stu); } //查询一条数据 public <T> T get(Class<T> clazz, String sql, Object...args){ T entity = null; Connection conn = null; PreparedStatement preparedStatement = null; ResultSet resultSet = null; try { conn = Methods.getConnection(); preparedStatement = conn.prepareStatement(sql); for (int i = 0; i < args.length ; i++) { preparedStatement.setObject(i+1,args[i]); } resultSet = preparedStatement.executeQuery(); //5.若ResultSet中有记录 //准备一个Map<String,Object>:键:存扩列的别名,值:存放列的值 if(resultSet.next()){ Map<String,Object> map = new HashMap<String,Object>(); //6.得到ResultetMetaData对象 ResultSetMetaData resultSetMetaData = resultSet.getMetaData(); //7.处理ResultSet,把指针向下移动一个单位 //8.由ResultSetMetaData对象得到结果集中有多少列 int columnCount = resultSetMetaData.getColumnCount(); //9.由ResultSetMetaData对象得到每一列的别名,由ResultSet得到具体每一列的值 for (int i = 0; i < columnCount ; i++) { String columnLabel = resultSetMetaData.getColumnLabel(i+1); Object columnValue = resultSet.getObject(i+1); //10.填充map对象 map.put(columnLabel,columnValue); } //11.用反射创建Class对应的对象 entity = clazz.newInstance(); //12.遍历Map对象,用反射填充对象的属性值: //属性名为Map中的Key,属性值为Map中的value for (Map.Entry<String,Object> entry : map.entrySet()) { String propertyName = entry.getKey(); Object propertyValue = entry.getValue(); BeanUtils.setProperty(entity,propertyName,propertyValue); } } } catch (Exception e) { e.printStackTrace(); } finally { Methods.release(preparedStatement,conn,resultSet); } return entity; }
//查询多条记录,返回对应的对象的集合
<T> List<T>getForList(Class<T> clazz,String sql,Object...args);
//查询多条记录测试 @Test public void test3(){ String sql = "select * from student"; List<Student> list = getList(Student.class,sql); for (Student stu:list ) { System.out.println(stu); } } //查询多条记录 public <T> List<T> getAll(Class<T> clazz, String sql, Object...args){ List<T> list = new ArrayList<>(); Connection conn = null; PreparedStatement preparedStatement = null; ResultSet resultSet = null; try { conn = Methods.getConnection(); preparedStatement = conn.prepareStatement(sql); for (int i = 0; i < args.length ; i++) { preparedStatement.setObject(i+1,args[i]); } resultSet = preparedStatement.executeQuery(); //5.若ResultSet中有记录 //准备一个List<Map<String,Object>>:键:存扩列的别名,值:存放列的值,其中一个Map对应着一条记录 List<Map<String,Object>> values = new ArrayList<>(); //6.得到ResultetMetaData对象 ResultSetMetaData resultSetMetaData = resultSet.getMetaData(); Map<String,Object> map = null; //7.处理ResultSet,使用while循环 while(resultSet.next()){ map = new HashMap<String,Object>(); for (int i = 0; i < resultSetMetaData.getColumnCount() ; i++) { String columnLabel = resultSetMetaData.getColumnLabel(i+1); Object columnValue = resultSet.getObject(i+1); //10.填充map对象 map.put(columnLabel,columnValue); } //11.把一条记录的一个Map对象放入准备的list集合中 values.add(map); } T bean = null; //12.遍历values集合 if(values.size()>0){ for (Map<String,Object> l: values) { bean = clazz.newInstance(); for (Map.Entry<String,Object> entry : l.entrySet()) { String propertyName = entry.getKey(); Object propertyValue = entry.getValue(); //11.用反射创建Class对应的对象 BeanUtils.setProperty(bean,propertyName,propertyValue); } //13.把Object对象放入list中 list.add(bean); } } } catch (Exception e) { e.printStackTrace(); } finally { Methods.release(preparedStatement,conn,resultSet); } return list; }
//返回某条记录的某一个字段的值或一个统计的值(一共有多少条记录)
<E> E getForValue(String sql,Object...args);
try-catch(ctrl+alt+t)
getset方法重写父类方法(ctrl+alt+insert)
选定本行(ctrl+insert)
选定内容上下移动(ctrl+shift+上下)
参数提示(ctrl+p)