MyBatis持久层框架的用法知识小结

时间:2022-05-22 09:24:48

MyBatis 是支持普通 SQL查询,存储过程和高级映射的优秀持久层框架。MyBatis 消除了几乎所有的JDBC代码和参数的手工设置以及结果集的检索。MyBatis 使用简单的 XML或注解用于配置和原始映射,将接口和 Java 的POJOs(Plain Old Java Objects,普通的 Java对象)映射成数据库中的记录。

MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBatis 。

2013年11月迁移到Github,MyBatis的Github地址:https://github.com/mybatis/mybatis-3。

iBATIS一词来源于“internet”和“abatis”的组合,是一个基于Java的持久层框架。iBATIS提供的持久层框架包括SQL Maps和Data Access Objects(DAO)。

每个MyBatis应用程序主要都是使用SqlSessionFactory实例的,一个SqlSessionFactory实例可以通过SqlSessionFactoryBuilder获得。SqlSessionFactoryBuilder可以从一个xml配置文件或者一个预定义的配置类的实例获得。

1.使用Generator自动生成Dao层,Model层和Mapper层。

MyBatis Generator下载地址:http://www.mybatis.org/generator/

MyBatis Generator中文介绍:http://generator.sturgeon.mopaas.com/

以下用mybatis-generator-core-1.3.2.jar插件加jdbc数据库连接包自动导出持久层dao包,model包和mapper包。

需要用到的Java包有:

mybatis-generator-core-1.3.2.jar,

mysql-connector-java-5.1.34.jar,

ojdbc14-10.2.0.1.0.jar,

sqljdbc4-4.0.jar。

