在上次的操作中只是简单的利用了spring容器中注入dataSource元素来建立数据库的连接,而没有发挥出spring框架的核心作用。这里在继续对spring进行深入的理解:
在进行数据库操作时,我们每次都要进行一次链接,一来很费时费力,二来对以后的开发起不到很好的作用。
因此这里我们借助spring对JDBC的强大支持利用JDBCTemplate类来对JDBC的控制(调用、执行、查询、更新),JDBCTemplate的操作步骤如下:
- 打开数据库连接。
- 指定在连接上执行的语句。
- 设置要求的参数并执行语句。
- 如需求,可以得到Reslutset,迭代返回结果,接着不管任何异常关闭Reslutset。
- 运行每次迭代的代码,若没有要求迭代,只返回单个值。
- 处理SQLException事例。
- 处理所有活动的事物(判断是否提交,回滚)。
- 关闭链接
这里我们用到的JDBCTemplate的类函数:
query方法:查询存数据的方法,一大堆的函数啊。我们只用到了(ArrayList<Student>) jdbcTemplate.query("select * from student", new StudentRowMapper());
update方法:一般是修改啊更新啊删除啊操作,int update(string ,Object[],int[])string则是我们写的sql语句了,object[]是我们在javabean中的定义的类型参数,int[]类型参数的类型。例如:jdbcTemplate.update("delete from student where id=?",new Object[]{id}, newint[]{java.sql.Types.INTEGER});
execute方法:没有来得及看呢。
这里是现实类StudentServiceImpl方法体
public class StudentServiceImpl implements StudentService { private JdbcTemplate jdbcTemplate; /** * @param jdbcTemplate the jdbcTemplate to set */ public void setDataSource(DataSource dataSource) { this.jdbcTemplate = new JdbcTemplate(dataSource); } /* (non-Javadoc) * @see com.ncut.service.StudentService#queryStudent() */ public ArrayList<Student> queryStudent() { //List query(String sql,Ojbect[] args,RowMapper rowMapper) // 说明:常用的查询,sql待执行的sql语句,args是sql语句的参数,rowMapper负责将每一行记录转化为java对象存放在list,并最终返回 return (ArrayList<Student>) jdbcTemplate.query("select * from student", new StudentRowMapper()); } public void delete(Integer id) throws Exception{ jdbcTemplate.update("delete from student where id=?", new Object[]{id}, new int[]{java.sql.Types.INTEGER}); public Student getStudent(Integer id) { return (Student)jdbcTemplate.queryForObject("select * from student where id=?", new Object[]{id}, new int[]{java.sql.Types.INTEGER}, new StudentRowMapper()); } public void save(Student student) { jdbcTemplate.update("insert into student(username) values(?)", new Object[]{student.getUsername()}, new int[]{java.sql.Types.VARCHAR}); } }其中StudentRowMapper是按照重载函数RowMapper的要求写的:
public class StudentRowMapper implements RowMapper { public Object mapRow(ResultSet rs,int index) throws SQLException { Student student=new Student(); student.setUsername(rs.getString("username")); student.setPassword(rs.getString("password")); return student; } } 最后的测试方法SpringJDBC: public class SpringJDBC { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub ApplicationContext ctx=new ClassPathXmlApplicationContext("applicationContext.xml"); StudentService studentService=(StudentService) ctx.getBean("studentService"); ArrayList<Student> list=studentService.queryStudent(); for(Student student:list){ System.out.println("您的用户名是:"+student.getUsername()); System.out.println("您的年龄是"+student.getAge()); } } }其中为了测试重载函数的作用,加了一条语句System.out.println("您的年龄是"+student.getAge());
结果没有取到age的值,证明了RowMapper的作用RowMapper.mapRow(ResultSet,int)方法返回的对象曾加到list上,并将List返回给调用者
public Item insert(Item item) { String sql = "INSERT INTO items(user_id,name,phone,email) VALUES(?,?,?,?)"; Object[] params = new Object[]{item.getUserId(),item.getName(),item.getPhone(),item.getEmail()}; int[] types = new int[]{Types.INTEGER,Types.VARCHAR,Types.CHAR,Types.VARCHAR}; jdbcTemplate.update(sql,params,types); return item; } public Item update(Item item) { String sql = "UPDATE items SET name = ?, phone = ?, email = ? WHERE id = ?"; Object[] params = new Object[] {item.getName(),item.getPhone(),item.getEmail(),item.getId()}; int[] types = new int[] {Types.VARCHAR,Types.CHAR,Types.VARCHAR,Types.VARCHAR,Types.INTEGER}; jdbcTemplate.update(sql,params,types); return item; } public void delete(Item item) { String sql = "DELETE FROM items WHERE id = ?"; Object[] params = new Object[] {item.getId()}; int[] types = new int[]{Types.INTEGER}; jdbcTemplate.update(sql,params,types); } public Item findById(int id) { String sql = "SELECT * FROM items WHERE id = ?"; Object[] params = new Object[] {id}; int[] types = new int[] {Types.INTEGER}; List items = jdbcTemplate.query(sql,params,types,new ItemMapper()); if(items.isEmpty()){ return null; } return (Item)items.get(0); } public List<Item> findAll() { String sql = "SELECT * FROM items"; return jdbcTemplate.query(sql,new ItemMapper()); } public List<Item> findAllByUser(int user_id) { String sql = "SELECT * FROM items WHERE user_id = ?"; Object[] params = new Object[]{user_id}; int[] types = new int[]{Types.INTEGER}; List items = jdbcTemplate.query(sql,params,types,new ItemMapper()); return items; }