hualinux springMVC 5.12:SpringBoot使用mybaits操作数据库(web版)

目录

一、知识点

1.1 mybatis概念

 1.1.1 优点

1.1.2 缺点

1.2 工作原理图

1.3 Mybatis的框架分层

二、相关插件

2.1 mybatis-generator-maven-plugin自动生成代码插件

2.2 PageHelper分页插件

三、建立springBoot+mybatis工程

3.1 安装前说明

3.1.1 环境说明

3.1.2 tomcat安装及配置

3.1.3 springBoot myabits官网需要

3.2 创建springBoot mybatis项目

3.3 添加tomcat支持

四、springBoot+mybatis例子

4.1 代码目录结构说明

4.2 相关代码

4.2.1 stu类

4.2.2 application.yml配置

4.2.3 持久层mapper代码

4.2.4 服务层StuService代码

4.2.5 控制器层StuControrller代码

4.3 测试

附录一、创建mysql数据

附录二、MyBatis的SqlSession常用方法

附录三、Mybatis 映射器注解


我在《hualinux spring 4.22:SpringBoot使用mybaits操作数据库》发现springBoot的Mybtis启动器不支持,以web方式的,所以今天就以web方式完成没有完成的工作。即把《hualinux spring 4.20: 使用MyBatis-Spring操作数据库》使用sprngBoot方式开发。

一、知识点

根据mybatis项目地址: https://blog.mybatis.org/p/products.html 得知

Mybaits中文:https://mybatis.org/mybatis-3/zh/index.html

Spring-mybatis::http://mybatis.org/spring/zh/index.html

mybatis-spring-boot-starterhttp://mybatis.org/spring-boot-starter/mybatis-spring-boot-autoconfigure

1.1 mybatis概念

MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解来配置和映射原生类型、接口和 Java POJOPlain Old Java Objects,普通老式 Java 对象)为数据库中的记录。

MyBatis 是一款优秀的 ORMObject Relational Mapping,对象关系映射)框架,它可以通过对象和数据库之间的映射,将程序中的对象自动存储到数据库中。它是 Apache 提供的一个开源项目,之前的名字叫做 iBatis2010 年迁移到了 Google Code,并且将名字改为我们现在所熟知的 MyBatis,又于 2013 11 月迁移到了 Github

MyBatis 提供了普通 SQL 查询、事务、存储过程等功能,它的优缺点如下。

 1.1.1 优点

  • 相比于 JDBC 需要编写的代码更少
  • 使用灵活,支持动态 SQL
  • 提供映射标签,支持对象与数据库的字段关系映射

1.1.2 缺点

  • SQL 语句依赖于数据库,数据库移植性差
  • SQL 语句编写工作量大,尤其在表、字段比较多的情况下

总体来说,MyBatis 是一个非常优秀和灵活的数据持久化框架,适用于需求多变的互联网项目,也是当前主流的 ORM 框架。

 

1.2 工作原理图

1.3 Mybatis的框架分层

 

二、相关插件

2.1 mybatis-generator-maven-plugin自动生成代码插件

mybatis-generator-maven-plugin插件介绍:

其实MyBatis Generator并不需要spring boot环境,只需要自己写一个main方法运行即可。本文主要介绍使用maven插件的方式。

MyBatis Generator,缩写MBG,是一个Mybatis和iBatis的代码生成器。它支持Mybatis的所有版本,支持iBatis 2.2.0以后的版本。通过MyBatis Generator可以根据数据库表生成相应的实体、sql映射文件、Dao等,能应付简单的CRUDCreateRetrieveUpdateDelete对于连接查询或存储过程等还是要手动编写sql和对象

2.2 PageHelper分页插件

https://pagehelper.github.io

 

三、建立springBoot+mybatis工程

为了方便演示,我重新建立一个sprinbBoot工程和《hualinux springMVC 5.11:使用springBoot 进行springMVC开发[war方式]

是一样的,只不过是添加多一些插件,也可以直接在maven配置文件pom.xml中添加,为了方便,照顾亲手,我还是从0开始吧

3.1 安装前说明

3.1.1 环境说明

名称

版本

安装方式

备注