配置文件: generator.xml

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE generatorConfiguration PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN" "http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd">
<generatorConfiguration>
 <!-- 配置属性文件 用来在配置文件中引入变量 El表达式 -->
 <!-- 如果是用cmd方式运行 这里应该写url方式写全路径 因为找不到classpath 对于resource来说 -->
 <!--
 <properties url="file:///D:/workspaces/mybatisGen/bin/generatorConfig.properties"/>
 -->
 <!-- 数据库驱动包位置 -->
 <!-- SQL Server数据驱动包 -->
 <classPathEntry location="D:\JavaProject\generator\sqljdbc4-4.0.jar" />
 <!-- Oracle数据驱动包 -->
 <!--
 <classPathEntry location="D:\Java\m2\repository\com\oracle\ojdbc14\10.2.0.1.0\ojdbc14-10.2.0.1.0.jar" />
 -->
 <!-- MySQL数据驱动包 -->
 <!--
 <classPathEntry location="D:\JavaProject\generator\mysql-connector-java-5.1.34.jar" />
 -->
 <!-- 此处指定生成针对MyBatis3的DAO-->
 <!--
  id: 必须配置。这个上下文的惟一标识符。该值将被用在一些错误消息。
  defaultModelType:用来定义生成模型类型策略。
  1.conditional 默认策略,为每个表生成一个Model class
  2.flat:将所有的表中生成一个Model class,即这个类将保存所有表中字段
  3.hierarchical :如果表有一个主键,该模型将生成一个主键类,另一个类,用于容纳任何BLOB列在表中,和另一个类,用于容纳其余的字段。这个是一个适当的继承类之间的关系。
 targetRuntime:此属性用于指定运行时目标生成的代码。
  1.MyBatis3 默认值 将生成对象兼容MyBatis版本3.0和更高版本,和JSE 5.0和更高版本
  (例如Java模型和mapper接口将使用泛型类型)。
  “by example”方法在这些生成的对象支持几乎无限的动态where子句。
  此外,Java对象与这些生成器生成支持许多JSE 5.0特性包括参数化的类型和注释。
  2.Ibatis2Java2
  3.Ibatis2Java5
 -->
 <context id="MySQLTables" targetRuntime="MyBatis3" defaultModelType="conditional">
 <!--
 <plugin type="org.mybatis.generator.plugins.EqualsHashCodePlugin" />
 -->
 <!--
  用来生成注释
  1. suppressAllComments 默认是false 此属性用于指定在生成的代码是否将包括任何注释。如果设置为true 则不生成注释
  2. suppressDate 默认是false 此属性用于指定在生成的注释是否将包括MBG代时间戳。
 -->
 <commentGenerator>
  <property name="suppressAllComments" value="true" />
 </commentGenerator>
 <!-- 数据库链接URL、用户名、密码 -->
 <!-- MySQL数据库链接URL、用户名、密码 -->
 <!--
 <jdbcConnection driverClass="com.mysql.jdbc.Driver" connectionURL="jdbc:mysql://127.0.0.1:3310/test" userId="test" password="1234">
  </jdbcConnection>
 -->
 <!-- Oracle数据库链接URL、用户名、密码 -->
 <!--
 <jdbcConnection driverClass="oracle.jdbc.driver.OracleDriver" connectionURL="jdbc:oracle:thin:@127.0.0.1:1521:orcl" userId="test" password="1234">
 </jdbcConnection>
 -->
 <!-- SQL Server数据库链接URL、用户名、密码 -->
  <jdbcConnection driverClass="com.microsoft.sqlserver.jdbc.SQLServerDriver" connectionURL="jdbc:sqlserver://127.0.0.1:1433;DatabaseName=test" userId="test" password="1234">
  </jdbcConnection>
 <!-- H2
  <entry key="jdbc.url">jdbc:h2:tcp://localhost/test</entry>
  <entry key="jdbc.driver">org.h2.Driver</entry>
 -->
 <!-- SQLServer2000
  <entry key="jdbc.url">jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=[database]</entry>
  <entry key="jdbc.driver">com.microsoft.jdbc.sqlserver.SQLServerDriver</entry>
 -->
 <!-- SQLServer2005
  <entry key="jdbc.url">jdbc:sqlserver://192.168.0.98:1433;DatabaseName=[database]</entry>
  <entry key="jdbc.driver">com.microsoft.sqlserver.jdbc.SQLServerDriver</entry>
 -->
 <!-- JTDs for SQLServer
  <entry key="jdbc.url">jdbc:jtds:sqlserver://192.168.0.102:1433/[database];tds=8.0;lastupdatecount=true</entry>
  <entry key="jdbc.driver">net.sourceforge.jtds.jdbc.Driver</entry>
 -->
 <!-- PostgreSql
  <entry key="jdbc.url">jdbc:postgresql://localhost/[database]</entry>
  <entry key="jdbc.driver">org.postgresql.Driver</entry>
 -->
 <!-- Sybase
  <entry key="jdbc.url">jdbc:sybase:Tds:localhost:5007/[database]</entry>
  <entry key="jdbc.driver">com.sybase.jdbc.SybDriver</entry>
 -->
 <!-- DB2
  <entry key="jdbc.url">jdbc:db2://localhost:5000/[database]</entry>
  <entry key="jdbc.driver">com.ibm.db2.jdbc.app.DB2Driver</entry>
 -->
 <!-- HsqlDB
  <entry key="jdbc.url">jdbc:hsqldb:mem:generatorDB</entry>
  <entry key="jdbc.driver">org.hsqldb.jdbcDriver</entry>
 -->
 <!-- Derby
  <entry key="jdbc.url">jdbc:derby://localhost/databaseName</entry>
  <entry key="jdbc.driver">org.apache.derby.jdbc.ClientDriver</entry>
 -->
 <!-- java类型解析器 可选配置 -->
 <!--
  <javaTypeResolver type="">
  type属性: 这可用于指定一个用户提供的Java类型解析器。这个类必须实现接口org.mybatis.generator.api。
  JavaTypeResolver,必须有一个公共的默认构造函数。属性还可以接受特殊的值默认在这种情况下,将使用默认的实现(这同样的效果不指定类型)。
  该标签支持的属性:
  forceBigDecimals:默认是false 是否强制使用BigDecimal来表示所有的十进制和数值字段。
  •如果规模很大,长度大于18,将使用BigDecimal类型。
  •如果其长度为1018,则Java类型解析器将java.lang.Long来代替了。
  •如果长度为59,然后Java类型解析器将替换为一个Java.lang.integer。
  •如果其长度小于5,则Java类型解析器将以java.lang.Short替代。
 -->
 <javaTypeResolver>
  <property name="forceBigDecimals" value="false" />
 </javaTypeResolver>
 <!-- 生成vo对象 -->
 <!--
  < javaModelGenerator >元素用于定义Java模型生成的属性。
  Java模型生成器建立主键类,记录类,和查询示例类相匹配的表进行自省。这个元素是所需的子元素<上下文>元素。
  支持的属性:
  constructorBased:
  此属性用于选择是否MyBatis生成器将生成一个类的构造函数,它接受一个值类中的每个字段。同时,SQL结果地图将建成投入使用构造函数而不是“setter”每个字段。
  这个属性是只适用于MyBatis3和将被忽略了iBATIS2。
  默认值是false
  immutable:
  不可变,此属性用于选择是否MyBatis生成器将产生不可变模型类——这意味着类不会有“setter”方法和构造函数会接受类中每个字段的值。默认为false
  trimStrings:
  此属性用于选择MyBatis生成器是否添加代码来修剪的字符字段从数据库返回的空白空间。
  这很有用,如果您的数据库将数据存储在字符字段而不是VARCHAR字段。MyBatis生成器将插入代码来削减字符字段。
  默认值是false
 -->
 <!-- 生成实体类的包名和位置,这里配置将生成的实体类放在com.ouc.model这个包下 -->
 <javaModelGenerator targetPackage="com.ouc.model" targetProject="D:\JavaProject\generator\src">
  <property name="enableSubPackages" value="true" />
  <property name="trimStrings" value="true" />
 </javaModelGenerator>
 <!-- 生成用于查询的mapping对象 -->
 <!-- 生成的SQL映射文件包名和位置,这里配置将生成的SQL映射文件放在com.ouc.mapping这个包下 -->
 <sqlMapGenerator targetPackage="com.ouc.mapping" targetProject="D:\JavaProject\generator\src">
  <property name="enableSubPackages" value="true" />
 </sqlMapGenerator>
 <!-- 生成DAO的类文件以及配置文件 -->
 <!--
  < javaClientGenerator >元素是用来定义Java客户机代码生成器的属性。
  Java客户机生成器用来建立Java接口和类,以便可以方便地使用生成的Java模型和XML映射文件。
  对于iBATIS2目标环境,这些生成的对象采用形式的DAO接口和实现类。
  对于MyBatis,生成的对象采用mapper形式的接口。
  这个元素是一个可选的子元素。
  如果你不指定这个元素,MyBatis生成器(MBG)不会生成Java客户端接口和类。
  其中的type属性:
  如果targetRuntime 为MyBatis3
  XMLMAPPER:生成的对象将Java接口MyBatis 3.x mapper基础设施。接口将会依赖生成的XML映射器文件。一般都是使用这个XMLMAPPER.
 -->
 <!-- 生成DAO的包名和位置,这里配置将生成的dao类放在com.ouc.dao这个包下 -->
 <javaClientGenerator type="XMLMAPPER" targetPackage="com.ouc.dao" targetProject="D:\JavaProject\generator\src">
  <property name="enableSubPackages" value="true" />
 </javaClientGenerator>
 <!--
  <table>元素用于选择数据库中的一个表。选择的表将导致为每个表生成以下对象:
  •一个MyBatis / iBATIS•格式化的SQL的映射文件
  •一组类,形成了“模型”表包括:
  •一个类来匹配•表的主键(如果表有一个主键)。
  •表中字段匹配的,不是在主键,而非BLOB字段。这个类将扩展主键,如果有一个。
  •一个类来持有任何表中的BLOB字段(如果有的话)。这个类将扩展其中一个的前面两个类取决于表的配置。
  •一个类,用于生成动态where子句,在不同的“by Example”方法(selectByExample,deleteByExample)。
  •(可选)DAO接口和类
  tableName:必须配置 指定表的名称
  domainObjectName:生成javabean对象的基本名称。如果未指定,MBG将自动基于表名生成。
  这个名字(无论是在这里指定,或自动生成)将被用来作为域类名和DAO类的名字。
  enableInsert:是否生成插入语句。默认是true
  enableSelectByPrimaryKey:是否通过主键生成选择语句。不管是否有这种设置,如果该表没有一个主键将不会生成。
  enableUpdateByPrimaryKey:是否通过主键生成更新语句。如果该表没有主键,不管是否设置该属性,语句将不会生成。
  enableDeleteByPrimaryKey:是否通过主键生成删除语句。如果该表没有主键,不管这种设置该属性,语句将不会生成。
  enableDeleteByExample:是否通过example对象生成删除语句。这个声明使得许多不同的动态删除在运行时生成。
  enableCountByExample:是否通过example对象生成计算行数语句。该语句将返回一个表中的行数相匹配的example。
  enableUpdateByExample:是否通过example对象生成更新语句。该语句将更新一个表中相匹配的记录。
  selectByPrimaryKeyQueryId:这个值将被添加到选择列表中选择通过主键的声明在本表格:“' <值>作为QUERYID”。这可以用于识别查询在DBA在运行时跟踪工具。如果你需使用,你应该指定一个唯一的id为每个不同的查询生成MBG。
  selectByExampleQueryId:这个值将被添加到选择列表中选择通过例子的声明在本表格:“' <值>作为QUERYID”。这可以用于识别查询在DBA在运行时跟踪工具。如果你需使用,你应该指定一个唯一的id为每个不同的查询生成MBG。
  enableSelectByExample:是否应该生成通过example的选择语句。这个声明使得许多不同的动态查询是在运行时生成。
  modelType:此属性用于覆盖默认的模型类型,如果你想对这张表这么做。如果未指定,MBG将生成的域对象基于上下文默认的模型类型。
  该模型类型定义了如何将生成MBG域类。
  一些模型类型MBG将生成一个单一的域类为每个表,和其他可能产生不同的类MBG取决于表的结构。
  escapeWildcards:排除通配符。这意味着无论SQL通配符(' _ '' % ')的模式和表名都应该避免在搜寻列。
  这是一些驱动要求如果模式或表包含一个SQL通配符(例如,如果一个表的名字是MY_TABLE,一些驱动要求的下划线字符进行转义)。
 -->
 <!-- 要生成那些表(更改tableName和domainObjectName就可以) -->
 <table tableName="V_SupplyUser" domainObjectName="VSupplyUser" enableCountByExample="false" enableUpdateByExample="false" enableDeleteByExample="false" enableSelectByExample="false" selectByExampleQueryId="false" />
 <table tableName="WJ_GateList" domainObjectName="WJGateList" enableCountByExample="false" enableUpdateByExample="false" enableDeleteByExample="false" enableSelectByExample="false" selectByExampleQueryId="false" />
 </context>
