spring jdbcTemplate
jdbcTemplate是Spring针对JDBC代码失控提供的解决方案,严格来说,它本身也不算成功。但是无论如何jdbcTemplate的方案也体现了Spring框架的主导思想之一:给予常用技术提供模板化的编程
对jdbcTemplate进行配置
<?xml version='1.0' encoding='UTF-8' ?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xmlns:aop="http://www.springframework.org/schema/aop" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.0.xsd"> <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate"> <property name="dataSource" ref="dataSource"/> </bean> <!-- 数据库连接池 --> <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"> <property name="driverClassName" value="com.mysql.cj.jdbc.Driver"/> <property name="url" value="jdbc:mysql://localhost:3306/springmvc?useSSL=false&serverTimezone=Hongkong&characterEncoding=utf-8&autoReconnect=true"/> <property name="username" value="root"/> <property name="password" value="123456"/> <!--连接池的最大数据库连接数--> <property name="maxActive" value="255"/> <!--最大等待连接中的数量--> <property name="maxIdle" value="5"/> <!--最大等待毫秒数--> <property name="maxWait" value="10000"/> </bean> </beans>
代码清单:通过jdbcTemplate操作数据库
ApplicationContext ctx = new ClassPathXmlApplicationContext("ssm/chapter12/spring-cfg.xml"); JdbcTemplate jdbcTemplate = ctx.getBean(JdbcTemplate.class); Long id = 1L; String sql = "select id, role_name, note from t_role where id = " + id; Role role = jdbcTemplate.queryForObject(sql, new RowMapper<Role>() { @Override public Role mapRow(ResultSet rs, int rownum) throws SQLException { Role result = new Role(); result.setId(rs.getLong("id")); result.setRoleName(rs.getString("role_name")); result.setNote(rs.getString("note")); return result; } }); System.out.println(role.toString());
queryForObject方法。它包含两个参数,一个是SQL,另一个是RowMapper接口,这里笔者使用了匿名类,所以采用了new关键字去创建一个RowMapper接口对象。如果开发环境是Java 8的,也可以使用Lambda表达式的写法
代码清单:使用Lambda表达式
Role role2 = jdbcTemplate.queryForObject(sql, (ResultSet rs, int rownum) -> { Role result = new Role(); result.setId(rs.getLong("id")); result.setRoleName(rs.getString("role_name")); result.setNote(rs.getString("note")); return result; }); System.out.println(role2.toString());
这样就更为清晰一些,不过它们都是大同小异的写法,在mapRow方法中,从ResultSet对象中取出查询得到的数据,组装成一个Role对象,而无须再写任何关闭数据库资源的代码。因为jdbcTemplate内部实现了它们,这便是Spring所提供的模板规则。
jdbcTemplate的增、删、查、改
代码清单:jdbcTemplate的增、删、查、改
package com.ssm.chapter12.jdbc; import com.ssm.chapter11.game.pojo.Role; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.jdbc.core.RowMapper; import java.sql.ResultSet; import java.sql.SQLException; import java.util.List; public class MainTest { public static void main(String[] args) { ApplicationContext ctx = new ClassPathXmlApplicationContext("ssm/chapter12/spring-cfg.xml"); JdbcTemplate jdbcTemplate = ctx.getBean(JdbcTemplate.class); insertRole(jdbcTemplate); List roleList = findRole(jdbcTemplate, "role"); System.out.println(roleList.toString()); Role role3 = new Role(); role3.setId(5L); role3.setRoleName("update_role_name_5"); role3.setNote("update_note_5"); int i = updateRole(jdbcTemplate, role3); System.out.println("update:" + i); int i1 = deleteRole(jdbcTemplate, 5L); System.out.println("delete:" + i1); } /*** * 插入角色 * @param jdbcTemplate --模板 * @return 影响条数 */ public static int insertRole(JdbcTemplate jdbcTemplate) { String roleName = "role_name_1"; String note = "note_1"; String sql = "insert into t_role(role_name, note) values(?, ?)"; return jdbcTemplate.update(sql, roleName, note); } /** * 删除角色 * @param jdbcTemplate 模板 * @param id 角色编号,主键 * @return 影响条数 */ public static int deleteRole(JdbcTemplate jdbcTemplate, Long id) { String sql = "delete from t_role where id=?"; return jdbcTemplate.update(sql, id); } public static int updateRole(JdbcTemplate jdbcTemplate, Role role) { String sql = "update t_role set role_name=?, note = ? where id = ?"; return jdbcTemplate.update(sql, role.getRoleName(), role.getNote(), role.getId()); } /** * 查询角色列表 * @param jdbcTemplate 模板 * @param roleName 角色名称 * @return 角色列表 */ public static List<Role> findRole(JdbcTemplate jdbcTemplate, String roleName) { String sql = "select id, role_name, note from t_role where role_name like concat('%',?, '%')"; Object[] params = {roleName};//组织参数 // 使用RowMapper接口组织返回(使用lambda表达式) List<Role> list = jdbcTemplate.query(sql, params, (ResultSet rs, int rowNum) -> { Role result = new Role(); result.setId(rs.getLong("id")); result.setRoleName(rs.getString("role_name")); result.setNote(rs.getString("note")); return result; }); return list; } }