JDBC的DAO设计模式

在javaEE中,java类的属性通过getter和setter来定义,get(或set)方法去除get(set)后,首字母小写即为Java类的属性。操作java类的属性有一个工具包,BeanUtils,其中的setProperty()方法是通过javaBean中的set方法赋值的。

使用BeanUtils需要加入两个jar包,

1.测试BeanUtils中的SetProperty()方法。

@Test
    public void testSetProperty() throws IllegalAccessException, InvocationTargetException, NoSuchMethodException{
        Object object = new Student();
        System.out.println(object);
        BeanUtils.setProperty(object,"type",2434);
        System.out.println(object);
        System.out.println(BeanUtils.getProperty(object,"type"));
    }

运行后:

①创建一个Student对象student,未赋值之前属性为空;

②BeanUtils.setProperty(object,"type",2434); 为student赋值,属性为对应的Student类get(或set)方法去除get(set)后再把首字母小写;

③赋值后使用BeanUtils.getProperty(object,"type"); 获得属性值。

 

DAO:Data Access Object,是访问数据信息的类,包含了对数据的CRUD(create,read,update,delete),而不包含任何业务相关的信息,更容易实现功能的模块化,有利于代码的维护和升级。

1.update,包括插入,删除,更新操作

public void update(String sql,Object ... args){
	Connection connection=null;
	PreparedStatement preparedstatement=null;
	ResultSet resultset=null;
	try{
		connection=JDBCTools.getConnection();
		preparedstatement=connection.prepareStatement(sql);
		for(int i=0;i<args.length;i++){
			preparedstatement.setObject(i+1, args[i]);
		}
		preparedstatement.executeUpdate();
	}catch(Exception e){
		e.printStackTrace();
	}finally{
		JDBCTools.release(resultset,preparedstatement, connection);
	}
}

测试方法:

@Test
public void testUpdate() { String sql="INSERT INTO EXAMSTUDENT(FlowId,TYPE,IdCard,ExamCard,StudentName,Location,Grade)" + "VALUES(?,?,?,?,?,?,?)"; dao.update(sql,1,2,"23313","2321","Li","大连",313); }

2.查询多条记录,返回对应的查询对象的集合

public <T> List<T> getForList(Class<T> clazz,String sql,Object ... args){
	List<T> list=new ArrayList<>();
	Connection connection=null;
	PreparedStatement preparedstatement=null;
	ResultSet resultset=null;
	try{
		//1.得到结果集resultset
		connection=JDBCTools.getConnection();
		preparedstatement=connection.prepareStatement(sql);
		for(int i=0;i<args.length;i++){
			preparedstatement.setObject(i+1, args[i]);
		}
		resultset=preparedstatement.executeQuery();
		//2.处理结果集,将得到的ResultSet结果集中的别名和列值存入到Map中,得到Map的List
		List<Map<String,Object>> listMap = handleResultSetToMapList(resultset);
		//3.将Map的List转为clazz对应的List,其中Map的key即为clazz对应的属性名,Map的value为clazz对应的属性值
		list=transferMapListToBeanList(clazz,listMap);
	}catch(Exception e){
		e.printStackTrace();
	}finally{
		JDBCTools.release(resultset,preparedstatement, connection);
	}
	return list;
}

2.1 得到结果集

2.2 将ResultSet结果集转换为MapList的方法:handleResultSetToMapList(resultset)

private List<Map<String, Object>> handleResultSetToMapList(ResultSet resultset)
		throws Exception, SQLException {
	List<Map<String,Object>> list=new ArrayList<>();
	//得到resultset中的列名
	List<String> columnLabels=getColumnLabels(resultset);
	Map<String,Object> map=null;
	while(resultset.next()){
		map=new HashMap<>();
		//得到SQL查询的列数
		int count=columnLabels.size();
		for(String columnLabel:columnLabels){
			Object columnValue=resultset.getObject(columnLabel);
			//将别名,列值存入到Map中
			map.put(columnLabel,columnValue);
		}
		list.add(map);
	}
	return list;
}

其中得到resultset中的列名的方法:getColumnLabels(resultset)

private List<String> getColumnLabels(ResultSet resultset) throws Exception{
	List<String> labels=new ArrayList<String>();
	ResultSetMetaData rsmd=resultset.getMetaData();
	int count=rsmd.getColumnCount();
	while(resultset.next()){
		for(int i=0;i<count;i++){
			labels.add(rsmd.getColumnLabel(i+1));
		}
	}
	return labels;
}

2.3 将MapList转换为javaBean属性对应的List:transferMapListToBeanList(clazz,listMap)

private <T> List<T> transferMapListToBeanList(Class<T> clazz,List<Map<String, Object>> listMap) throws InstantiationException, IllegalAccessException, InvocationTargetException {
	List<T> result=new ArrayList<>();
	T bean=null;
	if(listMap.size()>0){
		//listMap中存的是多条记录的列名和列值,遍历listMap
		for(Map<String,Object> map1:listMap){
			bean=clazz.newInstance();
			//遍历map1
			for(Map.Entry<String, Object> entry:map1.entrySet()){
				String propertyName=entry.getKey();
				Object propertyValue=entry.getValue();
				BeanUtils.setProperty(bean,propertyName,propertyValue);
			}
			result.add(bean);
		}
	}
	return result;
}

测试方法:

@Test
public void testGetForList() {
	String sql="SELECT FlowID flowId,TYPE type,IDCard idCard,ExamCard examCard,"
			+ "StudentName studentName,Location location,Grade grade FROM EXAMSTUDENT";
	List<Student> student=dao.getForList(Student.class,sql);
	System.out.println(student);
}

3.查询一条记录,返回对应的对象

public <T> T get(Class<T> clazz,String sql,Object ... args){
	List<T> result=getForList(clazz,sql,args);
	if(result.size()>0){
		return result.get(0);
	}
	return null;
}

4.返回某条记录的某一个字段的值或一个统计的值(一共有多少条记录等)

public <E> E getForValue(String sql,Object ... args){
	Connection connection=null;
	PreparedStatement preparedstatement=null;
	ResultSet resultset=null;
	try{
		connection=JDBCTools.getConnection();
		preparedstatement=connection.prepareStatement(sql);
		for(int i=0;i<args.length;i++){
			preparedstatement.setObject(i+1, args[i]);
		}
		resultset=preparedstatement.executeQuery(); 
		if(resultset.next()){
			return (E)resultset.getObject(1);
		}
	}catch(Exception e){
		e.printStackTrace();
	}finally{
		JDBCTools.release(resultset,preparedstatement, connection);
	}
	return null;
}

 测试方法:

@Test
public void testGetForValue() {
	String sql="SELECT ExamCard FROM EXAMSTUDENT WHERE FlowId=?";
	String ExamCard=dao.getForValue(sql,1);
	System.out.println(ExamCard);
}

 

wx搜索“程序员考拉”,专注java领域,一个伴你成长的公众号!

posted @ 2018-12-08 19:12  考拉熊_12  阅读(436)  评论(0编辑  收藏  举报