List query(String sql, PreparedStatementSetterpss, RowMapper rowMapper):该方法根据String类型参数提供的SQL语句创建PreparedStatement对象,通过RowMapper将结果返回到List中;
List query(String sql,Object[] args, RowMapper rowMapper):该方法使用Object[]的值来设置SQL中的参数值,采用RowMapper回调方法可以直接返回List类型的数据;
queryForObject(String sql,Object[]args, RowMapper rowMapper):该方法将args参数绑定到SQL语句中,通过RowMapper返回单行记录,并转换为一个Object类型返回;
queryForList(String sql, Object[] args, class<T>elementType):该方法可以返回多行数据的结果,但必须是返回列表,elementType参数返回的是List元素类型。
接下来,我们尝试一下从t_user表中查询数据,在UserDao接口中增加按照id查询的方法和查询所有用户的方法,在UserDaoImpl中具体实现两个方法,代码如下:
public interface UserDao { //在原有代码基础上增加的两个方法 public User findUserByID(int id); public List<User> findAllUser(); } /* * UserDao接口的具体实现类 */ public class UserDaoImpl implements UserDao{ @Override public User findUserByID(int id) { // TODO Auto-generated method stub String sql = "select * from t_user where userid=?"; //将结果集通过Java的反射机制映射到Java对象中 RowMapper<User> rowMapper = new BeanPropertyRowMapper(User.class); return this.jdbcTemplate.queryForObject(sql, rowMapper, id); } @Override public List<User> findAllUser() { // TODO Auto-generated method stub String sql = "select * from t_user"; RowMapper<User> rowMapper = new BeanPropertyRowMapper(User.class); return this.jdbcTemplate.query(sql, rowMapper); } }
然后在Client类中调用者两个方法,实现对t_user表的查询操作:
public class Client { public static void main(String[] args) { // TODO Auto-generated method stub //定义配置文件路径 String path = "com/jdbc/JdbcTemplateBeans.xml"; //加载配置文件 ApplicationContext applicationContext = new ClassPathXmlApplicationContext(path); User user = userDao.findUserByID(2); System.out.println(user); List<User> userList = userDao.findAllUser(); for(User u : userList){ System.out.println(u); } } }
同时呢,User类中应该覆写toString()方法,输出用户ID、用户名和用户密码:
public class User { //在原有代码基础上覆写toString()方法 @Override public String toString(){ return "user ID:" + this.getUserID() + " userName:" + this.getUserName() + " user password:" + this.getPassword(); } }
运行该程序发现在Java反射的过程中password属性的值为null,即没有将数据库中的值映射到User对象中,那么问题出在哪里呢?数据库表t_user中密码字段标签为password,然而Java在反射的过程中,会在User类中找setPassword(String password)方法,而本片博客的User类中设置密码的方法为setPasswd(String passwd),导致在反射过程中无法找到setPassword(String password)方法,最终才会导致查询出来的password字段值为空,解决方法当然是将User类中的setPasswd(String passwd)方法改名为setPassword(String password)即可。
本文介绍了JdbcTemplate类对mysql数据库的操作,包括execute()、update()、query()三种方法,并通过案例演示了三种方法的使用。