zoukankan      html  css  js  c++  java
  • 使用spring的jdbcTemplate-----用JDBC模板查询数据库

    JdbcTemplate类声明了几个重载的query()模板方法来控制整个查询过程,就像进行更新数据操作一样,通过实现PreparedStatementCreator和PreparedStatementSetter接口,也可以覆盖语句创建任务。

    1,用RowCallbackHandler提取数据

    RowCallbackHandler是允许处理结果集当前行的主要接口,JdbcTemplate中的一个query()方法能替你迭代结果集,并为每一行调用RowCallbackHandler,因此,对于返回结果集中的每一行,processRow()方法都会被调用一次

    Java代码 复制代码 收藏代码
    1. public class JdbcUserDao implements UserDao{  
    2.   
    3.     public User findByUserId(int id){  
    4.   
    5.         String sql ="select *from user where id =?";  
    6.         JdbcTemplate jdbcTemplate  = new JdbcTemplate(dataSource);  
    7.       
    8.         final User user = new User();  
    9.         jdbcTemplate.query(sql,new Objcet[]{id},new RowCallbackHandler(){  
    10.   
    11.             public void processRow(ResultSet rs)throws Exception{  
    12.   
    13.                 user.setUsername(rs.getString("username"));  
    14.                 user.setPassword(rs.getString("password"));  
    15.             }  
    16.         });  
    17.   
    18.         return user;  
    19.     }  
    20. }  
    public class JdbcUserDao implements UserDao{
    
    	public User findByUserId(int id){
    
    		String sql ="select *from user where id =?";
    		JdbcTemplate jdbcTemplate  = new JdbcTemplate(dataSource);
    	
    		final User user = new User();
    		jdbcTemplate.query(sql,new Objcet[]{id},new RowCallbackHandler(){
    
    			public void processRow(ResultSet rs)throws Exception{
    
    				user.setUsername(rs.getString("username"));
    				user.setPassword(rs.getString("password"));
    			}
    		});
    
    		return user;
    	}
    }

    由于最多只能返回SQL查询结果中的一行记录,因此可以以局部变量的形式创建一个User对象,并从结果集中提取数据来设置它的属性,对于不止一行的结果集来说,应该将对象收集成一个列表,

    2,用RowMapper提取数据

    RowMapper比RowCallbackHandler更为通用,它的目的是将结果集的单独一行映射到自定义的对象上,因此它适用于单行和多行结果集,从重用的角度考虑,最好将RowMapper接口实现为一般通用的类,而非内部类,在这个接口的mapRow()方法中,必须构建表示行数据的对象,并将它作为方法的返回值

    Java代码 复制代码 收藏代码
    1. public class UserRowMapper implements RowMapper{  
    2.   
    3.     public Object mapRow(ResultSet rs ,int rowNum)throws SQLException{  
    4.   
    5.         User user  = new User();  
    6.         user.setId(rs.getInt("id"));  
    7.         user.setUsername(rs.getString("username"));  
    8.         user.setPassword(rs.getString("password"));  
    9.   
    10.         return user;  
    11.     }  
    12. }  
    public class UserRowMapper implements RowMapper{
    
    	public Object mapRow(ResultSet rs ,int rowNum)throws SQLException{
    
    		User user  = new User();
    		user.setId(rs.getInt("id"));
    		user.setUsername(rs.getString("username"));
    		user.setPassword(rs.getString("password"));
    
    		return user;
    	}
    }

    RowMapper可以用于单行或者多行的结果集,比如在像findByUserId()这样的方法中,查询唯一对象时,必须调用JdbcTemplate的queryForObject()方法,

    Java代码 复制代码 收藏代码
    1. public class JdbcUserDao implements UserDao{  
    2.   
    3.     ...........  
    4.       
    5.     public User findByUserId(int id){  
    6.   
    7.         String sql ="select *from user where id =?";  
    8.         JdbcTemplate jdbcTemplate  = new JdbcTemplate(dataSource);  
    9.   
    10.         User user =(User)jdbcTemplate.queryForObject(sql,new Object[]{id},new UseRowMapper());  
    11.         return user;  
    12.     }  
    13. }  
    public class JdbcUserDao implements UserDao{
    
    	...........
    	
    	public User findByUserId(int id){
    
    		String sql ="select *from user where id =?";
    		JdbcTemplate jdbcTemplate  = new JdbcTemplate(dataSource);
    
    		User user =(User)jdbcTemplate.queryForObject(sql,new Object[]{id},new UseRowMapper());
    		return user;
    	}
    }
    

    spring2.5提供了一个更便利的RowMapper实现--BeanPropertyRowMapper,它可以自动的将某一行数据映射到指定类的新实例中,它首先将这个类实例化,然后通过名称匹配的方法,将每个列的值都映射到属性中。

    Java代码 复制代码 收藏代码
    1. public class JdbcUserDao implements UserDao{  
    2.   
    3.     public User findByUserId(int id){  
    4.   
    5.         String sql ="select *from user where id = ?";  
    6.         JdbcTemplate jdbcTemplate  = new JdbcTemplate(dataSource);  
    7.           
    8.         User user =(User)jdbcTemplate.queryForObject(sql,new Object[]                                   {id},BeanPropertyRowMapper.newInstance(User.class));  
    9.         return user;  
    10.     }  
    11. }  
    public class JdbcUserDao implements UserDao{
    
    	public User findByUserId(int id){
    
    		String sql ="select *from user where id = ?";
    		JdbcTemplate jdbcTemplate  = new JdbcTemplate(dataSource);
    		
    		User user =(User)jdbcTemplate.queryForObject(sql,new Object[]									{id},BeanPropertyRowMapper.newInstance(User.class));
    		return user;
    	}
    }
    

    3,查询多行

    现在我们来看看如何查询一个带有多行记录的结果集。

    Java代码 复制代码 收藏代码
    1. public interface UserDao{  
    2.   
    3.     public List<User> findAll();  
    4. }  
    public interface UserDao{
    
    	public List<User> findAll();
    }
    

    没哟RowMapper的帮助,仍然可以调用queryForList()方法,传递一个sql语句,返回的结果集是Map列表,每个Map保存结果集中的一个行,用列名称做键。

    Java代码 复制代码 收藏代码
    1. public class JdbcUserDao implements UserDao{  
    2.   
    3.     public List<User> findAll(){  
    4.   
    5.         String sql ="select *from user";  
    6.         JdbcTemplate jdbcTemplate  = new JdbcTemplate(dataSource);  
    7.           
    8.         List<User> lists = new ArrayList<User>();  
    9.         List<Map> rows = jdbcTemplate.queryForList(sql);  
    10.   
    11.         for(Map row: rows){  
    12.   
    13.             User user  = new User();  
    14.             user.setId((int)row.get("id"));  
    15.             user.setUsername((String)row.get("username"));  
    16.             user.setPasword((String)row.get("password"));  
    17.             lists.add(user);              
    18.         }  
    19.         return lists;  
    20.     }  
    21. }  
    public class JdbcUserDao implements UserDao{
    
    	public List<User> findAll(){
    
    		String sql ="select *from user";
    		JdbcTemplate jdbcTemplate  = new JdbcTemplate(dataSource);
    		
    		List<User> lists = new ArrayList<User>();
    		List<Map> rows = jdbcTemplate.queryForList(sql);
    
    		for(Map row: rows){
    
    			User user  = new User();
    			user.setId((int)row.get("id"));
    			user.setUsername((String)row.get("username"));
    			user.setPasword((String)row.get("password"));
    			lists.add(user);			
    		}
    		return lists;
    	}
    }
    

    通过下面的代码测试findAll方法

    Java代码 复制代码 收藏代码
    1. public class Main{  
    2.   
    3.     public static void main(String[] args){  
    4.   
    5.         UserDao userdao = new JdbcUserDao();  
    6.         List<User> user =userdao.findAll();  
    7.           
    8.         for(User u: user){  
    9.   
    10.             System.out.println("id :"+user.getId());  
    11.             System.out.println("username :"+user.getUsername());  
    12.             System.out.println("password :"+user.getPassword());  
    13.         }  
    14.     }  
    15. }  
    public class Main{
    
    	public static void main(String[] args){
    
    		UserDao userdao = new JdbcUserDao();
    		List<User> user =userdao.findAll();
    		
    		for(User u: user){
    
    			System.out.println("id :"+user.getId());
    			System.out.println("username :"+user.getUsername());
    			System.out.println("password :"+user.getPassword());
    		}
    	}
    }
    

    如果使用RowMapper对象映射结果对象中的数据行,就能从query()方法中得到一个映射对象的列表,

    Java代码 复制代码 收藏代码
    1. public class JdbcUserDao implements UserDao{  
    2.   
    3.     public List<User> findAll(){  
    4.   
    5.         String sql = "select *from user";  
    6.         JdbcTemplate jdbcTemplate  = new JdbcTemplate(dataSource);  
    7.   
    8.         List<User> users = jdbcTemplate.query(sql,BeanPropertyRowMapper.newInstance(User.class));  
    9.         return users;  
    10.     }  
    11. }  
    public class JdbcUserDao implements UserDao{
    
    	public List<User> findAll(){
    
    		String sql = "select *from user";
    		JdbcTemplate jdbcTemplate  = new JdbcTemplate(dataSource);
    
    		List<User> users = jdbcTemplate.query(sql,BeanPropertyRowMapper.newInstance(User.class));
    		return users;
    	}
    }
    

    4,查询单值

    最后,看看如何查询单行和单列的结果集。

    Java代码 复制代码 收藏代码
    1. public interface UserDao{  
    2.   
    3.     public String getUsername(int id);  
    4.     public int countAll();  
    5. }  
    public interface UserDao{
    
    	public String getUsername(int id);
    	public int countAll();
    }
    

    要查询单独的字符串值,可以调用重载的queryForObject方法,对于整型值而言,可以调用queryForInt()方法,

    Java代码 复制代码 收藏代码
    1. public class JdbcUserDao implements UserDao{  
    2.   
    3.     public String getUsername(int id){  
    4.   
    5.         String sql = "select username from user where id =?";  
    6.         JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource);  
    7.   
    8.         String username =(String)jdbcTempalte.queryForObject(sql,new Object[]{id},String.class);  
    9.         return username;  
    10.     }  
    11.   
    12.     public int countAll(){  
    13.   
    14.         String sql ="select count(*) from user";  
    15.         JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource);  
    16.           
    17.         int count = jdbcTemplate.queryForInt(sql);  
    18.         return count;  
    19.     }  
    20. }  
    public class JdbcUserDao implements UserDao{
    
    	public String getUsername(int id){
    
    		String sql = "select username from user where id =?";
    		JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource);
    
    		String username =(String)jdbcTempalte.queryForObject(sql,new Object[]{id},String.class);
    		return username;
    	}
    
    	public int countAll(){
    
    		String sql ="select count(*) from user";
    		JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource);
    		
    		int count = jdbcTemplate.queryForInt(sql);
    		return count;
    	}
    }

    可以通过下面的代码测试上面的数据

    Java代码 复制代码 收藏代码
    1. public class Main{  
    2.   
    3.     public static void main(String[] args){  
    4.   
    5.         UserDao dao =new JdbcUserDao();  
    6.         int count = dao.countAll();  
    7.         System.out.println("user count :"+count);  
    8.         String username = dao.getUsername(1);  
    9.         System
    生活赋予我们一种巨大的和无限高贵的礼品,这就是青春:充满着力量,充满着期待志愿,充满着求知和斗争的志向,充满着希望信心和青春。
  • 相关阅读:
    对于近期学习上的复习与整理
    ACM的奇计淫巧_输入挂
    hdu2602 DP (01背包)
    hdu 1723 DP/递推
    hdu1428 记忆化搜索(BFS预处理最短路径和+DP+DFS)
    hdu1355
    hdu1331&&hdu1579记忆化搜索(DP+DFS)
    hdu1257 dp(最长上升子序列)
    hdu1208 dp
    hdu 1203 dp(关于概率的```背包?)
  • 原文地址:https://www.cnblogs.com/ysq0908/p/4712281.html
Copyright © 2011-2022 走看看