【SpringBoot】---整合Mybatis

【SpringBoot】---整合Mybatis

一、Mybatis的注解

1、CRUD注解

  • @Select:用于构建查询语句
  • @Insert:用于构建添加语句
  • @Update:用于构建修改语句
  • @Delete:用于构建删除语句

使用举例:

@Mapper
public interface UserMapper{
    @Select("SELECT * FROM user WHERE id = #{id}")
    User queryById(@Param("id") int id);
}

​ 首先用@Mapper注解来标注类,把UserMapper这个DAO交给Spring管理。这样Spring会自动生成一个实现类。不用再写UserMapper的映射文件了。最后用基础的CRUD注解来添加要实现的功能。

2、映射注解

​ MyBatis的映射注解用于建立实体和关系的映射。它有以下3个注解:

  • @Results:用于填写结果集的多个字段的映射关系。
  • @Result:用于填写结果集的单个字段的映射关系。
  • @ResultMap:根据ID关联XML里面的<resultMap>

可以在查询SQL的基础上,指定返回的结果集的映射关系。其中,property表示实体对象的属性名,column表示对应的数据库字段名。使用方法见以下代码:

@Results({
    @Result(property = "username",column = "USERNAME"),
    @Result(property = "password",column = "PASSWORD")
})
	@Select("select * from user limit 1000")
List<User> list();

3、高级注解

①高级注解

Mybatis 3.x版本提供了以下4个CRUD的高级注解

  • @SelectProvider:用于构建动态查询SQL。

  • @InsertProvider:用于构建动态添加SQL。

  • @UpdateProvider

  • DeleteProvider

    高级注解主要用于编写动态SQL。这里以@SelectProvider为例,它主要包含两个注解属性,其中,type表示工具类,method表示工具类的某个方法(用于返回具体的SQL)。

​ 以下代码可以构建动态SQL,实现查询功能:

@Mapper
public interface UserMapper{
    @SelecyProvider(type=UserSql.class,method = "listAll")
    List<User> listAllUser();
}

UserSql工具类的代码如下:

public class UserSql{
	public String listAll(){
        return "select * from user limit 1000";
    }
}

②注解的用法举例

  • 查询所有的值,则基础的CRUD的代码是:
@Select("SELECT * FROM user3")
List<User> queryAll();

也可以用注解映射来一一映射

@Select("SELECT * FROM user3")
@Results({
    @Result(property = "id",column = "id"),
    @Result(property = "name",column = "name")
    @Result(property = "age",column = "age")
})
List<User> listAll();

③使用多个参数进行查询

如果要使用多个参数进行查询,则必须加上注解@Param,否则无法使用EL表达式获取参数。

UserMapper接口的写法如下:

@Select("select * from user where name like #{name} and age like #{age}")
User getByNameAndAge(@Param("name") String name,@Param("age")int age);

对应的Controller

@RequestMappling("/querybynameandage")
User querybynameandage(String name,int age){
    return userMapper.getByNameAndAge(name,age);
}

根据官方提供的API来编写动态SQL。

public String getUser(@Param("name") String name,@Param(:age) int age){
    return new SQL(){{
        SELECT("*");
        FROM("user3");
        if(name!=null && age!=0){
            WHERE("name like #{name} and age like #{age}");
        }else{
            WHERE("1=2");
        }
    }}.toString();
}

二、用MyBatis实现数据的增加、删除、修改、查询

1、创建SpringBoot项目并且引入依赖

​ 创建一个SpringBoot项目,并引入MyBatis和MySQL依赖

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
    <groupId>org.mybatis.spring.boot</groupId>
    <artifactId>mybatis-spring-boot-starter</artifactId>
    <version>2.2.0</version>
</dependency>

<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <optional>true</optional>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-test</artifactId>
    <scope>test</scope>
</dependency>

<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
</dependency>

2、实现数据表的自动初始化

在项目的“resources"目录下新建db目录,并添加”schema.sql"文件,然后再此文件中写入创建user表的SQL语句,用来初始化数据表。

DROP TABLE IF EXISTS `user`;
CREATE TABLE `user`(
	`id` int(11) NOT NULL AUTO_INCREMENT,
    `name` varchar(255) DEFAULT NULL,
    `age` int(11) DEFAULT NULL,
    PRIMARY KEY(`id`)
)ENGINE=InnoDB DEFAULT CHARSET = utf8;

在application.properties配置文件中配置数据库连接,并加上数据表初始化的配置。具体代码如下:

spring.datasource.url=jdbc:mysql://127.0.0.1/book?useUnicode=true&characterEncoding=utf-8&serverTimezone=UTC&useSSL=true
spring.datasource.username=root
spring.datasource.password=root
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
#spring.datasource.initialize=true
spring.datasource.initialization-mode=always
spring.datasource.schema=classpath:db/schema.sql

这样配置SpringBoot在启动的时候就会自动创建user表。

3、实现实体对象建模

package com.darkerg.mybatisstudy.pojo;

import lombok.Data;

@Data
public class User {
    private int id;
    private String name;
    private int age;
}

4、实现实体和数据表的映射关系

​ 实现实体和数据表的映射关系可以在Mapper类上添加注解@Mapper,见以下代码。建议以后直接在入口类加@MapperScan("com.xxx.xxx.mapper"),如果对每个Mapper都加注解则很麻烦。

package com.darkerg.mybatisstudy.mapper;

import com.darkerg.mybatisstudy.pojo.User;
import org.apache.ibatis.annotations.*;

import java.util.List;

@Mapper
public interface UserMapper {