系统

win10

-

64位,旗舰版

jdk

14.0.1

exe

java开发工具目前最高最新版本

idea

2020.1

exe

java最著名的ide工具

maven3.6.3idea自带无需要安装idea以插件方式自带

具体安装见:《hualinux java 1.5:java开发工具idea 2020安装及配置

3.1.2 tomcat安装及配置

tomcat使用的是9.0.36在前章《hualinux springMVC 5.2:使用 idea建立简单springMVC》已经配置好了tomcat,这里我就不再操作了

3.1.3 springBoot myabits官网需要

目前官网mybatis-spring要求

注:上面的EOL表示下线的意思

3.2 创建springBoot mybatis项目

如果你之前有建立过项目的话,先关闭项目(File-->Close Project)

Lombok:主要是提供一组有用的注解,具体可看百度百科关于Lombok的解释,其中:

@Data 注解在类,生成setter/getterequalscanEqualhashCodetoString方法

Spring Web:spring Web框架

JDBC APIspring-boot-starter-jdbc启动器

MySQL Drivermysql-connector-java启动器,主要是安装mysql驱动

MyBatis Framework:MyBatis框架

此时会自动下载springBoot,完成之后会进入如下界面:

按上面介绍的,删除文件和修改格式,还需要做一下在pom.xml添加配置处理器启动器

        <!--  文件处理器,以后编写配置就有提示了  -->
        <!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-configuration-processor -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-configuration-processor</artifactId>
            <version>2.3.1.RELEASE</version>
        </dependency>

最终界面为:

修改pom.xml文件的时候记得点 Load Maven Changes

安装完成之后,其实可以看一下pom.xml做了哪些配置:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.3.1.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.hualinux</groupId>
    <artifactId>myspringboot-mybatis</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>war</packaging>
    <name>myspringboot-mybatis</name>
    <description>Demo project for Spring Boot</description>

    <properties>
        <java.version>14</java.version>
    </properties>

    <dependencies>
        <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.1.3</version>
        </dependency>

        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-tomcat</artifactId>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
            <exclusions>
                <exclusion>
                    <groupId>org.junit.vintage</groupId>
                    <artifactId>junit-vintage-engine</artifactId>
                </exclusion>
            </exclusions>
        </dependency>

        <!--  文件处理器,以后编写配置就有提示了  -->
        <!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-configuration-processor -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-configuration-processor</artifactId>
            <version>2.3.1.RELEASE</version>
        </dependency>

    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

如果不在新建立项目,直接在其它你项目上添加mybatis的话,缺少哪个就那个就好了。

3.3 添加tomcat支持

因为我们使用的是war包,所以不会使用spring boot自动带的tomcat,这样我们主需要配置一个tomcat

VM options 项中添加:-Dfile.encoding=UTF-8  防止idea最下方日志控制台输出乱码

 

在这里需要说一下:选择war还是war exploded的问题,首先看一下他们两个的区别:

war模式:将web工程以war包的形式上传到服务器 
war exploed模式:将web工程以当前文件夹的位置关系上传到服务器

  • war模式这种可以称之为是发布模式,看名字也知道,这是先打包war包,再发布;
  • war exploded模式是直接把文件夹,jsp页面,classes等等移到Tomcat部署文件夹里面,进行加载部署。因此这种方式支持热部署,一般在开发的时候也是用这种方式。
  • 在平时开发的时候,使用热部署的话,应该对Tomcat进行相应的设置,这样的话修改的jsp界面什么的东西才可以及时的显示出来 

修改红框的位置就可以实现热部署,但是如果修改了java源码还是得重启tomcat才能生效的

 

注:上面中URL表示tomcat的目前根目录被配置为http://localhost:8080/myspringboot_mybatis_war_exploded/

 

四、springBoot+mybatis例子

在这里我把《hualinux spring 4.20: 使用MyBatis-Spring操作数据库》使用sprngBoot方式开发。这里这里改用springBoot开发更简单,数据源、SqlSessionFactory基本不需要配置,springBoot可以直接集成!只需要添加相关的启动器即可,强大吧,简单吧!

4.1 代码目录结构说明