</generatorConfiguration>

打开cmd命令行,转到配置文件所在的文件下,执行如下生成语句:

?
1
java -jar mybatis-generator-core-1.3.2.jar -configfile generator.xml -overwrite

命令执行完毕,可以看到对应路径下生成dao包,model包和mapper包文件。

2.MyBatis框架整合

1)MyBatis使用参数配置:sqlMapConfig.xml。

① 缓存配置(Cache):cacheEnabled:全局开关:默认是true,如果它配成false,其余各个Mapper XML文件配成支持cache也没用。

② 延迟加载:

lazyLoadingEnabled:true使用延迟加载,false禁用延迟加载,默认为true,当禁用时, 所有关联对象都会即时加载。

aggressiveLazyLoading:true启用时,当延迟加载开启时访问对象中一个懒对象属性时,将完全加载这个对象的所有懒对象属性。false,当延迟加载时,按需加载对象属性(即访问对象中一个懒对象属性,不会加载对象中其他的懒对象属性)。默认为true。

③ multipleResultSetsEnabled:允许和不允许单条语句返回多个数据集(取决于驱动需求)。默认为true。

④ useColumnLabel:使用列标签代替列名称。不同的驱动器有不同的做法。参考一下驱动器文档,或者用这两个不同的选项进行测试一下。

