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)