专栏首页大数据实战演练spring boot使用JDBCTemplate访问Mysql

spring boot使用JDBCTemplate访问Mysql

每一个成功人士的背后,必定曾经做出过勇敢而又孤独的决定。

放弃不难,但坚持很酷~

本文主要介绍spring boot如何使用JDBCTemplate来访问Mysql,对单表做简单的增删改查操作。 环境说明:

  • IntelliJ IDEA
  • JDK 1.8
  • Maven 3.5.0
  • Mysql

一、初始化mysql

创建数据库,创建数据表,并生成一些测试数据。

CREATE DATABASE spring_boot_study;
USE spring_boot_study;
DROP TABLE IF EXISTS `user_manage`;
CREATE TABLE `user_manage` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `user_name` varchar(20) NOT NULL,
  `password` varchar(20) NOT NULL,
  `telPhone` varchar(20) NOT NULL,
  `cdate` datetime DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
INSERT INTO `user_manage` VALUES ('1', 'admin', '12345678', '1761581****', '2017-09-11 15:03:49');
INSERT INTO `user_manage` VALUES ('2', 'tom', '12345678', '178********', '2017-09-17 10:19:06');
INSERT INTO `user_manage` VALUES ('3', 'seven', 'admin111', '176********', '2017-10-27 20:33:40');
INSERT INTO `user_manage` VALUES ('4', 'Mary', '11111111', '1786281****', '2017-12-12 16:33:53');

二、spring boot配置

1. application.yml

根据个人喜好选择配置文件的类型,在这里我选择配置application.yml,主要对datasource进行一些配置说明。

spring:
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3306/spring_boot_study?allowMultiQueries=true&serverTimezone=GMT%2B8
    username: root
    password: root
server:
  port: 8081
  servlet:
    context-path: /spring-boot-study

2. pom.xml

至少引入下面三个依赖:

<!--引入JDBC的依赖-->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<!--引入mysql连接-->
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <scope>runtime</scope>
</dependency>
<!--引入web依赖,可以使用@RequestMapping,@RestController等注解-->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>

三、具体编码

我们如果要制作API接口的话,需要编写四个层:实体(Entity)层;DAO层;Service层;Controller层。

1. 实体(Entity)层:

public class UsersEntity {
    private int id;
    private String userName;
    private String password;
    private String telPhone;
    private String cdate;

    public int getId() {
        return id;
    }

    public void setId(int 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 getTelPhone() {
        return telPhone;
    }

    public void setTelPhone(String telPhone) {
        this.telPhone = telPhone;
    }

    public String getCdate() {
        return cdate;
    }

    public void setCdate(String cdate) {
        this.cdate = cdate;
    }

    @Override
    public String toString() {
        return "UsersEntity{" +
                "id=" + id +
                ", userName='" + userName + '\'' +
                ", password='" + password + '\'' +
                ", telPhone='" + telPhone + '\'' +
                ", cdate='" + cdate + '\'' +
                '}';
    }
}

2. DAO层

由接口和实现类组成:

public interface UsersDAO {
    /**
     * @description: 获取表中所有信息。
     * @return: java.util.List<com.study.spring.entity.UsersEntity>
     */
    List<UsersEntity> usersList();

    /**
     * @description: 通过name来查询信息
     * @param: name
     * @return: com.study.spring.entity.UsersEntity
     */
    UsersEntity findUserOne(String name);

    /**
     * @description: 向表中插入一条数据
     * @param: usersEntity
     * @return: void
     */
    void saveUser(UsersEntity usersEntity);

    /**
     * @description: 更新表中单条数据
     * @param: usersEntity
     * @return: void
     */
    void updateUser(UsersEntity usersEntity);

    /**
     * @description: 删除表中单条数据
     * @param: name
     * @return: void
     */
    void removeUser(String name);
}

实现类:

@Repository
public class UsersDaoImpl implements UsersDAO {

    @Autowired
    private JdbcTemplate jdbcTemplate;

    @Override
    public List<UsersEntity> usersList() {
        List<UsersEntity> list = jdbcTemplate.query("select * from user_manage", new Object[]{}, new BeanPropertyRowMapper(UsersEntity.class));
        return list;
    }

    @Override
    public UsersEntity findUserOne(String name) {
        List<UsersEntity> list = jdbcTemplate.query("select * from user_manage where user_name = ?", new Object[]{name}, new BeanPropertyRowMapper(UsersEntity.class));
        if (list != null && list.size() > 0) {
            UsersEntity usersEntity = list.get(0);
            return usersEntity;
        } else {
            return null;
        }
    }

