[spring学习]12、JdbcTemplate常见增删改查操作
  TEZNKK3IfmPf 2023年11月12日 24 0

基本介绍

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


准备工作

导入相应jar包

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

[spring学习]12、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>

创建一个测试表

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

[spring学习]12、JdbcTemplate常见增删改查操作

[spring学习]12、JdbcTemplate常见增删改查操作

         然后再创建一个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增删改操作

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

[spring学习]12、JdbcTemplate常见增删改查操作

         这里演示对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);
    }

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

[spring学习]12、JdbcTemplate常见增删改查操作


batchUpdate进行批量操作

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

[spring学习]12、JdbcTemplate常见增删改查操作

        下面演示向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表如下

[spring学习]12、JdbcTemplate常见增删改查操作


 selectForObject查询单行单列

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

[spring学习]12、JdbcTemplate常见增删改查操作

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

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

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

[spring学习]12、JdbcTemplate常见增删改查操作


 selectForObject查询单行

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

[spring学习]12、JdbcTemplate常见增删改查操作

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

[spring学习]12、JdbcTemplate常见增删改查操作

         注释说明会对表字段进行映射,那么就是这个类了,将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);
    }

        控制台输出如下

[spring学习]12、JdbcTemplate常见增删改查操作


 query查询多行

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

[spring学习]12、JdbcTemplate常见增删改查操作

         可以看见,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);
        }
    }

         输出如下

[spring学习]12、JdbcTemplate常见增删改查操作


 扩展(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支持的参数

[spring学习]12、JdbcTemplate常见增删改查操作

        下面我们来使用该方法修改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表

[spring学习]12、JdbcTemplate常见增删改查操作

[spring学习]12、JdbcTemplate常见增删改查操作


具名update增删改操作(Object)

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

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

[spring学习]12、JdbcTemplate常见增删改查操作

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

[spring学习]12、JdbcTemplate常见增删改查操作

         下面使用对象的方式,往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执行前和执行后的截图

[spring学习]12、JdbcTemplate常见增删改查操作

[spring学习]12、JdbcTemplate常见增删改查操作


总结

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

【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年11月12日 0

暂无评论

推荐阅读
  TEZNKK3IfmPf   2024年05月17日   48   0   0 dremiosqltable
  TEZNKK3IfmPf   2024年04月26日   56   0   0 java数据库sql
  TEZNKK3IfmPf   2024年05月17日   46   0   0 JSpspring
  TEZNKK3IfmPf   2024年05月17日   52   0   0 sqlmysql
  TEZNKK3IfmPf   2024年05月17日   38   0   0 sqlcube
TEZNKK3IfmPf