JdbcTemplate主要提供以下五类方法:
execute方法:可以用于执行任何SQL语句,一般用于执行DDL语句;
update方法及batchUpdate方法:update方法用于执行新增、修改、删除等语句;batchUpdate方法用于执行批处理相关语句;
query方法及queryForXXX方法:用于执行查询相关语句;
call方法:用于执行存储过程、函数相关语句。
JdbcTemplate类支持的回调类:
预编译语句及存储过程创建回调:用于根据JdbcTemplate提供的连接创建相应的语句;
PreparedStatementCreator:通过回调获取JdbcTemplate提供的Connection,由用户使用该Conncetion创建相关的PreparedStatement;
CallableStatementCreator:通过回调获取JdbcTemplate提供的Connection,由用户使用该Conncetion创建相关的CallableStatement;
预编译语句设值回调:用于给预编译语句相应参数设值;
PreparedStatementSetter:通过回调获取JdbcTemplate提供的PreparedStatement,由用户来对相应的预编译语句相应参数设值;
BatchPreparedStatementSetter:;类似于PreparedStatementSetter,但用于批处理,需要指定批处理大小;
自定义功能回调:提供给用户一个扩展点,用户可以在指定类型的扩展点执行任何数量需要的操作;
ConnectionCallback:通过回调获取JdbcTemplate提供的Connection,用户可在该Connection执行任何数量的操作;
StatementCallback:通过回调获取JdbcTemplate提供的Statement,用户可以在该Statement执行任何数量的操作;
PreparedStatementCallback:通过回调获取JdbcTemplate提供的PreparedStatement,用户可以在该PreparedStatement执行任何数量的操作;
CallableStatementCallback:通过回调获取JdbcTemplate提供的CallableStatement,用户可以在该CallableStatement执行任何数量的操作;
结果集处理回调:通过回调处理ResultSet或将ResultSet转换为需要的形式;
RowMapper:用于将结果集每行数据转换为需要的类型,用户需实现方法mapRow(ResultSet rs, int rowNum)来完成将每行数据转换为相应的类型。
RowCallbackHandler:用于处理ResultSet的每一行结果,用户需实现方法processRow(ResultSet rs)来完成处理,在该回调方法中无需执行rs.next(),该操作由JdbcTemplate来执行,用户只需按行获取数据然后处理即可。
ResultSetExtractor:用于结果集数据提取,用户需实现方法extractData(ResultSet rs)来处理结果集,用户必须处理整个结果集;
1: JdbcTemplate
1.1 query
单个对象
/** * 处理单个对象 */ @Test public void test_1() { JdbcTemplate jdbcTemplate = new JdbcTemplate(JDBCUtils.getDataSource()); String sql = "select * from student where id=1"; Student student = jdbcTemplate.query(sql, new ResultSetExtractor<Student>() { @Override public Student extractData(ResultSet res) throws SQLException, DataAccessException { Student student = null; while (res.next()) { int id = res.getInt("id"); String name = res.getString("name"); boolean gender = res.getBoolean("gender"); Date birthday = res.getDate("birthday"); student = new Student(id, name, gender, birthday); } return student; } }); System.out.println(student); } @Test public void test_2() { JdbcTemplate jdbcTemplate = new JdbcTemplate(JDBCUtils.getDataSource()); String sql = "select * from student where id=1"; // 这里演示RowCallbackHandler 上面也可以使用函数式写法 不能返回 jdbcTemplate.query(sql, (res)-> { String name = res.getString("name"); System.out.println(name); }); } @Test public void test_3() { JdbcTemplate jdbcTemplate = new JdbcTemplate(JDBCUtils.getDataSource()); String sql = "select * from student where id=1"; Student stu = jdbcTemplate.query(sql, (res)->{ Student student = null; while (res.next()) { int id = res.getInt("id"); String name = res.getString("name"); boolean gender = res.getBoolean("gender"); Date birthday = res.getDate("birthday"); student = new Student(id, name, gender, birthday); } return student; }); System.out.println(stu); } //聚集函数 @Test public void test_4() { JdbcTemplate jdbcTemplate = new JdbcTemplate(JDBCUtils.getDataSource()); String sql = "select count(*) from student"; Integer inx = jdbcTemplate.queryForObject(sql, Integer.class); System.out.println(inx); } @Test public void test_5() { JdbcTemplate jdbcTemplate = new JdbcTemplate(JDBCUtils.getDataSource()); String sql = "select id from student"; List<Integer> list = jdbcTemplate.queryForList(sql, Integer.class); }
List Map
/** * 处理单个对象 */ @Test public void test_1() { JdbcTemplate jdbcTemplate = new JdbcTemplate(JDBCUtils.getDataSource()); String sql = "select * from student where id=1"; Student student = jdbcTemplate.query(sql, new ResultSetExtractor<Student>() { @Override public Student extractData(ResultSet res) throws SQLException, DataAccessException { Student student = null; while (res.next()) { int id = res.getInt("id"); String name = res.getString("name"); boolean gender = res.getBoolean("gender"); Date birthday = res.getDate("birthday"); student = new Student(id, name, gender, birthday); } return student; } }); System.out.println(student); } @Test public void test_2() { JdbcTemplate jdbcTemplate = new JdbcTemplate(JDBCUtils.getDataSource()); String sql = "select * from student where id=1"; // 这里演示RowCallbackHandler 上面也可以使用函数式写法 不能返回 jdbcTemplate.query(sql, (res)-> { String name = res.getString("name"); System.out.println(name); }); } @Test public void test_3() { JdbcTemplate jdbcTemplate = new JdbcTemplate(JDBCUtils.getDataSource()); String sql = "select * from student where id=1"; Student stu = jdbcTemplate.query(sql, (res)->{ Student student = null; while (res.next()) { int id = res.getInt("id"); String name = res.getString("name"); boolean gender = res.getBoolean("gender"); Date birthday = res.getDate("birthday"); student = new Student(id, name, gender, birthday); } return student; }); System.out.println(stu); } //聚集函数 @Test public void test_4() { JdbcTemplate jdbcTemplate = new JdbcTemplate(JDBCUtils.getDataSource()); String sql = "select count(*) from student"; Integer inx = jdbcTemplate.queryForObject(sql, Integer.class); System.out.println(inx); } @Test public void test_5() { JdbcTemplate jdbcTemplate = new JdbcTemplate(JDBCUtils.getDataSource()); String sql = "select id from student"; List<Integer> list = jdbcTemplate.queryForList(sql, Integer.class); }
1.2 upadte
@Test public int insertUser(Student stu) { JdbcTemplate jdbcTemplate = new JdbcTemplate(JDBCUtils.getDataSource()); String sql = "insert into student values(null,?,?,?)"; return jdbcTemplate.update(sql, new Object[] { stu.getName(), stu.isGender(), stu.getBirthday() }); } @Test public int delete(int id) { JdbcTemplate jdbcTemplate = new JdbcTemplate(JDBCUtils.getDataSource()); String sql = "delete from student where id=?"; return jdbcTemplate.update(sql, 1); }
2:NamedParameterJdbcTemplate
使用与JdbcTemplate 最大的区别就是 使用命名符号来代表占位符? 使SQl 容易理解 但是 代码量增加了,取舍在于个人
@Test public void findById() { NamedParameterJdbcTemplate template = new NamedParameterJdbcTemplate(JDBCUtils.getDataSource()); String sql="select * FROM student where name like (:regxp)"; /* * jdbctemplate 用?站位 * NamedParameterJdbcTemplate : 使用:xxx 站位 通过hashmap 写入参数 * map: * String:参数名称 * Object:参数值 */ HashMap<String, Object> paMap = new HashMap<>(); paMap.put("regxp", "%"); BeanPropertyRowMapper<Student> rowMapper = new BeanPropertyRowMapper<>(Student.class); List<Student> list = template.query(sql,paMap, rowMapper); System.out.println(list); } @Test public void insert_Stu() { NamedParameterJdbcTemplate template = new NamedParameterJdbcTemplate(JDBCUtils.getDataSource()); String sql="insert into student(name,gender,birthday) values(:name,:gender,:birthday)"; HashMap<String, Object> paramMap = new HashMap<>(); paramMap.put("name", "如来佛祖"); paramMap.put("gender", "1"); paramMap.put("birthday", "2019-2-2"); if(template.update(sql, paramMap)>0) { System.out.println("true"); } }