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


    目录

    基本介绍

    准备工作

    导入相应jar包

    创建配置数据库配置文件

    spring配置文件中配置

    创建一个测试表

    JdbcTemplate常见方法

    update增删改操作

    batchUpdate进行批量操作

     selectForObject查询单行单列

     selectForObject查询单行

     query查询多行

     扩展(NameParameterJdbcTemplate)

    使用前准备工作

    具名update增删改操作(Map)

    具名update增删改操作(Object)

    总结


    基本介绍

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


    准备工作

    导入相应jar包

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

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


    创建配置数据库配置文件

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

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

    spring配置文件中配置

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

    1. <!--引入外部配置文件-->
    2. <context:property-placeholder location="mysql_info.properties"/>
    3. <!--配置数据库源信息-->
    4. <bean class="com.mchange.v2.c3p0.ComboPooledDataSource" id="dataSource">
    5. <property name="user" value="${jdbc.name}"/>
    6. <property name="password" value="${jdbc.password}"/>
    7. <property name="driverClass" value="${jdbc.driver}"/>
    8. <property name="jdbcUrl" value="${jdbc.url}"/>
    9. </bean>
    10. <!--将数据源注入JdbcTemplate-->
    11. <bean class="org.springframework.jdbc.core.JdbcTemplate" id="jdbcTemplate">
    12. <property name="dataSource" ref="dataSource"/>
    13. </bean>

    创建一个测试表

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

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

    1. public class User {
    2. private Integer uid;
    3. private String username;
    4. private String password;
    5. public User(Integer uid, String username, String password) {
    6. this.uid = uid;
    7. this.username = username;
    8. this.password = password;
    9. }
    10. @Override
    11. public String toString() {
    12. return "User{" +
    13. "uid=" + uid +
    14. ", username='" + username + '\'' +
    15. ", password='" + password + '\'' +
    16. '}';
    17. }
    18. public Integer getUid() {
    19. return uid;
    20. }
    21. public void setUid(Integer uid) {
    22. this.uid = uid;
    23. }
    24. public String getUsername() {
    25. return username;
    26. }
    27. public void setUsername(String username) {
    28. this.username = username;
    29. }
    30. public String getPassword() {
    31. return password;
    32. }
    33. public void setPassword(String password) {
    34. this.password = password;
    35. }
    36. public User() {
    37. }
    38. }

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

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

    JdbcTemplate常见方法

    update增删改操作

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

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

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

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


    batchUpdate进行批量操作

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

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

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

             运行后user表如下


     selectForObject查询单行单列

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

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

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

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


     selectForObject查询单行

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

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

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

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

            控制台输出如下


     query查询多行

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

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

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

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

             输出如下


     扩展(NameParameterJdbcTemplate)

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


    使用前准备工作

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

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

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

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

    具名update增删改操作(Map)

            先来看一下update支持的参数

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

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

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

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


    具名update增删改操作(Object)

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

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

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

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

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

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


    总结

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

  • 相关阅读:
    剑指 Offer II 036. 后缀表达式
    案例:恒流负载导致的启动故障
    高项 08 项目质量管理
    【SSM框架】测试 修改.删除.查询功能
    十三. 实战——常用依赖的作用
    谈谈我们是如何实践 OKR 的(多年宝贵实践经验逼坑指南)
    MySQL - Heap 表是什么?
    记一次gitlab平台任意用户注册引发的源代码泄漏
    nacos2-配置中心
    基于共词分析的中国近代史实体关系图构建(毕业设计:数据处理)
  • 原文地址:https://blog.csdn.net/m0_51545690/article/details/125458533