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

    技术2024-07-10  78

    目录

    一、知识点

    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-starter:http://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 以上可用)

    Processed: 0.014, SQL: 9