目录

基本介绍

准备工作

导入相应jar包

创建配置数据库配置文件

spring配置文件中配置

创建一个测试表

JdbcTemplate常见方法

update增删改操作

batchUpdate进行批量操作

 selectForObject查询单行单列

 selectForObject查询单行

 query查询多行

 扩展(NameParameterJdbcTemplate)

使用前准备工作

具名update增删改操作(Map)

具名update增删改操作(Object)

总结


基本介绍

        JdbcTemplate是spring提供的用来操作数据库的一个类,功能十分强大,我们只需传入一个DataSource便可以进行各种crud操作。


准备工作

导入相应jar包

        要使用JdbcTemplate第一步就是要先引入相应的jar包,由于要操作数据库,也要引入连接数据库的jar包,还有就是数据库连接池技术的包,下面我用的是c3p0。

springboot 一个方法 先update再查询 spring select for update_jdbcTemplate

         前缀为spring的包都在spring的那个文件夹中,直接复制过来即可。


创建配置数据库配置文件

        在src下面创建一个properties配置文件,将数据库的配置信息写入该配置文件

#数据库登录的用户名
jdbc.name=root
#数据库登录的密码
jdbc.password=root
#连接驱动
jdbc.driver=com.mysql.jdbc.Driver
#要连接的数据库
jdbc.url=jdbc:mysql://localhost:3306/study

spring配置文件中配置

        需要在spring配置文件中指定c3p0连接数据库所需的配置信息,以及要注入JdbcTemplate的DataSource

<!--引入外部配置文件-->
    <context:property-placeholder location="mysql_info.properties"/>

    <!--配置数据库源信息-->
    <bean class="com.mchange.v2.c3p0.ComboPooledDataSource" id="dataSource">
        <property name="user" value="${jdbc.name}"/>
        <property name="password" value="${jdbc.password}"/>
        <property name="driverClass" value="${jdbc.driver}"/>
        <property name="jdbcUrl" value="${jdbc.url}"/>
    </bean>

    <!--将数据源注入JdbcTemplate-->
    <bean class="org.springframework.jdbc.core.JdbcTemplate" id="jdbcTemplate">
        <property name="dataSource" ref="dataSource"/>
    </bean>

创建一个测试表

        下面为表的字段以及表信息

springboot 一个方法 先update再查询 spring select for update_sql_02

springboot 一个方法 先update再查询 spring select for update_sql_03

         然后再创建一个User类来和该表对应,如下

public class User {
    private Integer uid;
    private String username;
    private String password;

    public User(Integer uid, String username, String password) {
        this.uid = uid;
        this.username = username;
        this.password = password;
    }

    @Override
    public String toString() {
        return "User{" +
                "uid=" + uid +
                ", username='" + username + '\'' +
                ", password='" + password + '\'' +
                '}';
    }

    public Integer getUid() {
        return uid;
    }

    public void setUid(Integer uid) {
        this.uid = uid;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public User() {
    }
}

        下一步就是创建一个测试类,将JdbcTemplate定义为成员属性

ApplicationContext ioc = new ClassPathXmlApplicationContext("beans.xml");
    JdbcTemplate jdbcTemplate = ioc.getBean(JdbcTemplate.class);

JdbcTemplate常见方法

update增删改操作

        使用这个方法可以进行增删改操作,可以传入不同参数

springboot 一个方法 先update再查询 spring select for update_java_04

         这里演示对user表插入一条数据,update返回值就是影响的行数,update里面sql后面的参数就是填充在sql语句中的?位置

@Test
    public void t1() {
        String sql = "insert into user value(null,?,?)";
        int affected = jdbcTemplate.update(sql, "lufei", "lufei456");
        System.out.println(affected);
    }

         执行后的数据库如下,插入没有问题,删除和修改类似的

springboot 一个方法 先update再查询 spring select for update_大数据_05


batchUpdate进行批量操作

        上面对数据库的增删改是一条语言,我们使用batchUpdate可以对数据库进行批处理操作,该方法支持的参数如下

springboot 一个方法 先update再查询 spring select for update_java_06

        下面演示向user表批量插入2条数据,我们只需传入sql语句和一个list集合即可,list集合存放参数数组,返回值就是每条语句影响的行数

@Test
    public void t2() {
        String sql = "insert into user value(null,?,?)";
        List<Object[]> list = new ArrayList<>();
        list.add(new Object[]{"luck", "luck888"});
        list.add(new Object[]{"waysn", "ysnyyds"});
        int[] batchUpdate = jdbcTemplate.batchUpdate(sql, list);
        System.out.println(Arrays.toString(batchUpdate));
    }

         运行后user表如下

springboot 一个方法 先update再查询 spring select for update_spring_07


 selectForObject查询单行单列

        查询单行单列就是使用selectForObject,该方法支持参数如下

springboot 一个方法 先update再查询 spring select for update_jdbcTemplate_08

          下面演示使用该方法查询user表的行数

@Test
    public void t3() {
        String sql = "select count(*) from user";
        Integer count = jdbcTemplate.queryForObject(sql, Integer.class);
        System.out.println(count);
    }

         输出如下,没有问题,上面的queryForObject我们在sql语句后面传入的参数就是查询返回的类型

springboot 一个方法 先update再查询 spring select for update_大数据_09


