zoukankan      html  css  js  c++  java
  • 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领域,一个伴你成长的公众号!

  • 相关阅读:
    16061109-第0次个人作业
    面向对象第四次总结
    面向对象5-7次作业总结
    2018 OO第一次总结(作业1-3)
    (最终作业)面向对象先导课课程总结
    HTML学习笔记
    实验八 进程间通信
    信号
    进程基础
    shell脚本编程
  • 原文地址:https://www.cnblogs.com/naihuangbao/p/10079954.html
Copyright © 2011-2022 走看看