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&amp;serverTimezone=Hongkong&amp;characterEncoding=utf-8&amp;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;
    }

}

 

posted @ 2019-06-15 10:01  草木物语  阅读(350)  评论(0编辑  收藏  举报