⑤ useGeneratedKeys:允许JDBC生成主键。需要驱动器支持。如果设为了true,这个设置将强制使用被生成的主键,有一些驱动器不兼容不过仍然可以执行。

⑥ autoMappingBehavior:指定MyBatis 是否并且如何来自动映射数据表字段与对象的属性。PARTIAL将只自动映射简单的,没有嵌套的结果。FULL 将自动映射所有复杂的结果。

⑦ defaultExecutorType:配置和设定执行器,SIMPLE执行器执行其它语句。REUSE执行器可能重复使用prepared statements语句,BATCH执行器可以重复执行语句和批量更新。

⑧ defaultStatementTimeout:设置一个时限,以决定让驱动器等待数据库回应的多长时间为超时。

完整sqlMapConfig.xml配置文件如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<settings>
<setting name="cacheEnabled" value="true" />
<setting name="lazyLoadingEnabled" value="true" />
<setting name="multipleResultSetsEnabled" value="true" />
<setting name="useColumnLabel" value="true" />
<setting name="useGeneratedKeys" value="false" />
<setting name="autoMappingBehavior" value="PARTIAL" />
<setting name="defaultExecutorType" value="SIMPLE" /><!-- SIMPLE REUSE BATCH -->
<!-- <setting name="defaultExecutorType" value="BATCH" /> -->
<setting name="defaultStatementTimeout" value="" />
<setting name="safeRowBoundsEnabled" value="false" />
<setting name="mapUnderscoreToCamelCase" value="false" />
<setting name="localCacheScope" value="SESSION" />
<!-- <setting name="jdbcTypeForNull" value="OTHER" /> -->
<setting name="jdbcTypeForNull" value="NULL" />
<setting name="lazyLoadTriggerMethods" value="equals,clone,hashCode,toString" />
</settings>
<typeAliases>
<!-- 模块 -->
<typeAlias alias="User" type="com.ouc.mkhl.platform.authority.model.User"/>
<typeAlias alias="Role" type="com.ouc.mkhl.platform.authority.model.Role"/>
<typeAlias alias="Equipment" type="com.ouc.mkhl.platform.basedata.model.Equipment"/>
<typeAlias alias="Factory" type="com.ouc.mkhl.platform.basedata.model.Factory"/>
</typeAliases>
<typeHandlers>
<typeHandler handler="com.ouc.openplatform.dao.mybatis.SerializableTypeHandler"/>
</typeHandlers>
</configuration>