相关mysql数据建立见《附录一、创建mysql数据

application.yml:是数据库配置文件,如多配置文件的情况下,其它配置文件一定是以 application 为开头的还需要激活

Stu学生类的POJO

StuMapper映射器,在为加上了一个@Repository注解,使它变成Dao层

StuService作为服务层

StuControrller:
学生类控制器。因没有配置类,我在它的类上添加了@MapperScan,我没有使用thyemleaf模板,所以直接用@RestController返回值

为了实现mvc分层:

mapper:添加@Repository,设置为持久层当Dao层使用

StuService:添加@Service,作为服务层,为上层提供服务,

StuControrller:添加@Controller,因没用thyemleaf模板,所以改用@RestController

 

4.2 相关代码

4.2.1 stu

stu学生表结构

 com.hualinux.myspringbootmybatis.stu.Stu.java

package com.hualinux.myspringbootmybatis.stu;

import lombok.Data;
import org.springframework.stereotype.Component;

//@Component
@Data
public class Stu {
    String sid;
    String name;
    float yuWen;
    float shuXue;

}

4.2.2 application.yml配置

sprngBoot2.3.1默认使用了号称最快的连接快HikariCP,有兴趣的可以看官网:

https://github.com/brettwooldridge/HikariCP

spring:
  datasource:
    #    在[mysqld]下方添加:default-time-zone='+08:00'
    # 注:如果是mysql8则要写成 useSSL=FALSE&serverTimezone=GMT%2B8
    #url: jdbc:mysql://127.0.0.1:3306/rbac?usessl=false&serverTimezone=UTC
    url: jdbc:mysql://127.0.0.1:3306/hua?useSSL=FALSE&serverTimezone=GMT%2B8
    username: hua
    password: hua123
    driver-class-name: com.mysql.cj.jdbc.Driver
    type: com.zaxxer.hikari.HikariDataSource
    hikari:
      minimum-idle: 5
      maximum-pool-size: 15
      auto-commit: true
      idle-timeout: 30000
      pool-name: DatebookHikariCP
      max-lifetime: 1800000
      connection-timeout: 30000
      connection-test-query: SELECT 1

# 开启驼锋命名法
mybatis:
  configuration:
    map-underscore-to-camel-case: true

# 开启调试功能,看没开启缓存时,是不是连接数据库,每一次查询
logging:
  level:
    com:
      hualinux:
        myspringbootmybatis: debug
          #stu:
          #比debug级别更低的是trace
          #mapper: debug
        #pattern:
        #级别、内容、换行
        #console: '%p%m%n'

4.2.3 持久层mapper代码

com.hualinux.myspringbootmybatis.stu.mapper.StuMapper.java,接口

package com.hualinux.myspringbootmybatis.stu.mapper;

import com.hualinux.myspringbootmybatis.stu.Stu;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Select;
import org.springframework.stereotype.Repository;
import java.util.List;

// 这个Mapper作为持久层,向Service供数据
@Repository
//每一个类加 @Mapper 太麻烦了,可以在相关配置类加@MapperScan扫描装配到容器中
//指定这里是一个操作数据库的mapper,一定是接口类型,
@Mapper
public interface StuMapper {

    //查询单个学生,只有一行记录,所以一个Stu对象实例就搞定了
    @Select("SELECT sid,name,yuWen,shuXue FROM stu WHERE sid = #{sid}")
    Stu getStu(String sid);

    //查询所有学生,会有很多列,一个对象实例相当于一行记录,有多行,所以我使用列表。
    @Select("SELECT sid,name,yuWen,shuXue FROM stu")
    List<Stu> getStuAll();

}

4.2.4 服务层StuService代码

com.hualinux.myspringbootmybatis.stu.StuService .java

package com.hualinux.myspringbootmybatis.stu;

import com.hualinux.myspringbootmybatis.stu.mapper.StuMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;

@Service
public class StuService {
    @Autowired
    StuMapper stuMapper;

    public Stu findStuBySid(String sid){
        return stuMapper.getStu(sid);
    }

    public List<Stu> findStuAll() {
        return stuMapper.getStuAll();
    }

}

4.2.5 控制器层StuControrller代码