    @Select("SELECT * FROM user WHERE id = #{id}")
    User queryById(@Param("id") int id);

    @Select("SELECT * FROM user")
    List<User> queryAll();

    @Insert({"INSERT INTO user(name,age) VALUES(#{name},#{age})"})
    int add(User user);

    @Delete("DELETE FROM user WHERE id = #{id}")
    int delById(int id);

    @Update("UPDATE user SET name=#{name},age=#{age} WHERE id=#{id}")
    int updateById(User user);

}

5、实现增加、删除、修改和查询功能

创建控制器实现操作数据的API,见以下代码:

package com.darkerg.mybatisstudy.controller;

import com.darkerg.mybatisstudy.mapper.UserMapper;
import com.darkerg.mybatisstudy.pojo.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.List;

@RestController
@RequestMapping("/user")
public class UserController {

    @Autowired
    UserMapper userMapper;

    @RequestMapping("/querybyid")
    User queryById(int id){
        return userMapper.queryById(id);
    }

    @RequestMapping("/")
    List<User> queryAll(){
        return userMapper.queryAll();
    }

    @RequestMapping("/add")
    String add(User user){
        return userMapper.add(user) == 1 ? "success":"failed";
    }

    @RequestMapping("/updatebyid")
    String updateById(User user){
        return userMapper.updateById(user) == 1 ? "success": "failed";
    }

    @RequestMapping("/delbyid")
    String delById(int id){
        return userMapper.delById(id) == 1 ? "success":"failed";
    }

}
  • 启动项目,访问localhost:8080/user/add?name=long&age=1,会自动添加一条数据。
  • 访问/updatebyid?name=zhonghua&age=28&id=1,会实现更新。
  • 以此类推

三、配置分页功能

1、添加分页支持

​ 分页功能可以通过PageHelper来实现。要使用PageHelper,则需要添加如下的依赖,并增加Thymeleaf支持。

<dependency>
    <groupId>com.github.pagehelper</groupId>
    <artifactId>pagehelper</artifactId>
    <version>4.1.6</version>
</dependency>

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>

2、创建分页配置类

package com.darkerg.mybatisstudy.config;

import com.github.pagehelper.PageHelper;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import java.util.Properties;

@Configuration
public class PageHelperConfig {
    @Bean
    public PageHelper pageHelper(){
        PageHelper pageHelper = new PageHelper();
        Properties p = new Properties();
                p.setProperty("offsetAsPageNum","true");
                p.setProperty("rowBoundsWithCount","true");
                p.setProperty("reasonable","true");
        pageHelper.setProperties(p);

        return pageHelper;
    }
}

代码解释:

  • @Configuration:表示这个是配置类
  • @Bean:表示启动PageHelper拦截器
  • offsetAsPageNum:当设置为true时候,会将RowBounds第1个参数offset当成pageNum(页码)使用
  • rowBoundsWithCount:当设置为true时,使用RowBounds分页会进行count查询
  • reasonable:在启动合理化时,如果pageNum<1,则会查询第一页;如果pageNum>pages,则会查询最后一页

3、实现分页控制器

创建分页列表控制器,用以显示分页页面,见以下代码:

package com.darkerg.mybatisstudy.controller;

import com.darkerg.mybatisstudy.mapper.UserMapper;
import com.darkerg.mybatisstudy.pojo.User;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;

import java.util.List;

@Controller
public class UserListController {
    @Autowired
    UserMapper userMapper;

    @RequestMapping("/listall")
    public String listCategory(Model m, @RequestParam(value = "start",defaultValue = "0")int start,
                               @RequestParam(value = "size",defaultValue = "20")int size) throws Exception{
        PageHelper.startPage(start,size,"id desc");
            List<User> cs = userMapper.queryAll();
            PageInfo<User> page = new PageInfo<>(cs);
            m.addAttribute("page",page);
        
            return "list";
    }
}

参数说明:

  • start:在参数里接收当前是第几页
  • size:每页显示多少条数据。默认值分别是0和20
  • PageHelper.startPage(start,size,"id desc"):根据start、size进行分页,并且设置id倒叙排序。
  • List<User>:返回当前分页的集合
  • PageInfo<User>:根据返回的集合创建PageInfo对象
  • m.addAttribute("page",page):把page(PageInfo对象)传递给试图,以供后续显示。

4、创建分页试图

创建用于视图显示的list.html,其路径为“resources/template/list.html"

在视图中,通过page.pageNum获取当前页码,通过page.pages获取总页码数

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>list</title>
</head>
<body>

<div th:each="u:${page.list}">
    <span scope = "row" th:text="${u.id}">id</span>
    <span th:text = "${u.name}">name</span>
</div>

<div>
    <a th:href="@{listall?start=1}">[首页]</a>
    <a th:href="@{/liistall(start=${page.pageNum-1})}">[上页]</a>
    <a th:href="@{/liistall(start=${page.pageNum+1})}">[下页]</a>
    <a th:href="@{/liistall(start=${page.pages})}">[末页]</a>
<div>当前页/总页数:<a th:text = "${page.pageNum}" th:href="@{/listall(start=${page.pageNum})}"></a>
        /<a th:text="${page.pages}" th:href="@{/listall(start=${page.pages})}"></a></div>
</div>

</body>
</html>
  • 启动项目,多次访问localhost:8080/user/add?name=long&age=11增加数据
  • 然后访问:localhost:8080/listall,可以查看到分页列表
posted @ 2021-09-24 18:53  DarkerG  阅读(39)  评论(0编辑  收藏  举报