zoukankan      html  css  js  c++  java
  • JDBC——DAO设计模式

    DAO:Data Access  Object

      实现功能的模块化。

     INSERT UPDATE DELETE

    void update(String sql, Object ...args);

    package jdbc;
    
    import java.sql.ResultSet;
    import java.sql.ResultSetMetaData;
    import java.sql.SQLException;
    import java.util.ArrayList;
    import java.util.HashMap;
    import java.util.List;
    import java.util.Map;
    
    import com.mysql.jdbc.Connection;
    import com.mysql.jdbc.PreparedStatement;
    
    /**
     *INSERT UPDATE DELETE
     *void update(String sql, Object ...args);
     */
    
    public class DAO {
    	public void update(String sql, Object ...args) {
    		
    		Connection conn = null;
    		PreparedStatement ps = null;
    		ResultSet res = null;
    		
    		try {
    			//1.创建Connection对象
    			conn = (Connection) JDBCTools.getConnection();
    			
    			//2.创建PreparedStatement对象
    			ps = (PreparedStatement) conn.prepareStatement(sql);
    			
    			//3.调用PreparedStatement的setObject()对占位符进行赋值
    			for(int i = 0; i < args.length; ++i) {
    				ps.setObject(i + 1, args[i]);
    			}
    			ps.executeUpdate();
    		} catch(Exception e) {
    			e.printStackTrace();
    		}finally {
    			JDBCTools.release(null, ps, conn);
    		}
    	}
    }
    

    查询一条记录

    <T> T get(class<T> clazz, String sql, Object ... args);

    /**
     *查询一条记录
     *<T> T get(class<T> clazz, String sql, Object ... args);
     */
    
    public class DAO {
    	//查询一条记录,返回对应的对象
    	public <T> T get(Class<T> clazz, String sql, Object ...args){
    		T entity = null;
    		Connection conn = null;
    		PreparedStatement ps = null;
    		ResultSet resultSet = null;
    		ResultSetMetaData rsmd = null;
    		
    		try {
    			//1.获取数据库连接
    			conn = (Connection) JDBCTools.getConnection();
    
    			//2.使用PreparedStatement填充sql语句
    			ps = (PreparedStatement) conn.prepareStatement(sql);
    			
    			//3.填充sql中的占位符
    			for(int i = 0; i < args.length; ++i) {
    				ps.setObject(i + 1, args[i]);
    			}
    			
    			//4.进行查询得到ResultSet对象    //4.获得ResultSetMetaData
    			resultSet = ps.executeQuery();
    			
    			//5.准备一个Map<String, Object>:key:存放列的别名  Value:存放列的值
    			Map<String, Object> map = new HashMap<String, Object>();
    			
    			//6.处理ResultSet
    			if(resultSet.next()) {
    				
    				//7.得到ResultSetMetaData对象  //6.返回符合条件的对象
    				rsmd = resultSet.getMetaData();
    				
    				int columnCount = rsmd.getColumnCount();
    				
    				//8.由ResultSetMetaData的getColumnCount()得到有多少列,getColumnLabel()得到列的别名
    				for(int i = 0; i < columnCount; ++i) {
    					String key = rsmd.getColumnLabel(i + 1);//ResultSetMetaData的getColumnLabel()得到列的别名
    					Object value = resultSet.getObject(i + 1);////ResultSet的getObject()得到列的值
    					
    					//9.填充Map对象
    					map.put(key, value);
    				}
    			}
    			//******10.若map不为空集,用反射创建Class对应的对象
    			entity = clazz.newInstance();
    			
    			//11.遍历Map对象,利用反射给对象属性赋值  key为属性名  value为属性值
    			for(Map.Entry<String, Object> entry: map.entrySet()) {
    				String key = entry.getKey();
    				Object value = entry.getValue();
    				//利用反射给对象属性赋值  key为属性名  value为属性值
    				ReflectionTools.setValue(entity, key, value);
    			}
    		} catch (Exception e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		} finally {
    			JDBCTools.release(resultSet, ps, conn);
    		}		
    		return entity;
    	}
    }
    

      

    
    

    查询多条记录,返回对象的集合
    <T> List<T> getForList(Class<T> clazz, String sql, Object ...args);

    /**
     *查询多条记录,返回对象的集合
     *<T> List<T> getForList(Class<T> clazz, String sql, Object ...args);
     */
    
    public class DAO {
    	//查询多条记录,返回对象的集合
    	public <T> List<T>getForList(Class<T> clazz, String sql, Object ...args){
    		List<T> result = new ArrayList();
    		Connection conn = null;
    		PreparedStatement ps = null;
    		ResultSet resultSet = null;
    		ResultSetMetaData rsmd = null;
    		
    		try {
    			//1.
    			conn = (Connection) JDBCTools.getConnection();
    			//2.
    			ps = (PreparedStatement) conn.prepareStatement(sql);
    
    			//3.
    			for(int i = 0; i < args.length; ++i) {
    				ps.setObject(i + 1, args[i]);
    			}
    			//4.
    			resultSet = ps.executeQuery();
    			
    			//5.准备一个List<Map<String, Object>>: 键:存放列的别名  值:列的值,其中一个Map对应一个记录
    			List<Map<String, Object>> list = new ArrayList<>();
    			
    			//6.处理ResultSet结果,用while循环
    			while(resultSet.next()) {
    				//7.获得ResultSetMetaData对象
    				rsmd = resultSet.getMetaData();
    				
    				//8.准备Map<String, Object>用来存放每一条查询的记录
    				Map<String, Object> map = new HashMap<>();
    				
    				//9.遍历结果集,将结果存放在Map中
    				int column = rsmd.getColumnCount();
    				for(int i = 0; i < column; ++i) {
    					String key = rsmd.getColumnLabel(i + 1);
    					Object value = resultSet.getObject(i + 1);
    					
    					map.put(key, value);
    				}
    				//10.把每条map记录放入List中
    				list.add(map);
    			}
    			
    			//11.判断List是否为空,若不为空,遍历List得到每个Map对象。再把每个Map对象转为Class对应的Object对象
    			T bean = null;
    			
    			if(list.size() > 0) {
    				for(Map<String, Object> m : list) {
    					bean = clazz.newInstance();
    					for(Map.Entry<String, Object> entry: m.entrySet()) {
    						String key = entry.getKey();
    						Object value = entry.getValue();
    						
    						ReflectionTools.setValue(bean, key, value);
    					}
    					
    					//12.把Object放入List中
    					result.add(bean);
    				}
    			}
    		}catch(Exception e) {
    			e.printStackTrace();
    		} finally {
    			JDBCTools.release(resultSet, ps, conn);
    		}
    		
    		return result;
    	}
    }
    

    返回某条记录的某一个字段的值或一个统计的值

    <E> E getForValue(String sql, Object ...args); 

    /**
     *返回某条记录的某一个字段的值或一个统计的值
     *<E> E getForValue(String sql, Object ...args); 
     */
    
    public class DAO {
    	//返回某条记录的某一个字段的值或一个统计的值
    	public <E> E getForValue(String sql, Object ...args) {
    		Connection conn = null;
    		PreparedStatement ps = null;
    		ResultSet resultSet = null;
    		ResultSetMetaData rsmd= null;
    		
    		try {
    			conn = (Connection) JDBCTools.getConnection();
    			ps = (PreparedStatement) conn.prepareStatement(sql);
    			
    			for(int i = 0; i < args.length; ++i) {
    				ps.setObject(i + 1, args[i]);
    			}
    			
    			resultSet = ps.executeQuery();
    			
    			if(resultSet.next()) {
    				return (E) resultSet.getObject(1);
    			}
    			
    		}catch(Exception e) {
    			e.printStackTrace();
    		}finally {
    			JDBCTools.release(resultSet, ps, conn);
    		}
    
    		return null;
    	}
    }
    

      

  • 相关阅读:
    七 使用list和tuple
    python 操作RabbitMQ
    python 操作Memcached
    python 操作SQLAlchemy
    Scrapy 分布式爬虫
    Django 测试驱动开发
    Flask 页面缓存逻辑,jinja2 过滤器,测试器
    Flask Markup 上下文,request
    Flask 学习 十六 部署
    Flask 学习 十五 性能
  • 原文地址:https://www.cnblogs.com/SkyeAngel/p/7846903.html
Copyright © 2011-2022 走看看