com.hualinux.myspringbootmybatis.stu.StuControrller.java

package com.hualinux.myspringbootmybatis.stu;

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

import java.util.Iterator;
import java.util.List;


//因为我没弄配置类,所以我就在控制器端弄个mapper扫描也行,因一个mapper所以关了
//@MapperScan("com.hualinux.mybatisspringboot.stu.mapper")
//因为我是直接返回值,所以不用@Controller,用它需要安装模板
@RestController
public class StuControrller {
    
    @Autowired
    StuService stuService;

    // {sid}占位符,使用RESTful风格
    @RequestMapping("/stu/{sid}")
    public String findStuBySid(@PathVariable("sid") String sid){
        Stu stu = stuService.findStuBySid(sid);
        String result = "学号:"+stu.getSid()+"<br/>名字:"+stu.getName()+"<br/>语文:"+ stu.getYuWen()+ "<br/>数学:"+stu.getShuXue();
        return result;
    }

    @RequestMapping("/stu/all")
    public List<Stu> getStuAll(){
        List<Stu> stus = stuService.findStuAll();
        Iterator<Stu> it = stus.iterator();
        System.out.println("学 号---名 字---语 文---数 学");
        while (it.hasNext()){
            Stu stu=it.next();
            System.out.println("  "+stu.getSid()+ "-----" +stu.getName() + "----"+stu.getYuWen() + "---" + stu.getShuXue());
        }
        return stus;
    }

}

4.3 测试

运行tomcat,在弹出的浏览器(我这里设置了火狐),主页我没配置,所以报错属于正常,在最后添加stu/2,效果如下:

把stu/2改为stu/all效果如下:

发现返回值变成了map形式了,这是因为@RestController所导致的,在完全缺省又没有手动注入转换器的情况下,默认把数据转成json格式。所以把list自动转化为了json格式输出。

再看IDE最下方的输出日志,也正常,如下图:

学 号---名 字---语 文---数 学
  1-----张三----51.0---65.0
  2-----李四----71.0---80.0
  3-----王五----87.6---90.0
  4-----陈六----55.9---88.0
  0-----谢九----77.0---59.0
  6-----天天----45.0---90.0
  7-----开心----70.0---100.0
  8-----乐儿----65.0---50.0
  9-----乐乐----88.0---29.5
  10-----笑笑----73.0---69.0
  11-----fly----90.0---89.0
  12-----乐天----90.0---70.0
  13-----云儿----95.0---65.0
  14-----伊洛----14.0---70.0
  15-----abc----86.0---98.0
  16-----菲菲----90.0---99.0
  17-----mm----71.0---61.0
  18-----lilei----98.0---61.0
  19-----hua----90.0---99.5

 

附录一、创建mysql数据

我这里使用mysql创建一个名为hua和stu的学生表,比较简单

CREATE DATABASE /*!32312 IF NOT EXISTS*/`hua` /*!40100 DEFAULT CHARACTER SET utf8 */;
USE `hua`;
DROP TABLE IF EXISTS `stu`;

CREATE TABLE `stu` (
  `id` INT(6) UNSIGNED NOT NULL AUTO_INCREMENT,
  `sid` VARCHAR(6) NOT NULL,
  `name` VARCHAR(10) NOT NULL,
  `yuWen` FLOAT DEFAULT '0',
  `shuXue` FLOAT DEFAULT '0',
  `sex` CHAR(2) NOT NULL DEFAULT '男',
  `zhiWei` CHAR(6) NOT NULL DEFAULT '学生',
  PRIMARY KEY (`id`),
  UNIQUE KEY `sid` (`sid`)
) ENGINE=INNODB AUTO_INCREMENT=20 DEFAULT CHARSET=utf8;

/*Data for the table `stu` */