 selectForObject查询单行

        我们还是使用这个方法进行查询,只不过要传入的参数就是该表对应的bean的class,这里就是要传入User.class。(注意:bean的属性名要和数据库表的字段名相对应)。并且由于JdbcTemplate要求传入的是一个RowMapper接口,我们需要传入一个该接口的具体实现类。该接口的实现类如下

springboot 一个方法 先update再查询 spring select for update_java_10

        我们这里选择第一个,因为看起来最有可能是,查看源码,发现构造器有以下注释

springboot 一个方法 先update再查询 spring select for update_大数据_11

         注释说明会对表字段进行映射,那么就是这个类了,将User对象通过构造器构建这个类即可,最终代码如下

@Test
    public void t4() {
        String sql = "select * from user where uid = ?";
        User user = jdbcTemplate.queryForObject(sql, new BeanPropertyRowMapper<>(User.class), 1);
        System.out.println(user);
    }

        控制台输出如下

springboot 一个方法 先update再查询 spring select for update_sql_12


 query查询多行

        上面是查询单行,这里使用query就是查询多行了,首先还是看看query方法支持的参数

springboot 一个方法 先update再查询 spring select for update_sql_13

         可以看见,query的重载方法特别多,但是我们只需要看返回是一个集合的参数即可,发现也是传入一个RowMapper,那么通过上面的queryForObject我们知道传入一个BeanPropertyRowmapper即可,将表对应的bean通过构造器传入。

        下面就是查询user表中的所有记录

@Test
    public void t5() {
        String sql = "select * from user";
        List<User> users = jdbcTemplate.query(sql, new BeanPropertyRowMapper<>(User.class));
        for (User user : users) {
            System.out.println(user);
        }
    }

         输出如下

springboot 一个方法 先update再查询 spring select for update_spring_14


 扩展(NameParameterJdbcTemplate)

        NameParameterJdbcTemplate这个类可以通过具名参数进行查询,相当于使用名称来代替sql语言中的?,能够更直观的知道sql语句的意义。


使用前准备工作

        和JdbcTemplate一样,使用该类,也需要配置这个类的DataSource,下面在spring配置文件中配置NameParameterJdbcTemplate,注入所需的DataSource

<bean class="org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate" id="namedParameterJdbcTemplate">
        <constructor-arg ref="dataSource"/>
    </bean>

        由于我使用的是单元测试,为了方法,将NameParameterJdbcTemplate定义为成员属性

NamedParameterJdbcTemplate namedParameterJdbcTemplate = ioc.getBean(NamedParameterJdbcTemplate.class);

具名update增删改操作(Map)

        先来看一下update支持的参数

springboot 一个方法 先update再查询 spring select for update_spring_15

        下面我们来使用该方法修改id的3的user的username和password

@Test
    public void t6() {
        String sql = "update user set username=:name,password=:pwd where uid=:id";
        Map<String, Object> map = new HashMap<>();
        map.put("id", 3);
        map.put("name", "ttpfx");
        map.put("pwd", "ttpfx123");
        int affected = namedParameterJdbcTemplate.update(sql, map);
        System.out.println(affected);
    }

        对上面的代码进行解释,在sql语句中的:name,:pwd,:id就相当于?占位符,在对数据库进行操作时会进行替换,而具名参数就是使用相同的参数进行替换,例如:name就会使用name对应的值进行替换,而:pwq就会使用pwd对应的值进行替换。在上面代码中,对应的值的意思就是在map中该参数对应的value。相当于:name会用ttpfx进行替换,:pwd会用ttpfx123进行替换。

        运行代码,下面展示的是运行前和运行后的user表

springboot 一个方法 先update再查询 spring select for update_sql_16

springboot 一个方法 先update再查询 spring select for update_java_17


具名update增删改操作(Object)

        上面我们在update中使用的含有Map参数的方法,但是还有其他的方法是传入一个SqlParameterSource,这里来进行演示。

        由于SqlParameterSource是一个接口,所以我们传入的肯定是该接口的实现类,下面展示该接口的实现类

springboot 一个方法 先update再查询 spring select for update_spring_18

         我们选择的是BeanPropertyParameterSource,该类的构造器如下,根据注释推测应该就是我们要寻找的类

springboot 一个方法 先update再查询 spring select for update_jdbcTemplate_19

         下面使用对象的方式,往user表添加一条记录

@Test
    public void t7() {
        String sql = "insert into user value (:id,:username,:password)";
        User user = new User(null, "lufei", "lufei123");
        int affected = namedParameterJdbcTemplate.update(sql, new BeanPropertySqlParameterSource(user));
        System.out.println(affected);
    }

         上面代码中的sql语句中的:id,:username,:password就相当于?占位符,最终会替换为我们我们定义的user中的相应值(注意属性名要相同),执行代码,下面展示user执行前和执行后的截图

springboot 一个方法 先update再查询 spring select for update_sql_20

springboot 一个方法 先update再查询 spring select for update_大数据_21


总结

        上面就讲解了使用spring的JdbcTemplate和NameParameterJdbcTemplate对数据库的基本增删改查操作,这个还是比较简单的,很多方法类似的,直接类推即可。