JdbcTemplate

JdbcTemplate
1、 概述
 为了使JDBC更加易于使用,Spring在JDBC API上定义了一个抽象层,以此建立一个JDBC存取框架。
 作为Spring JDBC框架的核心,JDBC模板的设计目的是为不同类型的JDBC操作提供模板方法,通过这种方式,可以在尽可能保留灵活性的情况下,将数据库存取的工作量降到最低。
 可以将Spring的JdbcTemplate看作是一个小型的轻量级持久化层框架,和我们之前使用过的DBUtils风格非常接近。

2、环境准备:导入JAR包
  1) IOC容器所需要的JAR包
    commons-logging-1.1.1.jar
    spring-beans-4.0.0.RELEASE.jar
    spring-context-4.0.0.RELEASE.jar
    spring-core-4.0.0.RELEASE.jar
    spring-expression-4.0.0.RELEASE.jar
  2) JdbcTemplate所需要的JAR包
    spring-jdbc-4.0.0.RELEASE.jar
    spring-orm-4.0.0.RELEASE.jar
    spring-tx-4.0.0.RELEASE.jar
  3) 数据库驱动和数据源
    druid-1.1.9.jar
    mysql-connector-java-5.1.7-bin.jar

3、创建连接数据库基本信息属性文件

jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/ssm
jdbc.username=root
jdbc.password=123456

4、在Spring配置文件中配置相关的bean

<?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"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd">

    <!-- 引入属性文件 -->
    <!-- <bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
        <property name="location" value="db.properties"></property>
    </bean> -->
    
    <!-- 引入属性文件 -->
    <context:property-placeholder location="db.properties"/>

    <!-- 创建数据源 -->
    <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
        <property name="driverClassName" value="${jdbc.driver}"></property>
        <property name="url" value="${jdbc.url}"></property>
        <property name="username" value="${jdbc.username}"></property>
        <property name="password" value="${jdbc.password}"></property>
    </bean>

    <!-- 通过数据源配置JdbcTemplate -->
    <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
        <property name="dataSource" ref="dataSource"></property>
    </bean>

</beans>

5、持久化操作
1) 增删改
  JdbcTemplate.update(String, Object...)
2) 批量增删改
  JdbcTemplate.batchUpdate(String, List<Object[]>)
    Object[]封装了SQL语句每一次执行时所需要的参数
    List集合封装了SQL语句多次执行时的所有参数
3) 查询单行
  JdbcTemplate.queryForObject(String, RowMapper<Department>, Object...)

4) 查询多行

  JdbcTemplate.query(String, RowMapper<Department>, Object...)
  RowMapper对象依然可以使用BeanPropertyRowMapper
5) 查询单一值
  JdbcTemplate.queryForObject(String, Class, Object...)

package com.atguigu.jdbctempalte;

import static org.junit.Assert.*;

import java.util.ArrayList;
import java.util.List;

import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.jdbc.core.BeanPropertyRowMapper;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.RowMapper;

public class TestJdbcTemplate {

    ApplicationContext ac = new ClassPathXmlApplicationContext("jdbc.xml");
    JdbcTemplate jdbcTemplate = ac.getBean("jdbcTemplate", JdbcTemplate.class);

    @Test
    public void testUpdate() {
        //jdbcTemplate.update("insert into emp values(null,'张三',23,'男')");
        /*String sql = "insert into emp values(null, ?, ?, ?)";
        jdbcTemplate.update(sql, "李四", 24, "女");//单个增删改*/    
        
        String eids = "3,4,5";
        String sql = "delete from emp where eid in ("+eids+")";
        jdbcTemplate.update(sql);
        
        String mohu = "a";
        String sqls = "select * from emp where ename like '%?%'";//错误的方式,不能加单引号'',因该是 like %?%;
        String sqlss = "select * from emp where ename like concat('%', ? ,'%')";//可以使用
        // 不能使用通配符?的情况
//where id in (?)   ->使用字符串拼接,原因:?会加上单引号'', 而 in('1,2,3'),的效果仅仅是查询第一个1.
        //② 模糊查询 like '?'   ->采用concat()函数拼接
        
    }
    
    @Test
    public void testBatchUpdate() {
        String sql = "insert into emp values(null, ?, ?, ?)";
        List<Object[]> list = new ArrayList<>();
        list.add(new Object[] {"a1", 1, "男"});
        list.add(new Object[] {"a2", 2, "男"});
        list.add(new Object[] {"a3", 3, "男"});
        jdbcTemplate.batchUpdate(sql, list);//批量增删改
    }

    @Test
    public void testQueryForObject() {
        //jdbcTemplate.queryForObject(sql, requiredType)用来获取单个的值
        //jdbcTemplate.queryForObject(sql, rowMapper)用来获取单条数据
        /*String sql = "select eid,ename,age,sex from emp where eid = ?";
        RowMapper<Emp> rowMapper = new BeanPropertyRowMapper<>(Emp.class);//将列名(字段名或字段名的别名)与属性名进行映射
        Emp emp = jdbcTemplate.queryForObject(sql, new Object[] {7}, rowMapper);
        System.out.println(emp);*/
        
        String sql = "select count(*) from emp";
        Integer count = jdbcTemplate.queryForObject(sql, Integer.class);
        System.out.println(count);
    }
    
    @Test
    public void testQuery() {
        String sql = "select eid,ename,age,sex from emp";
        RowMapper<Emp> rowMapper = new BeanPropertyRowMapper<>(Emp.class);
        List<Emp> list = jdbcTemplate.query(sql, rowMapper);
        for (Emp emp : list) {
            System.out.println(emp);
        }
    }
}
package com.atguigu.jdbctempalte;

public class Emp {

    private Integer eid;
    
    private String ename;
    
    private Integer age;
    
    private String sex;

    public Integer getEid() {
        return eid;
    }

    public void setEid(Integer eid) {
        this.eid = eid;
    }

    public String getEname() {
        return ename;
    }

    public void setEname(String ename) {
        this.ename = ename;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    public String getSex() {
        return sex;
    }

    public void setSex(String sex) {
        this.sex = sex;
    }

    @Override
    public String toString() {
        return "Emp [eid=" + eid + ", ename=" + ename + ", age=" + age + ", sex=" + sex + "]";
    }
    
}
Emp

 

posted @ 2020-05-18 17:58  kkzhang  阅读(353)  评论(0编辑  收藏  举报