INSERT  INTO `stu`(`id`,`sid`,`name`,`yuWen`,`shuXue`,`sex`,`zhiWei`) VALUES 
(1,'1','张三',51,65,'男','学生'),
(2,'2','李四',71,80,'男','学生'),
(3,'3','王五',87.6,90,'男','学生'),
(4,'4','陈六',55.9,88,'男','学生'),
(5,'0','谢九',77,59,'男','学生'),
(6,'6','天天',45,90,'男','学生'),
(7,'7','开心',70,100,'女','学生'),
(8,'8','乐儿',65,50,'女','音乐委'),
(9,'9','乐乐',88,29.5,'女','学生'),
(10,'10','笑笑',73,69,'女','学生'),
(11,'11','fly',90,89,'男','学生'),
(12,'12','乐天',90,70,'男','副班长'),
(13,'13','云儿',95,65,'女','学生'),
(14,'14','伊洛',14,70,'男','班长'),
(15,'15','abc',86,98,'男','学生'),
(16,'16','菲菲',90,99,'女','学习委'),
(17,'17','mm',71,61,'女','学生'),
(18,'18','lilei',98,61,'男','学生'),
(19,'19','hua',90,99.5,'男','学生');

 

附录二、MyBatis的SqlSession常用方法

sqlSesion常用 的方法如下:

➢int insert(String statement)。插入方法,参数statement是在配置文件中定义的sinscrt..>.元素的id,返回执行SQL语句所影响的行数。

➢int insert(String statement,Object parameter)。插入方法,参数statement是在配置文件中定义的<insert../>元素的id, parameter是插入所需的参数,通常是对象或者Map,返回执行SQL语句所影响的行数。

➢int update(String statement)。 更新方法,参数statement是在配置文件中定义的<update...>元素的 id,返回执行SQL语句所影响的行数。

➢int update(String statement,Object parameter)。更新方法,参数statement是在配置文件中定义的<uplate../>.元素的id, parameter是插入所需的参数,通常是对象或者Map,返回执行SQL语句所影响的行数。

➢int delete(String statement)。删除方法,参数statement是在配置文件中定义的<delete../>元素的id.返回执行SQL语句所影响的行数。

➢int delete(String statement,Object parameter)。删除方法,参数staterment是在配置文件中定义的<delete../>元素的id, parameter是插入所需的参数,通常是对象或者Map,返回执行SQL语句所影响的行数。

➢<T> T selectOne(String statement)。查询方法,参数statement是在配置文件中定义的<select../>元素的id。返回执行SQL语句查询结果的泛型对象,通常查询结果只有一条数据时才使用。

➢<T> T selectOne(String statement,Object parameter)。 查询方法,参数statement是在配置文件中定义的<select.../>元素的id, parameter 是查询所需的参数,通常是对象或者Map,返回执行SQL语句查询结果的泛型对象,通常查询结果只有一条数据时才使用。

➢<E> List<E> selectL ist(String statement)。 查询方法,参数是在配置文件中定义的<select../>元素的id,返回执行SQL语句查询结果的泛型对象的集合。

➢<E> List<E> selectl ist(String statement,Object parameter)。查询方法,参数statement是在配置文件中定义的<select.../>.元素的id, parameter 是查询所需的参数,通常是对象或者Map,返回执行SQL语句查询结果的泛型对象的集合。

➢<E> List<E> selectList(String statement,Object parameter,RowBounds rowBounds)。查询方法,参数statement是在配置文件中定义的<select..>元素的id, parameter 是查询所需的参数,通常是对象或者Map。RowBounds对象用于分页,它的两个属性: offset指查询的当前页数;limit指当前页显示多少条数据。返回执行SQL语句查询结果的泛型对象的集合。

➢<K,V> Map<K,V> selectMap(String statement,String mapKey)。 查询方法,参数statement是在配置文件中定义的select..>元素的id, mapKey 是返回数据的其中-一个列名,执行SQL语句查询的结果将会被封装成-一个Map集合返回,key 就是参数mapKey传入的列名,value 是封装的对象。

➢<K,V> Map<K,V> selectMap(String statement,Object parameter, String mapKey)。查询方法,参数statement是在配置文件中定义的<elect.. />元素的id, parameter 是查询所需的参数,通常是对象或者Map, mapKey 是返回数据的其中一个列名,执行SQL语句查询的结果将会被封装成一一个Map集合返回,key就是参数mapKey传入的列名,value是封装的对象。

