当Spring Boot遇见Mybatis(连接Mysql)

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,高可用系列 2核4GB
简介: 前言在本文中讲述了Spring Boot 如何整合Mybatis ,然后如何通过Mybaits连接到Mysql,项目是由gradle构建的,本文还讲述了controller层相关的知识。

前言

在本文中讲述了Spring Boot 如何整合Mybatis ,然后如何通过Mybaits连接到Mysql,项目是由gradle构建的,本文还讲述了controller层相关的知识。
Spring Boot 在Spring 家族现在混的风生水起,如果不是开发之前的老项目,那么几乎大多数人都在使用Spring Boot。使用的原因虽然有很多,但是归根结底的根本原因只有一个,那就是因为它太易用了,如果你想要创建一个最小的Spring Boot 项目可以看我的前面一篇文章与Spring Boot 初次见面,那么废话不多说,我们开始吧。
在这里首先附上这个项目的百度云 地址链接 密码:5050

准备工作

1.首先我们得需要先准备一个Spring Boot 工程

  1. 我们需要在本地安装上你需要连接的数据库,我这里使用的是Mysql数据库,这里给大家贴出mysql官网下载地址mysql 下载地址
  2. 对于新手来说,有可能通过命令行去使用数据库,太强人所难,我自己是使用 navicat这个工具进行连接的,下面给出navicat地址大家可以自行下载navicat 下载地址

正文

首先我们需要引入我们需要的mybatis相关的依赖。

这里多说一点,给大家推荐 maven repository 这个网站,无论你是使用maven或者是gradle进行构建的,你都可以在上面找到你要依赖的具体地址。

在build.gradle 中我们添加上需要的依赖:

//数据库连接驱动
compile('mysql:mysql-connector-java:6.0.5') 
//配置mybatis 数据源
compile("org.mybatis.spring.boot:mybatis-spring-boot-starter:1.3.1")

然后需要在application.properties中添加上需要配置的一些信息:

#设置数据库连接相关的参数
spring.datasource.url=jdbc:mysql://localhost/test?useSSL=false&serverTimezone=UTC&characterEncoding=utf-8
spring.datasource.username=root
spring.datasource.password=
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver

#配置mybatis 相关的参数
mybatis.type-aliases-package: com.harry.first.entity

url中如果我们想使用自己的数据库,可以替换掉test就行,其他的参数分别代表的是时区以及编码格式(这个地方还是需要多加小心的,我之前就因为时区的问题,往数据库里用now()函数,结果发生了一直快一个小时的缘故,所以这里一定要注意。)
username是你数据库在安装时候设定的用户名,默认情况下会有一个root用户。
password是安装时候设定的密码,我当时是直接用yum进行下载的mysql,然后安装的时候,忘记设置了名字,后来又比较懒。所以你懂的。
接下来是设置好驱动的名字。
我在上一篇博客的时候,将java后端,进行了分层,分别是Controller,Service,Dao,以及entity。我们需要写的与数据库相关联的代码,就是放在了Dao层中。
使用Mybatis进行数据库的操作,我知道的一共有三种方式:

  • 通过java代码直接去调用SqlSession。在我看来,这种方式更像是我们曾经使用的JDBC,只不过mybatis已经给JDBC封装的很好了,我们已经不需要在进行connection,prepareStatement,resultSet等一系列繁琐的操作了。大致的过程是这样的:我们首先需要准备好一个mybatis-config.xml的文件名,里面写好了对mybatis的配置,紧接着通过流把文件的信息读进来,然后我们通过这些配置实例化出一个SqlSessionFactory(核心对象),再通过SqlSessionFactory.openSession()方法制造出SqlSession对象,再通过SqlSession对象对对应的数据库进行增删改查操作。我们对这种方式暂时不演示。详细的内容可以看下面的链接。Mybatis 核心对象
  • 我们也可以通过在resource包下创建一个mapper包,然后在mapper包下创建一个xml。这个xml与java包下=>dao包下的java文件是对应上的。xml中mapper标签里的namespace可以与dao接口中的接口名对应。xml中<select>,<update>,<insert>,<delete>标签中的id对应的是类中的方法名。(这种方法会在后面详细说,在这里有个概念就行。)
  • 封装的最好的应该就是这第三种方式了,我们只需要在dao包中的接口方法上面加上这个方法进行具体操作的注解即可。动动脑子就会知道,注解一共有@select,@update,@delete,@insert。虽然真是方便到了极致,但是封装的层次越高,对于开发人员,可以下手的范围也就越小,例如像动态sql,if,for这种在xml中可以进行的操作,就无法在这上面实现了。
    下面我们就进行实战演示。

真实项目演示

为了测试,我们首先创建一个user表然后创建表的sql如下:

SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;