序列化特殊值处理:SerializableTypeHandler

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
package com.ouc.openplatform.dao.mybatis;
import java.io.Serializable;
import java.sql.CallableStatement;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import org.apache.ibatis.type.BaseTypeHandler;
import org.apache.ibatis.type.JdbcType;
/**
* @author WuPing
*/
public class SerializableTypeHandler extends BaseTypeHandler<Serializable> {
@Override
public void setNonNullParameter(PreparedStatement ps, int i, Serializable parameter, JdbcType jdbcType)
throws SQLException {
ps.setObject(i, parameter);
}
@Override
public Serializable getNullableResult(ResultSet rs, String columnName)
throws SQLException {
return (Serializable)rs.getObject(columnName);
}
@Override
public Serializable getNullableResult(ResultSet rs, int columnIndex)
throws SQLException {
return (Serializable)rs.getObject(columnIndex);
}
@Override
public Serializable getNullableResult(CallableStatement cs, int columnIndex)
throws SQLException {
return (Serializable)cs.getObject(columnIndex);
}
}

2)结果集resultMap:

MyBatis中在查询进行select映射的时候,返回类型可以用resultType,也可以用resultMap,resultType是直接表示返回类型的,而resultMap则是对外部ResultMap的引用,但是resultType跟resultMap不能同时存在。在MyBatis进行查询映射的时候,其实查询出来的每一个属性都是放在一个对应的Map里面的,其中键是属性名,值则是其对应的值。当提供的返回类型属性是resultType的时候,MyBatis会将Map里面的键值对取出赋给resultType所指定的对象对应的属性。所以其实MyBatis的每一个查询映射的返回类型都是ResultMap,只是当我们提供的返回类型属性是resultType的时候,MyBatis对自动的给我们把对应的值赋给resultType所指定对象的属性,而当我们提供的返回类型是resultMap的时候,因为Map不能很好表示领域模型,我们就需要自己再进一步的把它转化为对应的对象,这常常在复杂查询中很有作用。