➢<K,V> Map<K,V>selectMap(String statement,Object parameter,Sring mapKey, RowBounds rowBounds)。查询方法,参数staterment是在配置文件中定义的<select../>.元素的id,parameter是查询所需的参数,通常是对象或者Map, mapKey 是返回数据的其中一个列名,RowBounds 对象用于分页。执行SQL语句查询的结果将会被封装成- -个Map集合返回,key 就是参数mapKey传入的列名,value 是封装的对象。

➢void select(String statement,ResultHandler handler)。查询方法,参数statement是在配置文件中定义的<elct..>元素的id, ResultHandler对象用来处理查询返回的复杂结果集,通常用于多表查询。

➢void select(String statement,Object parameter,ResultHandler handler)。查询方法,参数statement是在配置文件中定义的<select../>元素的id, parameter 是查询所需的参数,通常是对象或者Map, ResultHandler 对象用来处理查询返回的复杂结果集,通常用于多表查询。

➢void select(Sring statement,Object parameter,RowBounds rowBounds, ResultHandler handler)。查询方法,参数statement是在配置文件中定义的<select../>元素的id,parameter是查询所需的参数,通常是对象或者Map, RowBounds 对象用于分页,ResultHandler对象用来处理查询返回的复杂结果集,通常用于多表查询。

➢void commit)。提交事务。

➢void rllback)。 回滚事务。

➢void close)。关闭SqlSession对象。

➢Connection getConnection()。获得JDBC的数据库连接对象。

➢<T> T getMapper(Class<T> type)。 返回mapper接口的代理对象,该对象关联了SlSession对象,开发者可以通过该对象直接调用方法操作数据库,参数type是Mapper的接口类型。MyBatis 官方手册建议通过mapper对象访问MyBatis.

 

附录三、Mybatis 映射器注解

更多映射器注解可以看mybatis官网的映射器注解

设计初期的 MyBatis 是一个 XML 驱动的框架。配置信息是基于 XML 的,映射语句也是定义在 XML 中的。而在 MyBatis 3 中,我们提供了其它的配置方式。MyBatis 3 构建在全面且强大的基于 Java 语言的配置 API 之上。它是 XML 和注解配置的基础。注解提供了一种简单且低成本的方式来实现简单的映射语句。

提示 不幸的是,Java 注解的表达能力和灵活性十分有限。尽管我们花了很多时间在调查、设计和试验上,但最强大的 MyBatis 映射并不能用注解来构建——我们真没开玩笑。而 C# 属性就没有这些限制,因此 MyBatis.NET 的配置会比 XML 有更大的选择余地。虽说如此,基于 Java 注解的配置还是有它的好处的。

注解如下表所示:                                                                                                                          

注解使用对象XML 等价形式描述
@CacheNamespace<cache>为给定的命名空间(比如类)配置缓存。属性:implemetation、eviction、flushInterval、size、readWrite、blocking、properties。
@PropertyN/A<property>指定参数值或占位符(placeholder)(该占位符能被 mybatis-config.xml 内的配置属性替换)。属性:name、value。(仅在 MyBatis 3.4.2 以上可用)
@CacheNamespaceRef<cacheRef>引用另外一个命名空间的缓存以供使用。注意,即使共享相同的全限定类名,在 XML 映射文件中声明的缓存仍被识别为一个独立的命名空间。属性:value、name。如果你使用了这个注解,你应设置 value 或者 name 属性的其中一个。value 属性用于指定能够表示该命名空间的 Java 类型(命名空间名就是该 Java 类型的全限定类名),name 属性(这个属性仅在 MyBatis 3.4.2 以上可用)则直接指定了命名空间的名字。
@ConstructorArgs方法<constructor>收集一组结果以传递给一个结果对象的构造方法。属性:value,它是一个 Arg 数组。
@ArgN/A
  • <arg>
  • <idArg>
