Spring自带的jdbc用JdbcTemplate类

Posted 旺旺a

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Spring自带的jdbc用JdbcTemplate类相关的知识,希望对你有一定的参考价值。

参考:https://blog.csdn.net/qq_23329167/article/details/81841996#commentBoxhttps://www.cnblogs.com/penghuake/p/10886291.html

1. 什么是JdbcTemplate

  • JdbcTemplate:是Spring框架的一部分,封装简化了JDBC的操作,帮我们处理了资源的获取和释放。我们只要提供sql语句和参数,就可以得到执行的结果了

  • 相关的jar包:

  • 常用方法:

    • 构造方法:JdbcTemplate(DataSource dataSource)

    • 执行任意语句:execute(sql),此方法没有返回值

    • 执行DML语句:update(String sql, Object... params),返回int,影响行数

    • 执行DQL语句:queryxxx() 方法多,单独讲解

2. 使用JdbcTemplate

2.1 执行任意语句execute方法(了解)

  • 方法:jdbcTemplate.execute(sql)

    • 参数:要执行的SQL

    • 返回值:无

2.2 进行增、删、改操作

  • 方法:jdbcTemplate.update(String sql, Object... params)

    • 参数:

      • sql:要执行的SQL语句。如果有参数,必须是?处理过的

      • params:执行SQL语句需要的参数值

    • 返回值:

      • int,表示影响的行数

2.3 进行查询操作

2.3.1 ==查询一个值==:
  • 方法:queryForObject(String sql, Class resultType, Object... params)

  • 参数:

    • sql:要执行的sql语句

    • resultType:想要什么类型的结果,比如:Integer.class, String.class

    • params:执行SQL语句需要的参数值

  • 返回值:

    • 一个值,类型是由参数resultType决定的

    通常用于查询数量,结果是一个值,类型通常是Integer

  • 示例:

public void queryOne(){
   //Integer count = jdbcTemplate.queryForObject("select count(*) from user", Integer.class);

   Integer count = jdbcTemplate.queryForObject("select count(*) from user where sex = ?", Integer.class, "男");
   System.out.println("user表里的数量:" + count);
}
2.3.2 查询一条记录Map:
  • 方法:queryForMap(String sql, Object... params)

  • 参数:

    • sql:要执行的SQL语句

    • params:执行SQL语句需要的参数值

  • 返回值:

    • Map<String, Object> 是Map<字段名, 字段值>

  • 示例:


/**
    * 查询姓名是 大郎 的用户信息,得到Map<字段名,字段值>
    */
@Test
public void queryOneMap(){
   Map<String, Object> map = jdbcTemplate.queryForMap("select * from user where username = ?", "大郎");
   System.out.println(map);
}
2.3.3 查询多条记录List:
  • 方法:queryForList(String sql, Object... params)

  • 参数:

    • sql:要执行的SQL语句

    • params:执行SQL语句需要的参数值

  • 返回值:

    • List<Map<String,Object>>:每条记录是一个Map,把所有记录的Map放到List里

  • 示例:


   /**
    * 查询性别为男的所有用户,得到List
    */
   @Test
   public void queryManyList(){
       List<Map<String, Object>> mapList = jdbcTemplate.queryForList("select * from user where sex = ?", "男");
       for (Map<String, Object> map : mapList) {
           System.out.println(map);
      }
  }

 

2.3.4 ==查询多条记录,得到JavaBean对象的集合==:
  • 方法:query(String sql, RowMapper rowMapper, Object.. params)

  • 参数:

    • sql:要执行的SQL语句

    • rowMapper:用于设置结果集中列的数据,对应到JavaBean哪个属性上,是设置对应关系的

      • 可以简化写成:new BeanPropertyRowMapper<>(JavaBean名称.class)

    • params:执行SQL语句需要的参数值

  • 返回值:

    • List<JavaBean对象>。List里每个JavaBean,是一条记录的数据封装成的对象

  • JavaBean:有特定结构的简单Java类。数据库里每张表,都可以有一个对应的JavaBean;表里每条记录,都对应一个JavaBean的对象。

    • 类里要有私有属性

    • 类里要有无参构造

    • 每个属性要有public的get/set方法

  • 示例:查询所有用户,得到用户集合List<User>


/**
* JavaBean:一种特殊结构的简单Java类,要求:
* 1. 类里要有private的属性
* 2. 每个属性要有public的get/set方法
* 3. 要有无参构造
* 4. 建议每个属性的类型,写成包装类,而不要写成基本数据类型
*/
public class User {
   private Integer id;
   private String username;
   private String password;
   private String sex;
   private Date birthday;

   public Integer getId() {
       return id;
  }

   public void setId(Integer id) {
       this.id = id;
  }

   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 String getSex() {
       return sex;
  }

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

   public Date getBirthday() {
       return birthday;
  }

   public void setBirthday(Date birthday) {
       this.birthday = birthday;
  }

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

/*
查询所有性别为的用户,得到List<User>
*/
@Test
public void queryManyUser2(){
   List<User> userList = jdbcTemplate.query("select * from user where sex = ?", new BeanPropertyRowMapper<User>(User.class), "男");
   for (User user : userList) {
       System.out.println(user);
  }
}

 

2.3.5 ==查询一条记录,得到JavaBean对象==:
  • 方法:queryForObject(String sql, RowMapper rowMapper, Object.. params)

    注意:如果找不到数据,方法会抛异常EmptyResultDataAccessException

    我们认为是正常的,应该try..catch,让异常不影响后边代码的继续执行

  • 参数:

    • sql:要执行的SQL语句

    • rowMapper:用于设置结果集中列的数据,对应到JavaBean哪个属性上,是设置对应关系的

      • 可以简写成:new BeanPropertyRowMapper<>(JavaBean类名.class)

    • params:执行SQL语句需要的参数值

  • 返回值:

    • List<JavaBean对象>。List里每个JavaBean,是一条记录的数据封装成的对象

  • 示例


/**
    * 查询用户名为 大朗 的信息,得到一个User对象
    */
@Test
public void queryOneUser(){
   User user = null;
   try {
       user = jdbcTemplate.queryForObject("select * from user where username = ?", new BeanPropertyRowMapper<User>(User.class), "大郎");
  } catch (EmptyResultDataAccessException e) {
       System.out.println("找不到用户User[username = 大郎]");
  }
   System.out.println(user);
}

以上是关于Spring自带的jdbc用JdbcTemplate类的主要内容,如果未能解决你的问题,请参考以下文章

Spring--jdbcTemplate

spring自带分布式锁-[jdbc-lock-registry]源码解析

spring自带分布式锁-[jdbc-lock-registry]源码解析

jdbc连接池问题 使用的是spring框架自带的jdbctemplate,请问一下在同一次请求中

放弃 MyBatisJPA,我最终选择了 JDBC Template…

Spring Transaction源码分析