示例:UserBaseResultMap

?
1
2
3
4
5
6
7
8
9
10
<resultMap id="UserBaseResultMap" type="User" >
<id column="id" property="id" jdbcType="INTEGER" />
<result column="userName" property="userName" jdbcType="VARCHAR" />
<result column="password" property="password" jdbcType="VARCHAR" />
<result column="email" property="email" jdbcType="VARCHAR" />
<result column="trueName" property="trueName" jdbcType="VARCHAR" />
<result column="sex" property="sex" jdbcType="VARCHAR" />
<result column="age" property="age" jdbcType="INTEGER" />
<result column="telephone" property="telephone" jdbcType="VARCHAR" />
</resultMap>

model类:User

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
package com.ouc.mkhl.platform.authority.model;
import java.io.Serializable;
//用户信息
public class User implements Serializable {
 private static final long serialVersionUID = 1098321123L;
 private Integer id; //用户Id
 private String userName; //用户名
 private String password; //未加密密码
 private String email; //邮箱
 private String trueName; //真实姓名
 private String sex; //性别
 private Integer age; //年龄
 private String telephone; //手机
 public Integer getId() {
 return id;
 }
 public void setId(Integer id) {
 this.id = id;
 }
 public String getUserName() {
 return userName;
 }
 public void setUserName(String userName) {
 this.userName = userName == null ? null : userName.trim();
 }
 public String getPassword() {
 return password;
 }
 public void setPassword(String password) {
 this.password = password == null ? null : password.trim();
 }
 public String getEmail() {
 return email;
 }
 public void setEmail(String email) {
 this.email = email == null ? null : email.trim();
 }
 public String getTrueName() {
 return trueName;
 }
 public void setTrueName(String trueName) {
 this.trueName = trueName == null ? null : trueName.trim();
 }
 public String getSex() {
 return sex;
 }
 public void setSex(String sex) {
 this.sex = sex == null ? null : sex.trim();
 }
 public Integer getAge() {
 return age;
 }
 public void setAge(Integer age) {
 this.age = age;
 }
 public String getTelephone() {
 return telephone;
 }
 public void setTelephone(String telephone) {
 this.telephone = telephone == null ? null : telephone.trim();
 }
}

3)增删改查:

(1)select查询:

① id:在这个模式下唯一的标识符,可被其它语句引用。

② parameterType:传给此语句的参数的完整类名或别名。

③ resultType:语句返回值类型的整类名或别名。注意,如果是集合,那么这里填写的是集合的项的整类名或别名,而不是集合本身的类名。(resultType 与resultMap 不能并用)

④ resultMap:引用的外部resultMap名。结果集映射是MyBatis 中最强大的特性。许多复杂的映射都可以轻松解决。(resultType 与resultMap 不能并用)

⑤ flushCache:如果设为true,则会在每次语句调用的时候就会清空缓存。select语句默认设为false。

⑥ useCache:如果设为true,则语句的结果集将被缓存。select语句默认设为false。