    @Override
    public void saveUser(UsersEntity usersEntity) {
        jdbcTemplate.update("insert into user_manage(user_name, password, telPhone) values(?, ?, ?)",
                usersEntity.getUserName(), usersEntity.getPassword(), usersEntity.getTelPhone());
    }

    @Override
    public void updateUser(UsersEntity usersEntity) {
        jdbcTemplate.update("UPDATE user_manage SET password=?, telPhone=? WHERE user_name=?",
                usersEntity.getPassword(), usersEntity.getTelPhone(), usersEntity.getUserName());
    }

    @Override
    public void removeUser(String name) {
        jdbcTemplate.update("DELETE FROM user_manage WHERE user_name = ?", name);
    }
}

说明:

  • 需要在DAO层的实现类里面加入注解@Repository
  • 通过注解@Autowired来引用JdbcTemplate

3. Service层

由接口与实现类组成:

public interface UsersService {

    /**
     * @description: 获取表中所有信息。
     * @return: java.util.List<com.study.spring.entity.UsersEntity>
     */
    List<UsersEntity> usersList();

    /**
     * @description: 通过name来查询信息
     * @param: name
     * @return: com.study.spring.entity.UsersEntity
     */
    UsersEntity findUserOne(String name);

    /**
     * @description: 向表中插入一条数据
     * @param: usersEntity
     * @return: void
     */
    void saveUser(UsersEntity usersEntity);

    /**
     * @description: 更新表中单条数据
     * @param: usersEntity
     * @return: void
     */
    void updateUser(UsersEntity usersEntity);

    /**
     * @description: 删除表中单条数据
     * @param: name
     * @return: void
     */
    void removeUser(String name);
}

实现类:

@Service
public class UsersServiceImpl implements UsersService {

    @Autowired
    private UsersDAO usersDao;

    @Override
    public List<UsersEntity> usersList() {
        return usersDao.usersList();
    }

    @Override
    public UsersEntity findUserOne(String name) {
        return usersDao.findUserOne(name);
    }

    @Override
    public void saveUser(UsersEntity usersEntity) {
        usersDao.saveUser(usersEntity);
    }

    @Override
    public void updateUser(UsersEntity usersEntity) {
        usersDao.updateUser(usersEntity);
    }

    @Override
    public void removeUser(String name) {
        usersDao.removeUser(name);
    }
}

说明:

  • 需要在Serivice层的实现类里面加入注解@Service
  • 通过注解@Autowired来引用DAO层的接口UsersDAO

4. Controller层

@RestController
@RequestMapping("users")
public class UsersController {

    @Autowired
    private UsersService usersService;

    /**
     * @description: 获取表中所有信息。
     * @return: java.util.List<com.study.spring.entity.UsersEntity>
     */
    @RequestMapping(value = "list", method = RequestMethod.GET)
    public List<UsersEntity> list() {
        return usersService.usersList();
    }

    /**
     * @description: 通过name来查询信息
     * @param: name
     * @return: com.study.spring.entity.UsersEntity
     */
    @RequestMapping(value = "{name}", method = RequestMethod.GET)
    public UsersEntity findUserOne(@PathVariable("name") String name){
        return usersService.findUserOne(name);
    }

    /**
     * @description: 向表中插入一条数据
     * @param: usersEntity
     * @return: java.util.Map<java.lang.String,java.lang.Boolean>
     */
    @RequestMapping(value = "save", method = RequestMethod.POST)
    public Map<String,Boolean> save(UsersEntity usersEntity) {
        Map<String,Boolean> map = new HashMap<>();
        try {
            usersService.saveUser(usersEntity);
            map.put("status",true);
        } catch (Exception e) {
            map.put("status",false);
        }
        return map;
    }

    /**
     * @description: 更新表中数据
     * @return: void
     */
    @RequestMapping(value = "update", method = RequestMethod.PUT)
    public Map<String,Boolean> update(UsersEntity usersEntity) {
        Map<String,Boolean> map = new HashMap<>();
        try {
            usersService.updateUser(usersEntity);
            map.put("status",true);
        } catch (Exception e) {
            map.put("status",false);
        }
        return map;
    }

    @RequestMapping(value = "remove", method = RequestMethod.DELETE)
    public Map<String,Boolean> remove(@RequestParam(value = "userName",required = true) String name) {
        Map<String,Boolean> map = new HashMap<>();
        try {
            usersService.removeUser(name);
            map.put("status",true);
        } catch (Exception e) {
            e.printStackTrace();
            map.put("status",false);
        }
        return map;
    }
}

说明:

  • 需要在Controller层的类里面加入注解@RestController与@RequestMapping("xxx")
  • 通过注解@Autowired来引用Service层的接口UsersService

四、功能测试

通过Jrebel v2018.2.2来启动spring boot程序,可以实现热部署(代码修改即时生效)。

查询所有

浏览器访问:http://localhost:8081/spring-boot-study/users/list,如下图所示:

条件查询:根据name查询单条信息

浏览器访问:http://localhost:8081/spring-boot-study/users/tom,如下图所示:

这里我们使用Postman工具,来测试增加、更新、删除信息。 增加一条信息

更新一条信息:

删除一条信息

五、注解概述

1. @RestController

Spring4之后新加入的注解,原来返回json需要@ResponseBody和@Controller配合。 即@RestController是@ResponseBody和@Controller的组合注解。

2. @RequestMapping :配置url映射

3. @PathVariable:url参数化

当使用@RequestMapping URI template 样式映射时, 即 someUrl/{paramId}, 这时的paramId可通过 @Pathvariable注解绑定它传过来的值到方法的参数上。具体可见上述实例的删除代码逻辑。

4. @Autowired

这是一个非常常见的注解。 比如在上述代码示例中所示:在Controller层,需要使用@Autowired来调用Service层;在Service层,需要使用@Autowired来调用DAO层;在DAO层实现类中,通过@Autowired来调用JdbcTemplate。

5. @Repository:用于标注数据访问组件,即DAO组件。标注在实现类上。

6. @Service注解:用于标注Service层组件,标注在实现类上。

7. @Controller注解:用于标注Controller层组件。

六、总结

前面说了那么多,用几句话来概括一下。

  • 首先需要创建数据库,数据表
  • 修改yml配置文件,配置datasource
  • 在pom文件中引入相关依赖
  • 具体编码。通过JdbcTemplate来操作Mysql,编写Entity、DAO、Service、Controller。
  • 会使用基础注解

在以后,我会抽出时间来学习并分享spring boot的基本用法。除了大数据服务组件之外,现在非常火爆的spring boot框架也不能落下,一起学习吧。

源码已上传至https://github.com/841809077/spring-boot-study

本文分享自微信公众号 - 大数据实战演练(gh_f942bfc92d26)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-03-15

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • spring boot通过JPA访问Mysql

    根据个人喜好选择配置文件的类型,在这里我选择配置application.yml,主要对datasource与jpa进行一些配置说明。

    create17
  • 用心整理 | Spring AOP 干货文章,图文并茂,附带 AOP 示例 ~

    Spring AOP 是 Java 面试的必考点,我们需要了解 AOP 的基本概念及原理。那么 Spring AOP 到底是啥,为什么面试官这么喜欢问它呢?本文...

    create17
  • Java 实现 FastDFS 实现文件的上传、下载、删除

    上述方法就是将图片的 base64 码进行转换并上传到了 fastdfs 上。以下是可复制粘贴的源码:

    create17
  • 快速学习-自定义 Mybatis 框架

    cwl_java
  • ASP.NET MVC5+EF6+EasyUI 后台管理系统(33)-MVC 表单验证

    注:本节阅读需要有MVC 自定义验证的基础,否则比较吃力 一直以来表单的验证都是不可或缺的,微软的东西还是做得比较人性化的,从webform到MVC,都做到了双...

    用户1149182
  • Java泛型学习

    1、泛型的概念     泛型即“参数化类型”,就比如我们定义方法的时候,定义一个变量,称为形参,变量值根据传进去的实参的值不同而改变。而泛型的出现,就是为了解决...

    JMCui
  • Consul-Proxy:使用netty实现快速服务注册(三)使用第三方数据源

    Springcloud+consul作为微服务的注册已经见怪不怪了,试下也很流行,在我个人云服务器上,我也是这样做的。

    品茗IT
  • Java枚举类使用和总结

    别先生
  • Java基础-17(01)总结,登录注册案例,Set集合,HashSet

    1:登录注册案例(理解) 需求:用户登录注册案例。 按照如下的操作,可以让我们更符号面向对象思想 A:有哪些类呢? B:每个类有哪些东西呢? C:类与类之...

    奋斗蒙
  • Spring Qualifier的使用

    spring 的 qualifier 平常使用一般直接是使用id 来限定,不过spring给我们提供了更强大的功能。

    Dylan Liu

扫码关注云+社区

领取腾讯云代金券