02:SpringBoot集成Mybatis

02:SpringBoot集成Mybatis

Scroll Down

对于搞java开发的童鞋肯定都接触过SSM框架,现在使用SpringBoot了,肯定还是想使用Mybatis来愉快的进行开发,但是集成的过程emmmm,,,,,一般不是多美好(深有体会),今天就来记录下我的springboot集成mybatis。

Mybatis简介

MyBatis的前身是Apache的开源项目iBatis。MyBatis几乎可以代替JDBC,是一个支持普通SQL查询,存储过程和高级映射的基于Java的优秀持久层框架。它避免了几乎所有的JDBC代码和手动设置参数以及获取结果集。与JDBC相比,减少了50%以上的代码量。并且满足高并发和高响应的要求,所以它成为最流行的Java互联网持久框架。今天就来讲讲怎样在springboot中使用mybatis。

添加必要的jar

主要涉及:

  • mybatis
  • springboot
  • freemarker

对于mybatis和springboot的集成和集成SSM框架类似,首先我们通过maven的pom.xml将必要的包导入,具体如下:
pom.xml:

<dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid</artifactId>
            <version>1.0.16</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-jdbc</artifactId>
            <version>5.2.3.BUILD-SNAPSHOT</version>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.18</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-freemarker</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

除了上面的pom,最重点的是还需要以下的依赖,如果没有这个,会各种报错的,什么没有定义sqlSessionFactory之类的,不信的话可以不添加试试,反正我是遇到了的调皮如下:

<dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>2.1.1</version>
        </dependency>

在springboot中,只需要一个mybatis-spring-boot-starter即可集成mybatis,不需要ssm框架中的那么多jar,剩下的只需要简单配置即可。

配置mybatis

对于mybatis的配置,我们的第一想法肯定是去创建mybatis.xml等配置文件,在springboot中完全不需要这样,因为springboot的自动配置,我们只需要在application.yaml进行一些基本配置,如数据源,数据库url,用户以及密码等,配置如下:

  • 基于注解的mybatis配置:
spring:
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3306/j2ee
    type: com.alibaba.druid.pool.DruidDataSource
    username: username
    password: passwd
  • 基于xml映射文件的mybatis配置:
    如果我们在使用mybatis时想要使用XML描述映射,那么我们需要在application.yaml中增加以下配置,以指定mapper路径:
#定义mapper位置
mybatis:
  mapper-locations: classpath:/mapper/*.xml

编写Mapper

  • 表定义:
CREATE TABLE `jdbctest` (
  `name` text CHARACTER SET utf8,
  `age` int(11) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
  • 编写用户:
    编写一个User对象用作存储,代码如下:
public class User
{
    private String name;
    private int age;
    public User(){}
    public User(String name,int age)
    {
        this.name=name;
        this.age=age;
    }
    @Override
    public String toString() {
        return "User{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
    //此处省略getter和setter
}
  • 编写mapper接口:
    Mapper是一个interface,通过注解描述sql,调用接口方法实现存储,定义如下:
@Repository("userMapper")
public interface UserDao
{
    @Insert("INSERT INTO jdbctest(name,age)VALUES(#{name},#{age})")
    void insertUser(User user);
    
    @Select("SELECT *FROM jdbctest WHERE name=#{name}")
    User selectUser(String name);
}

在UserDao这个接口中定义了两个方法,分别是向数据库中插入一个用户的姓名和年龄以及通过姓名获取一个用户。
在上面的定义中要将接口注解为一个bean,方便在需要的地方注入。

编写Controller

便于演示,所以就不编写service这些了,直接在controller中调用mepper,所以控制器UserController定义如下:

@MapperScan("com.clay.j2ee.springbootdemo.dao")
@Controller
@RequestMapping(value = "/user")
public class UserController
{
    @Resource
    private UserDao userMapper;
  
    @GetMapping(value = "/insertUser")
    public void insert()
    {
        userMapper.insertUser(new User("wanderer",22));
    }
    @GetMapping(value = "/selectUser")
    public void getUser()
    {
        String name="wanderer";
        User user=userMapper.selectUser(name);
        System.out.println(user);
    }
}

注意@MapperScan这是用来扫描接口的,可以加在启动类上。
然后运行项目:

  1. 访问:http://localhost:8080/springboot/user/insertUser,再使用navicat查看数据库,发现数据已经插入,如下图:
    捕获.PNG
  2. 访问:http://localhost:8080/springboot/user/selectUser,观察运行输出,如下图:
    捕获.PNG
    可以看到成功获取到刚刚插入的数据,OK!

到这里,SpringBoot集成Mybatis基本就完成了。但是还有如下情况........

通过XML编写Mapper

在很多时候我们使用mybatis都还是喜欢使用基于XML的Mapper,对于这种情况,我们将采用需要在上面的Mybatis配置一节中的application.yaml中加入Mapper的位置所在,同时编写UserMapper.xml,将接口上面的@Insert、@Select之类的注解注释掉,在指定的Mapper路径下编写UserMapper.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.clay.j2ee.springbootdemo.dao.UserDao">
    <insert id="insertUser" parameterType="com.clay.j2ee.springbootdemo.bean.User">
        INSERT INTO jdbctest(name,age)VALUES(#{name},#{age})
    </insert>
    <select id="selectUser" parameterType="string"
            resultType="com.clay.j2ee.springbootdemo.bean.User">
        SELECT * FROM jdbctest WHERE name=#{name}
    </select>
</mapper>

Over

总结下:

  1. 添加mybatis集成springboot的依赖。
  2. 在application.yaml中配置数据源以及可能存在的Mapper路径。
  3. 编写Mapper接口及可能存在的XML映射文件(注意将接口注解为bean)。
  4. 在需要使用mapper的地方注入并使用即可。
  5. 注意@MapperScan注解!
  6. 注意别完全按SSM框架集成的思路来集成mybatis到springboot,会让你头疼死。