-- ----------------------------
-- Table structure for user
-- ----------------------------
DROP TABLE IF EXISTS `user`;
CREATE TABLE `user` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(255) DEFAULT NULL,
  `age` int(3) DEFAULT NULL,
  `password` varchar(255) DEFAULT NULL,
  `email` varchar(255) DEFAULT NULL,
  `phone` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=latin1;

注解形式

然后我首先演示的是上文说的第三种方式,在dao包下创建UserDao接口,然后代码如下:

package com.harry.first.dao;

import org.apache.ibatis.annotations.Delete;
import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Options;
import org.apache.ibatis.annotations.Select;
import org.apache.ibatis.annotations.Update;

import com.harry.first.entity.User;

public interface UserDao {
    
    //返回的Integer值是受影响的行数
    @Insert("insert into user(name, age, password, email, phone) values(#{name}, #{age}, #{password}, #{email}, #{phone})")
    //这是为了说明主键自增
    @Options(useGeneratedKeys = true, keyProperty = "id")
    Integer addUser(User user);
    
    @Update("update user set name=#{name},age=#{age},password=#{password},email=#{email},phone=#{phone}")
    Integer updateUser(User user);
    
    @Delete("delete from user where id = #{id}")
    Integer deleteUser(Integer id);
    
    @Select("select * from user ")
    User getUser();

}

我在这里没有使用junit单元测试,而是直接使用了controller层定义api接口的方式,然后通过浏览器,进行访问,看是否插入成功。
创建一个UserController,下面的是controller层的代码:

package com.harry.first.controller;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import com.harry.first.dao.UserDao;
import com.harry.first.entity.User;

@RestController
@RequestMapping("/user")
public class UserController {
    
    @Autowired
    private UserDao userDao;
    
    @GetMapping(value="/addUser")
    public Integer addUser() {
        User user =new User("harry",22,"harry","912043310@qq.com","15566416991");
        return userDao.addUser(user);
    }
    
    @GetMapping("/updateUser")
    public Integer updateUser() {
        User user =new User("luckyharry",22,"luckyharry","912043310@qq.com","15566416991");
        return userDao.updateUser(user);
    }
    
    @GetMapping("/deleteUser/{id}")
    public Integer deleteUser(@PathVariable String id) {
        return userDao.deleteUser(Integer.valueOf(id));
    }

    @GetMapping("/getUser")
    public User getUser() {
        return userDao.getUser();
    }
}