ConstructorArgs 集合的一部分,代表一个构造方法参数。属性:id、column、javaType、jdbcType、typeHandler、select、resultMap。id 属性和 XML 元素 <idArg> 相似,它是一个布尔值,表示该属性是否用于唯一标识和比较对象。从版本 3.5.4 开始,该注解变为可重复注解。
@TypeDiscriminator方法<discriminator>决定使用何种结果映射的一组取值(case)。属性:column、javaType、jdbcType、typeHandler、cases。cases 属性是一个 Case 的数组。
@CaseN/A<case>表示某个值的一个取值以及该取值对应的映射。属性:value、type、results。results 属性是一个 Results 的数组,因此这个注解实际上和 ResultMap 很相似,由下面的 Results 注解指定。
@Results方法<resultMap>一组结果映射,指定了对某个特定结果列,映射到某个属性或字段的方式。属性:value、id。value 属性是一个 Result 注解的数组。而 id 属性则是结果映射的名称。从版本 3.5.4 开始,该注解变为可重复注解。
@ResultN/A
  • <result>
  • <id>
在列和属性或字段之间的单个结果映射。属性:id、column、javaType、jdbcType、typeHandler、one、many。id 属性和 XML 元素 <id> 相似,它是一个布尔值,表示该属性是否用于唯一标识和比较对象。one 属性是一个关联,和 <association> 类似,而 many 属性则是集合关联,和 <collection> 类似。这样命名是为了避免产生名称冲突。
@OneN/A<association>复杂类型的单个属性映射。属性: select,指定可加载合适类型实例的映射语句(也就是映射器方法)全限定名; fetchType,指定在该映射中覆盖全局配置参数 lazyLoadingEnabled; resultMap(available since 3.5.5), which is the fully qualified name of a result map that map to a single container object from select result; columnPrefix(available since 3.5.5), which is column prefix for grouping select columns at nested result map. 提示 注解 API 不支持联合映射。这是由于 Java 注解不允许产生循环引用。
@ManyN/A<collection>复杂类型的集合属性映射。属性: select,指定可加载合适类型实例集合的映射语句(也就是映射器方法)全限定名; fetchType,指定在该映射中覆盖全局配置参数 lazyLoadingEnabled resultMap(available since 3.5.5), which is the fully qualified name of a result map that map to collection object from select result; columnPrefix(available since 3.5.5), which is column prefix for grouping select columns at nested result map. 提示 注解 API 不支持联合映射。这是由于 Java 注解不允许产生循环引用。
@MapKey方法 供返回值为 Map 的方法使用的注解。它使用对象的某个属性作为 key,将对象 List 转化为 Map。属性:value,指定作为 Map 的 key 值的对象属性名。
@Options方法映射语句的属性该注解允许你指定大部分开关和配置选项,它们通常在映射语句上作为属性出现。与在注解上提供大量的属性相比,Options 注解提供了一致、清晰的方式来指定选项。属性:useCache=true、flushCache=FlushCachePolicy.DEFAULT、resultSetType=DEFAULT、statementType=PREPARED、fetchSize=-1、timeout=-1、useGeneratedKeys=false、keyProperty=""、keyColumn=""、resultSets="", databaseId=""。注意,Java 注解无法指定 null 值。因此,一旦你使用了 Options 注解,你的语句就会被上述属性的默认值所影响。要注意避免默认值带来的非预期行为。 The databaseId(Available since 3.5.5), in case there is a configured DatabaseIdProvider, the MyBatis use the Options with no databaseId attribute or with a databaseId that matches the current one. If found with and without the databaseId the latter will be discarded.

       注意:keyColumn 属性只在某些数据库中有效(如 Oracle、PostgreSQL 等)。要了解更多关于 keyColumn 和 keyProperty 可选值信息,请查看“insert, update 和 delete”一节。
  • @Insert
  • @Update
  • @Delete
  • @Select
方法
  • <insert>
  • <update>
  • <delete>
  • <select>
每个注解分别代表将会被执行的 SQL 语句。它们用字符串数组(或单个字符串)作为参数。如果传递的是字符串数组,字符串数组会被连接成单个完整的字符串,每个字符串之间加入一个空格。这有效地避免了用 Java 代码构建 SQL 语句时产生的“丢失空格”问题。当然,你也可以提前手动连接好字符串。属性:value,指定用来组成单个 SQL 语句的字符串数组。 The databaseId(Available since 3.5.5), in case there is a configured DatabaseIdProvider, the MyBatis use a statement with no databaseId attribute or with a databaseId that matches the current one. If found with and without the databaseId the latter will be discarded.
  • @InsertProvider
  • @UpdateProvider
  • @DeleteProvider
  • @SelectProvider
