SpringBoot(14)JDBCTemplate

打印 上一主题 下一主题

主题 926|帖子 926|积分 2778

1.认识 JDBCTemplate

  1.了解 JDBC

  学习使用 JDBCTempIate 之前,我们先来了解一下 JDBC( Java DataBase Connectivity )。 它是Java用于连接数据库的规范,也就是用于执行数据库SQL语句的Java API。从JDBC的名称上看,它似乎没有指定某种数据库。可以猜想它可以为多种数据库提供统一访问的接口,这更符合程序设计的模式。实际上,它由一组用Java语言编写的类和接口组成,为大部分关系型数据库提供访问接口。
  JDBC需要每次进行数据库连接,然后处理SQL语句、传值、关闭数据库。如果都由开发人员编写代码,则很容易岀错,可能会出现使用完成之后,数据库连接忘记关闭的情况。这容易导致连接被占用而降低性能,为了减少这种可能的错误,减少开发人员的工作量,JDBCtemplate就被设计岀来了
  2.了解 JDBCTemplate

  JDBCTemplate=JDBC+Template的组合,是对JDBC的封装。它更便于程序实现,替我们完成所有的JDBC底层工作。因此,对于数据库的操作,再不需要每次都进行连接、打开、关闭了。 现在通过JDBCtemplate不需要进行全局修改,就可以轻松地应对开发人员常常要面对的增加、 删除、修改和查询操作。
  JDBC和JDBCtemplate就像是仓库管理员,负责从仓库(数据库)中存取物品。而后者不需 要"每次进入都开门,取完关门”,因为有电动门自动控制。下面通过具体使用JDBCTemplate的实例来理解它。
  实例: 用JDBCTemplate实现数据的增加、删除、修改和查询
  (1)配置基础依赖
  使用JDBCTemplate,则需要添加其Starter依赖。因为要操作数据库,所以也需要配置数据库(以MySQL为例)的连接依赖,见以下代码:
  1. <dependency>
  2.     <groupId>org.springframework.boot</groupId>
  3.     <artifactId>spring-boot-starter-jdbc</artifactId>
  4. </dependency>
  5. <dependency>
  6.     <groupId>mysql</groupId>
  7.     <artifactId>mysql-connector-java</artifactId>
  8.     <scope>runtime</scope>
  9. </dependency>
复制代码
  添加完依赖后,还需要配置数据库的连接信息。这样JDBCTemplate才能正常连接到数据库。 在application.yml配置文件中配置数据库的地址和用户信息,见以下代码:“配置IP地址、编码、时区和SSL”
  1. spring:
  2.   datasource:
  3.     driver-class-name: com.mysql.cj.jdbc.Driver
  4.     url: jdbc:mysql://localhost:3306/springboot?useUnicode=true&characterEncoding=utf-8&serverTimezone=UTC&useSSL=true
  5.     username: root
  6.     password: 123456
复制代码
  (2)新建实体类
  新建一个测试实体类User,实现RowMapper类,重写mapRow方法,以便实体字段和数据表字段映射(对应),映射是指把Java中设置的实体字段和MySQL数据库的字段对应起来,因 为实体的id可以对应数据库字段的u_id,也可以对应id、name等。如果不重写,则程序不知道如 何对应。具体代码如下:
  1. package com.itheima.domain;
  2. import lombok.AllArgsConstructor;
  3. import lombok.Data;
  4. import lombok.NoArgsConstructor;
  5. import org.springframework.jdbc.core.RowMapper;
  6. import java.sql.ResultSet;
  7. import java.sql.SQLException;
  8. @Data
  9. @AllArgsConstructor
  10. @NoArgsConstructor
  11. public class User implements RowMapper<User> {
  12.     private long id;
  13.     private String name;
  14.     private int age;
  15.     @Override
  16.     public User mapRow(ResultSet rs, int rowNum) throws SQLException {
  17.         User user = new User();
  18.         user.setId(rs.getLong("id"));
  19.         user.setName(rs.getString("name"));
  20.         user.setAge(rs.getInt("age"));
  21.         return user;
  22.     }
  23. }