依次来说以下

  • @RestController注解是spring boot 的一个新注解,他是一个结合的注解:@Controller+@ResponseBody。controller代表了这是一个controller层的类,目的是给它注入到spring 容器中,对应的service层需要使用的是@Service注解,dao层中如果使用了刚刚说的第二种方式需要@Mapper注解,但是用了第三种方式就不需要了。无论是@Controller,还是@Service都是对于@Component的一种拓展。
  • @RequestMapping可以通过value去设置对应的哪个url会对应这个类,通过method去设置访问的方法(get,post,put,delete,head)如果把这个注解定义在方法上,那么就决定了哪个url会进入这个方法。在这里需要说一下,一般情况下是通过类上的requestMapping+方法上的requestMapping唯一指定进入哪个方法逻辑。
  • @Autowired,这个注解可以说是spring家族中的灵魂注解,我们通过@Component将需要的类,注入到了spring这个大的容器中,那么我们怎么才能将它取出来呢?就是通过这个注解,我们只需要定义一个类的变量,不需要用new来进行实例化,然后在上头添加上这个这个注解即可,是不是特别方便。你在不经意间掌握了依赖注入的一个简单的实现过程,是不是感觉特别惊喜,特别意外,其实这个依赖注入,和控制反转是一个极其复杂的过程,正是因为spring对其极致的封装,才能让我们现在用的极其爽快。
  • @GetMapping这个注解也是一个二次封装的注解,他是在@RequestMapping的基础上创造的,顾名思义它的前缀就是他使用的哪个method。分别有@GetMapping,@PostMapping,@PutMapping,@DeleteMapping,(上面我是因为想直接通过页面进行测试,所以一律使用了get方法,其实这样是科学的,一定不要效仿)好处就是省去了多余对于method的代码,另外也秉承了Rest Api的思想,下面有个地址可以学习以下Rest apiRest api 学习
  • @PathVariable 说起Rest Api 另外一个特点就是放弃了,之前的/***?key=value 这样传输数据的形式,现在取而代之的是把需要传递的参数直接放在url地址中形如上面的删除方法一样。
    这里有比较需要注意的一个地方,那就是我们在那个启动类中,需要加上一个注解。
@MapperScan("com.harry.first.dao")

否则它是不会将dao中我们的接口注入进来的,新手在这里很容易入坑!!!

xml形式

注释的形式固然简单,但是往往越简单的东西,也就意味着更高级的封装,所以有的时候也会在我们想要定制化的时候,制造出很多条条框框,让我们不能够大展身手。所以这就是为什么注解方式的出现,没有导致把xml形式拍在沙滩上的原因。
为了大家看的方便,我把对user表进行的操作,使用注解方式。然后重新创建了一个hobby表,对于hobby表的操作,我使用xml的形式。
首先我们先要创建一个hobby表。

-- ----------------------------
-- Table structure for `hobby`
-- ----------------------------
DROP TABLE IF EXISTS `hobby`;
CREATE TABLE `hobby` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(255) DEFAULT NULL,
  `user_id` int(11) DEFAULT NULL,
  `create_date` datetime DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8;

然后我们在src/main/resources下面创建一个mapper包,为了放我们的xml文件。

为什么要放在resources这个路径下面呢?其实刚开始我也随心所欲的想放哪就放哪。直到有一次做项目的时候,我把这些xml文件依旧放在了src/main/java下面。但是临时通知需要使用idea,然后我就自信满满的把原来用eclipse的项目迁移到了idea中去,刚开始启动都没有问题,但是一要访问数据库的时候就开始说“invalid statement.....”。后来不断排查才发现idea默认情况下,只会去读resources下面的xml。这次之后终于长记性了。

为了让spring boot 知道我们使用了xml文件,我们在 application.properties中需要配置上

mybatis.mapper-locations: classpath:mapper/*.xml

我们依旧要在dao中定义一个接口。

package com.harry.first.dao;

import java.util.List;

import org.apache.ibatis.annotations.Mapper;

import com.harry.first.entity.Hobby;
@Mapper
public interface HobbyMapper {
    
    public int insertHobby(Hobby hobby);
    
    public int updateHobby(Hobby hobby);
    
    public int deleteHobby(int id);
    
    public List<Hobby> getHobby();
    
}

在这里使用@Mapper注解。
然后我们在xml中定义属于这个接口的xml文件。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
    PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
    "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
    <mapper namespace="com.harry.first.dao.HobbyMapper">
    <resultMap id="BaseMap" type="com.harry.first.entity.Hobby">
      <id column="id" property="id" jdbcType="INTEGER" javaType="java.lang.Integer"/>
      <result column="name" property="name" jdbcType="VARCHAR" javaType="java.lang.String"/>
      <result column="user_id" property="userId" jdbcType="INTEGER" javaType="java.lang.Integer"/>
      <result column="create_date" property="createDate" jdbcType="DATE" javaType="java.sql.Date"/>
    </resultMap>
        <insert id="insertHobby"  parameterType="Hobby" useGeneratedKeys="true" keyProperty="id">
            insert into hobby (name,user_id,create_date) values (#{name},#{userId},now());
        </insert>
        
        <update id="updateHobby" parameterType="Hobby">
            update hobby set name=#{name},user_id=#{userId},create_date=now(); 
            where id={id}
        </update>
        
        <delete id="deleteHobby" parameterType="Integer">
            delete from hobby where id=#{id}
        </delete>
        
        <select id="getHobby" resultMap="BaseMap">
            select * from hobby;
        </select>
    </mapper>

在这里我们可以看到我们有一个父标签为mapper,mapper的有一个属性叫做namespace 这里namespace的名字应该与刚刚定义的那个接口名称相互对应上,而且这里要带上,自己的包名。(这里友情提示一下,做这个演示项目的时候,我不小心把自己的接口名称写错了,结果导致了那个接口一直找不到对应的xml,浪费了我整整两个小时,现在感觉当时自己真的特别的蠢)
resultMap 子标签是一个实体类到表字段的一个映射关系,id属性是为了在注入的时候用的,我们暂且理解为给这个resultMap起了个名字,那它是和哪一个实体类对应上的那,这就是type属性的职责了。这个标签中的子标签就是交代一下字段名称和类型。
再下面的四个标签我们可以见名知意了,分别是增改删查。
其他的很多mybatis的用法我会在接下来的博客中进行详细说明,这篇文章主要就是将spring boot 与 Mybatis进行结合的。

最后再追加一下我们使用Mybatis 如果看不到相应的日志的话,调试起来相当麻烦。所以我们需要做一步操作:
在application.properties中加入

logging.level.com.harry.first.dao=debug

logging.level 后面追加上自己dao包的路径即可。
效果就如下面所示:

2018-07-24 22:20:42.001 DEBUG 22420 --- [nio-8080-exec-1] c.h.first.dao.HobbyMapper.insertHobby    : ==>  Preparing: insert into hobby (name,user_id,create_date) values (?,?,now()); 
2018-07-24 22:20:42.012 DEBUG 22420 --- [nio-8080-exec-1] c.h.first.dao.HobbyMapper.insertHobby    : ==> Parameters: java(String), 1(Integer)
2018-07-24 22:20:42.029 DEBUG 22420 --- [nio-8080-exec-1] c.h.first.dao.HobbyMapper.insertHobby    : <==    Updates: 1

谢谢大家,你们的阅读与喜欢就是我前行最大的动力,在这里表示由衷的感谢。我也希望可以帮助大家,尤其是小白们用大白话解决一些更实质性的问题(毕竟自己也是从那个时候一步一步过来的)

相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
4天前
|
Java 数据库连接 数据库
spring和Mybatis的逆向工程
通过本文的介绍,我们了解了如何使用Spring和MyBatis进行逆向工程,包括环境配置、MyBatis Generator配置、Spring和MyBatis整合以及业务逻辑的编写。逆向工程极大地提高了开发效率,减少了重复劳动,保证了代码的一致性和可维护性。希望这篇文章能帮助你在项目中高效地使用Spring和MyBatis。
7 1
|
13天前
|
存储 运维 安全
Spring运维之boot项目多环境(yaml 多文件 proerties)及分组管理与开发控制
通过以上措施,可以保证Spring Boot项目的配置管理在专业水准上,并且易于维护和管理,符合搜索引擎收录标准。
26 2
|
1月前
|
SQL JSON Java
mybatis使用三:springboot整合mybatis,使用PageHelper 进行分页操作,并整合swagger2。使用正规的开发模式:定义统一的数据返回格式和请求模块
这篇文章介绍了如何在Spring Boot项目中整合MyBatis和PageHelper进行分页操作,并且集成Swagger2来生成API文档,同时定义了统一的数据返回格式和请求模块。
56 1
mybatis使用三:springboot整合mybatis,使用PageHelper 进行分页操作,并整合swagger2。使用正规的开发模式:定义统一的数据返回格式和请求模块
|
1月前
|
前端开发 Java Apache
Springboot整合shiro,带你学会shiro,入门级别教程,由浅入深,完整代码案例,各位项目想加这个模块的人也可以看这个,又或者不会mybatis-plus的也可以看这个
本文详细讲解了如何整合Apache Shiro与Spring Boot项目,包括数据库准备、项目配置、实体类、Mapper、Service、Controller的创建和配置,以及Shiro的配置和使用。
353 1
Springboot整合shiro,带你学会shiro,入门级别教程,由浅入深,完整代码案例,各位项目想加这个模块的人也可以看这个,又或者不会mybatis-plus的也可以看这个
|
1月前
|
Java 关系型数据库 MySQL
springboot学习五:springboot整合Mybatis 连接 mysql数据库
这篇文章是关于如何使用Spring Boot整合MyBatis来连接MySQL数据库,并进行基本的增删改查操作的教程。
98 0
springboot学习五:springboot整合Mybatis 连接 mysql数据库
|
1月前
|
Java 数据库连接 API
springBoot:后端解决跨域&Mybatis-Plus&SwaggerUI&代码生成器 (四)
本文介绍了后端解决跨域问题的方法及Mybatis-Plus的配置与使用。首先通过创建`CorsConfig`类并设置相关参数来实现跨域请求处理。接着,详细描述了如何引入Mybatis-Plus插件,包括配置`MybatisPlusConfig`类、定义Mapper接口以及Service层。此外,还展示了如何配置分页查询功能,并引入SwaggerUI进行API文档生成。最后,提供了代码生成器的配置示例,帮助快速生成项目所需的基础代码。
|
1月前
|
前端开发 Java 数据库连接
表白墙/留言墙 —— 中级SpringBoot项目,MyBatis技术栈MySQL数据库开发,练手项目前后端开发(带完整源码) 全方位全步骤手把手教学
本文是一份全面的表白墙/留言墙项目教程,使用SpringBoot + MyBatis技术栈和MySQL数据库开发,涵盖了项目前后端开发、数据库配置、代码实现和运行的详细步骤。
54 0
表白墙/留言墙 —— 中级SpringBoot项目,MyBatis技术栈MySQL数据库开发,练手项目前后端开发(带完整源码) 全方位全步骤手把手教学
|
1月前
|
Java 数据库连接 Maven
Spring整合Mybatis
Spring整合Mybatis
|
15天前
|
SQL 关系型数据库 MySQL
12 PHP配置数据库MySQL
路老师分享了PHP操作MySQL数据库的方法,包括安装并连接MySQL服务器、选择数据库、执行SQL语句(如插入、更新、删除和查询),以及将结果集返回到数组。通过具体示例代码,详细介绍了每一步的操作流程,帮助读者快速入门PHP与MySQL的交互。
29 1
|
17天前
|
SQL 关系型数据库 MySQL
go语言数据库中mysql驱动安装
【11月更文挑战第2天】
30 4
下一篇
无影云桌面