方法
  • <insert>
  • <update>
  • <delete>
  • <select>
允许构建动态 SQL。这些备选的 SQL 注解允许你指定返回 SQL 语句的类和方法,以供运行时执行。(从 MyBatis 3.4.6 开始,可以使用 CharSequence 代替 String 来作为返回类型)。当执行映射语句时,MyBatis 会实例化注解指定的类,并调用注解指定的方法。你可以通过 ProviderContext 传递映射方法接收到的参数、"Mapper interface type" 和 "Mapper method"(仅在 MyBatis 3.4.5 以上支持)作为参数。(MyBatis 3.4 以上支持传入多个参数)属性:type、method。type 属性用于指定类名。method 用于指定该类的方法名(从版本 3.5.1 开始,可以省略 method 属性,MyBatis 将会使用 ProviderMethodResolver 接口解析方法的具体实现。如果解析失败,MyBatis 将会使用名为 provideSql 的降级实现)。提示 接下来的“SQL 语句构建器”一章将会讨论该话题,以帮助你以更清晰、更便于阅读的方式构建动态 SQL。 The databaseId(Available since 3.5.5), in case there is a configured DatabaseIdProvider, the MyBatis will use a provider method with no databaseId attribute or with a databaseId that matches the current one. If found with and without the databaseId the latter will be discarded.
@Param参数N/A如果你的映射方法接受多个参数,就可以使用这个注解自定义每个参数的名字。否则在默认情况下,除 RowBounds 以外的参数会以 "param" 加参数位置被命名。例如 #{param1}, #{param2}。如果使用了 @Param("person"),参数就会被命名为 #{person}。
@SelectKey方法<selectKey>这个注解的功能与 <selectKey> 标签完全一致。该注解只能在 @Insert 或 @InsertProvider 或 @Update 或 @UpdateProvider 标注的方法上使用,否则将会被忽略。如果标注了 @SelectKey 注解,MyBatis 将会忽略掉由 @Options 注解所设置的生成主键或设置(configuration)属性。属性:statement 以字符串数组形式指定将会被执行的 SQL 语句,keyProperty 指定作为参数传入的对象对应属性的名称,该属性将会更新成新的值,before 可以指定为 true 或 false 以指明 SQL 语句应被在插入语句的之前还是之后执行。resultType 则指定 keyProperty 的 Java 类型。statementType 则用于选择语句类型,可以选择 STATEMENT、PREPARED 或 CALLABLE 之一,它们分别对应于 Statement、PreparedStatement 和 CallableStatement。默认值是 PREPARED。 The databaseId(Available since 3.5.5), in case there is a configured DatabaseIdProvider, the MyBatis will use a statement with no databaseId attribute or with a databaseId that matches the current one. If found with and without the databaseId the latter will be discarded.
@ResultMap方法N/A这个注解为 @Select 或者 @SelectProvider 注解指定 XML 映射中 <resultMap> 元素的 id。这使得注解的 select 可以复用已在 XML 中定义的 ResultMap。如果标注的 select 注解中存在 @Results 或者 @ConstructorArgs 注解,这两个注解将被此注解覆盖。
@ResultType方法N/A在使用了结果处理器的情况下,需要使用此注解。由于此时的返回类型为 void,所以 Mybatis 需要有一种方法来判断每一行返回的对象类型。如果在 XML 有对应的结果映射,请使用 @ResultMap 注解。如果结果类型在 XML 的 <select> 元素中指定了,就不需要使用其它注解了。否则就需要使用此注解。比如,如果一个标注了 @Select 的方法想要使用结果处理器,那么它的返回类型必须是 void,并且必须使用这个注解(或者 @ResultMap)。这个注解仅在方法返回类型是 void 的情况下生效。
@Flush方法N/A如果使用了这个注解,定义在 Mapper 接口中的方法就能够调用 SqlSession#flushStatements() 方法。(Mybatis 3.3 以上可用)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值