Spring整合JDBC(2)

发表时间:2017-07-18 18:02:26 浏览量( 24 ) 留言数( 0 )

学习目标:

1、了解Java的历史

2、为什么要学习Java语言

3、端正学习态度


学习过程:

这节课我们继续讲解操作数据库,上一节我们已经讲过如何连接和对数据进行简单的操作了,可见这个jdbcTemplate和我们之前封装的BaseDao的使用差不多,事实这个jdbcTemplate还有很多高级的使用方法。下面我们就简单讲解一下。

一、获得用户刚刚插入数据的id

这个问题我们以前做项目的时候碰到过,不同的数据的自增方式是不同的,所有要去的刚刚插入的数据库的那条数据的id不同的数据库也有不同实现方法,但是jdbcTemplate已经帮我们封装好了。所有我们可以很方便的获得这个值,修改add方法,当插入完成后可以获得刚刚插入这条数据在数据库中对应的id。只需要使用KeyHolder对象就可以了,实现代码如下:

   public void add(final Department department) {
		
		final String sql="insert into department(dep_name)  values(?)";
		
/*		jdbcTemplate.update("insert into department(dep_name)  values(?)",
				new Object[] { department.getDepName() });*/
		
		KeyHolder keyHolder=new GeneratedKeyHolder();
		jdbcTemplate.update(new PreparedStatementCreator() {
			
			public PreparedStatement createPreparedStatement(Connection arg0)
					throws SQLException {
				
				PreparedStatement ps=jdbcTemplate.getDataSource().getConnection().prepareStatement(sql);
				ps.setString(1, department.getDepName());
				return ps;
			}
		},keyHolder);
		
		//重新set进去
		department.setDepId(keyHolder.getKey().intValue());

	}

再次测试上面的代码

   public static void main(String[] args) {
		ApplicationContext context = new FileSystemXmlApplicationContext(
				"src/springContext.xml");

		DepartmentDao departmentDao = (DepartmentDao) context
				.getBean("departmentDao");


		 Department department = new Department();
		 department.setDepName("test2"); 
		 departmentDao.add(department);
		 System.out.println("数据库对应生成的id:"+department.getDepId());

	}

控制台如下:

二、查询操作

下面我们研究一下查询操作,原始的jdbc查询是返回的是ResultSet对象,然后把数据库的字段值逐个set到javaBean对象的属性中。jdbcTemplate也是差不多,只是它返回的是一个Map对象,map的key对应的就是字段名称,下面我们实现根据id进行查询的操作,代码如下:

   public Department query(int id) {
		Department department = null;

		// 如果不使用RowMapper,那么就像以前ResultSet一样要一个个的set进去了。
		List<Map> maps = jdbcTemplate.queryForList(
				"select * from department where dep_id=?", new Object[] { id });

		if (maps != null && maps.size() > 0) {
			Map<Object, Object> map = maps.get(0);
			department = new Department();
			department.setDepId((Integer) map.get("dep_id"));
			department.setDepName(map.get("dep_name").toString());
		}

		return department;
	}

记得以前我们封装的高级jdbc把,那时候我们通过反射的方式写了一个自动ResultSet到javaBean对象的转换,其实jdbcTemplate也有类似的实现,只需要你实现RowMapper接口就可以了,我们使用内部类的方式,代码如下:

   class DepartmentMap implements RowMapper{

		public Object mapRow(ResultSet rs, int arg1) throws SQLException {
			Department department=new Department();
			
			department.setDepId(rs.getInt("dep_id"));
			department.setDepName(rs.getString("dep_name"));
			
			return department;
		}
	
	}

实现查询全部和根据名称查询两个方法,只需要传入DepartmentMap对象就可以了。代码如下:

   public List<Department> queryByCondition() {

	List<Department> departments = jdbcTemplate.query("select * from department", new DepartmentMap());

	return departments;
}

public List<Department> queryByCondition(String name) {
  List<Department> departments = jdbcTemplate.query("select * from department where dep_name like '%"+name+"%'", new DepartmentMap());

	return departments;	
}

你可以在main方法中测试一下:

   List<Department> departments=departmentDao.queryByCondition("t");
for(Department department2:departments){
    System.out.println(department2.getDepName());
}