目录
一、知识点
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/p/products.html 得知
Mybaits中文:https://mybatis/mybatis-3/zh/index.html
Spring-mybatis::http://mybatis/spring/zh/index.html
mybatis-spring-boot-starter:http://mybatis/spring-boot-starter/mybatis-spring-boot-autoconfigure
1.1 mybatis概念
MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解来配置和映射原生类型、接口和 Java 的 POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。
MyBatis 是一款优秀的 ORM(Object Relational Mapping,对象关系映射)框架,它可以通过对象和数据库之间的映射,将程序中的对象自动存储到数据库中。它是 Apache 提供的一个开源项目,之前的名字叫做 iBatis,2010 年迁移到了 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等,能应付简单的CRUD
(Create
, Retrieve
, Update
, Delete
)对于连接查询或存储过程等还是要手动编写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工具 |
maven | 3.6.3 | idea自带 | 无需要安装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/getter、equals、canEqual、hashCode、toString方法
Spring Web:spring Web框架
JDBC API:spring-boot-starter-jdbc启动器
MySQL Driver:mysql-connector-java启动器,主要是安装mysql驱动
MyBatis Framework:MyBatis框架
此时会自动下载springBoot,完成之后会进入如下界面:
按上面介绍的,删除文件和修改格式,还需要做一下在pom.xml添加配置处理器启动器
<!-- 文件处理器,以后编写配置就有提示了 -->
<!-- https://mvnrepository/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/POM/4.0.0" xmlns:xsi="http://www.w3/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache/POM/4.0.0 https://maven.apache/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/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/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。 |
@Property | N/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 数组。 |
@Arg | N/A |
| ConstructorArgs 集合的一部分,代表一个构造方法参数。属性:id、column、javaType、jdbcType、typeHandler、select、resultMap。id 属性和 XML 元素 <idArg> 相似,它是一个布尔值,表示该属性是否用于唯一标识和比较对象。从版本 3.5.4 开始,该注解变为可重复注解。 |
@TypeDiscriminator | 方法 | <discriminator> | 决定使用何种结果映射的一组取值(case)。属性:column、javaType、jdbcType、typeHandler、cases。cases 属性是一个 Case 的数组。 |
@Case | N/A | <case> | 表示某个值的一个取值以及该取值对应的映射。属性:value、type、results。results 属性是一个 Results 的数组,因此这个注解实际上和 ResultMap 很相似,由下面的 Results 注解指定。 |
@Results | 方法 | <resultMap> | 一组结果映射,指定了对某个特定结果列,映射到某个属性或字段的方式。属性:value、id。value 属性是一个 Result 注解的数组。而 id 属性则是结果映射的名称。从版本 3.5.4 开始,该注解变为可重复注解。 |
@Result | N/A |
| 在列和属性或字段之间的单个结果映射。属性:id、column、javaType、jdbcType、typeHandler、one、many。id 属性和 XML 元素 <id> 相似,它是一个布尔值,表示该属性是否用于唯一标识和比较对象。one 属性是一个关联,和 <association> 类似,而 many 属性则是集合关联,和 <collection> 类似。这样命名是为了避免产生名称冲突。 |
@One | N/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 注解不允许产生循环引用。 |
@Many | N/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”一节。 |
| 方法 |
| 每个注解分别代表将会被执行的 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. |
| 方法 |
| 允许构建动态 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 以上可用) |
更多推荐
hualinux springMVC 5.12:SpringBoot使用mybaits操作数据库(web版)
发布评论