复制代码
  (3)操作数据
  JDBCTemplate提供了以下操作数据的3个方法。

  • execute:表示“执行”,用于直接执行SQL语句
  • update:表示“更新",包括新增、修改、删除操作。
  • query;标识查询。
  下面使用这3个方法来实现数据的增加、删除、修改和查询功能。
  1.创建数据表
  在使用JDBCTemplate之前,需要在控制器中注入JDBCTemplate,然后就可以通过 "execute"方法执行SQL操作了,见以下代码:
  1. package com.itheima;
  2. import com.itheima.domain.User;
  3. import org.junit.Test;
  4. import org.junit.runner.RunWith;
  5. import org.springframework.beans.factory.annotation.Autowired;
  6. import org.springframework.boot.test.context.SpringBootTest;
  7. import org.springframework.jdbc.core.BeanPropertyRowMapper;
  8. import org.springframework.jdbc.core.JdbcTemplate;
  9. import org.springframework.test.context.junit4.SpringRunner;
  10. import java.util.List;
  11. @SpringBootTest
  12. @RunWith(SpringRunner.class)
  13. public class UserControllerTest {
  14.     @Autowired
  15.     private JdbcTemplate jdbcTemplate;
  16.     @Test
  17.     public void createUserTable() throws Exception {
  18.         String sql = "create table `user` (\n" +
  19.                 "`id` int(10) not null auto_increment,\n" +
  20.                 "`name` varchar(100) default null,\n" +
  21.                 "`age` int(10) default null,\n" +
  22.                 "primary key (`id`)\n" +
  23.                 ")engine=InnoDB auto_increment=1 default charset=utf8;\n" +
  24.                 "\n";
  25.         jdbcTemplate.execute(sql);
  26.     }
  27. }
复制代码
  2.添加数据。
  添加数据可以通过“update”方法来执行,见以下代码:
  1. @Test
  2. public void saveUserTest() throws Exception{
  3.     String sql = "insert into user (name,age) values('buretuzi','12')";
  4.     int rows = jdbcTemplate.update(sql);
  5.     System.out.println(rows);
  6. }
复制代码
  3.查询数据
  以下代码是根据name查询单个记录,执行下面sql字符串里的SQL语句(SELECT * FROM user WHERE USERNAME = ? ),这里需要通过“query”方法来执行。
  1. @Test
  2. public void getUserByName() throws Exception {
  3.     String name = "buretuzi";
  4.     String sql = "select * from user where name = ?";
  5.     List<User> users = jdbcTemplate.query(sql,new User(),new Object[]{name});
  6.     for (User user : users) {
  7.             System.out.println(user);
  8.     }
  9. }
复制代码
  4.查询所有记录
  查询所有记录和查询单个记录一样,也是执行“query”方法。区别是,SQL语句使用了查询通配符见以下代码:
  1. @Test
  2.     public void list() throws Exception {
  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. }
复制代码
  5.修改数据。
  要进行数据的修改,可以使用“update”方法来实现,见以下代码:
  1. @Test
  2. public void updateUserPassword() throws Exception {
  3.     Integer id = 1;
  4.     String password = "12331313";
  5.     String sql = "update user set name = ? where id = ?";
  6.     int rows = jdbcTemplate.update(sql,password,id);
  7.     System.out.println(rows);
  8. }
复制代码
  6.删除数据。
  这里删除数据并不用DELETE方法,而是通过“update”方法来执行SQL语句中的“DELETE” 方法。
  1. @Test
  2. public void deleteUserById() throws Exception {
  3.     String sql = "delete from user where id = ?";
  4.     int rows = jdbcTemplate.update(sql,1);
  5.     System.out.println(rows);
  6. }
复制代码
  至此,已经实现了简单的增加、删除、修改和查询功能。如果读者对关系型数据库的SQL语句不陌生,那么实现起来会非常简单。因为JDBCTemplate实现起来比ORM烦琐,所以大部分开发人员使用的是ORM (JPA和MyBatis)。但是JDBCTemplate依然有市场,因为学习成本低, 会一些SQL语句就能上手使用,操作虽然麻烦,但很容易学会。
 

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

去皮卡多

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表