⑦ timeout :设置驱动器在抛出异常前等待回应的最长时间,默认为不设值,由驱动器自己决定。

示例:查询所有用户信息:selectUsers

?
1
2
3
<select id="selectUsers" resultMap="UserBaseResultMap">
select id,userName,email from user
</select>

(2) insert插入:saveUser

此处数据库表使用主键自增,主键为id。

① fetchSize:设置一个值后,驱动器会在结果集数目达到此数值后,激发返回,默认为不设值,由驱动器自己决定。

② statementType:statement,preparedstatement,callablestatement。预准备语句、可调用语句。

③ useGeneratedKeys:使用JDBC的getGeneratedKeys方法来获取数据库自己生成的主键(MySQL、SQLSERVER等关系型数据库会有自动生成的字段)。

④ keyProperty:标识一个将要被MyBatis设置进getGeneratedKeys的key所返回的值,或者为insert语句使用一个selectKey子元素。

?
1
2
3
4
5
6
<insert id="saveUser" parameterType="User" >
insert into user (userName, password, email, trueName, sex, age, telephone)
values (#{userName,jdbcType=VARCHAR}, #{password,jdbcType=VARCHAR},
#{email,jdbcType=VARCHAR}, #{trueName,jdbcType=VARCHAR},
#{sex,jdbcType=VARCHAR}, #{age,jdbcType=INTEGER}, #{telephone,jdbcType=VARCHAR})
</insert>

(3)update更新:动态更新SQL:updateUser

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
<update id="updateUser" parameterType="User" >
update user
<set >
<if test="userName != null" >
userName = #{userName,jdbcType=VARCHAR},
</if>
<if test="password != null" >
password = #{password,jdbcType=VARCHAR},
</if>
<if test="email != null" >
email = #{email,jdbcType=VARCHAR},
</if>
<if test="trueName != null" >
trueName = #{trueName,jdbcType=VARCHAR},
</if>
<if test="sex != null" >
sex = #{sex,jdbcType=VARCHAR},
</if>
<if test="age != null" >
age = #{age,jdbcType=INTEGER},
</if>
<if test="telephone != null" >
telephone = #{telephone,jdbcType=VARCHAR},
</if>
</set>
where id = #{id,jdbcType=INTEGER}
</update>

(4)delete删除:deleteUser

?
1
2
3
4
<delete id="deleteUser" parameterType="Integer">
delete from user
where id = #{id,jdbcType=INTEGER}
</delete>

(5)sql: Sql元素用来定义一个可以复用的SQL语句段,供其它语句调用。

?
1
2
3
4
5
6
7
8
<sql id="UserBaseColumnList" >
userName, password, email, telephone
</sql>
<select id="getUsers" resultMap="UserBaseResultMap">
select
<include refid="UserBaseColumnList" />
from user
</select>

(6)参数:parameters:MyBatis可以使用基本数据类型和Java的复杂数据类型。

基本数据类型,String,int,date等。

使用基本数据类型,只能提供一个参数,所以需要使用Java实体类,或Map类型做参数类型。通过#{}可以直接得到其属性。

① 基本数据类型参数:String

?
1
2
3
4
<select id="getUserByName" resultType="User" parameterType="String" >
select id, userName, email from user
where userName = #{userName,jdbcType=VARCHAR}
</select>

Java代码:

?
1
public User getUserByName(String name); // 根据用户名获取用户信息

② Java实体类型参数:User

?
1
2
3
4
5
6
<insert id="saveUser" parameterType="User" >
insert into user (userName, password, email, trueName, sex, age, telephone)
values (#{userName,jdbcType=VARCHAR}, #{password,jdbcType=VARCHAR},
#{email,jdbcType=VARCHAR}, #{trueName,jdbcType=VARCHAR},
#{sex,jdbcType=VARCHAR}, #{age,jdbcType=INTEGER}, #{telephone,jdbcType=VARCHAR})
</insert>

Java代码:

?
1
public int saveUser(User user); // 插入用户信息

③ Map参数:Map<String, Object> recordMap

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<select id="selectChildGroupTotalNum" resultType="Integer" >
select count(*) from groupinfo
<trim prefix="WHERE" prefixOverrides="AND|OR">
and id in
<foreach collection="idStr" item="ids" open="(" separator="," close=")">
#{ids}
</foreach>
<if test="name!= null and name!='' " >
and name LIKE CONCAT(CONCAT('%', #{name}),'%')
</if>
<if test="description!= null and description!='' " >
AND description LIKE CONCAT(CONCAT('%', #{description}),'%')
</if>
<if test="type != null and type!=-1 " >
AND type = #{type,jdbcType=INTEGER}
</if>
<if test="category != null and category!=-1 " >
AND category = #{category,jdbcType=INTEGER}
</if>
</trim>
</select>

Java代码:

?
1
2
3
4
5
6
7
8
9
//获取子组总记录数
public int selectChildGroupTotalNum(Map<String, Object> recordMap);
Map<String, Object> recordMap = new HashMap<String, Object>();
recordMap.put("idStr", group.getChildgroupids().split(","));
recordMap.put("name", name);
recordMap.put("description", description);
recordMap.put("type", -1);
recordMap.put("category", -1);
childGroupTotalNum = groupDao.selectChildGroupTotalNum(recordMap);

④ 多参数:

方法一:按顺序传递参数。

?
1
2
3
4
5
<!-- 根据参数名查询参数 -->
<select id="selectSensorNobySensorName" resultType="Integer" useCache="false" flushCache="true">
select SensorNo from sensorconfig
where Name = #{0} and TestunitNo = #{1} and LABCODE = #{2}
</select>

Java代码:

?
1
2
//根据参数名查询参数ID
public int selectSensorNobySensorName(String sensorName, int testUnitNo, String labCode);

方法二:接口参数上添加@Param注解。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
<select id="selectByUserNameAndVCode" resultMap="UserBaseResultMap">
select id, userName from user
<trim prefix="WHERE" prefixOverrides="AND|OR">
<if test="userName!= null and userName!='' ">
and userName LIKE CONCAT(CONCAT('%', #{userName}),'%')
</if>
<if test="supplierno!= null and supplierno!='' ">
and supplierNo LIKE CONCAT(CONCAT('%', #{supplierno}),'%')
</if>
and supplierNo != 'test'
</trim>
LIMIT #{startIndex},#{pageSize}
</select>

Java代码:

?
1
2
3
4
5
// 根据用户名和V码查询用户信息
public List<User> selectByUserNameAndVCode(
@Param("userName") String userName,
@Param("supplierno") String supplierno,
@Param("startIndex") int startIndex, @Param("pageSize") int pageSize);

4)动态SQL语句:

selectKey标签,if标签,if + where的条件判断,if + set的更新语句,if + trim代替where/set标签,trim代替set,choose (when, otherwise),foreach标签。动态SQL语句算是MyBatis最灵活的部分吧,用好了非常方便。

示例:selectTotalNumByAccountType

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<select id="selectTotalNumByAccountType" resultType="Integer" >
select count(*) from user
<trim prefix="WHERE" prefixOverrides="AND|OR">
and id not in
<foreach collection="idStr" item="ids" open="(" separator="," close=")">
#{ids}
</foreach>
<if test="userName!= null and userName!='' ">
and userName LIKE CONCAT(CONCAT('%', #{userName}),'%')
</if>
<if test="supplierno!= null and supplierno!='' ">
and supplierNo LIKE CONCAT(CONCAT('%', #{supplierno}),'%')
</if>
<if test="trueName!= null and trueName!='' ">
and trueName LIKE CONCAT(CONCAT('%', #{trueName}),'%')
</if>
AND accountType = #{accountType}
</trim></select>

以上所述是小编给大家介绍的MyBatis持久层框架的用法知识小结,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对服务器之家网站的支持!