`
禹爸爸
  • 浏览: 86277 次
  • 性别: Icon_minigender_1
  • 来自: 苏州
社区版块
存档分类
最新评论

Mybatis系列(四)映射文件

阅读更多

Mybatis系列(四)映射文件

引言

Mybatis的真正强大,在于她对SQL的映射,这也是她吸引人的地方。实现相同的功能,她要比直接使用JDBC省去95%的代码量。而且将SQL语句独立在Java代码之外,为程序的修改和纠错提供了更大的灵活性,可以直接修改SQL语句,而无需重新编译Java程序。

本文将在上一篇《Mybatis系列之简单示例》的基础上,对映射文件进行详细的讨论学习。

SQL映射文件也是XML格式,其顶级元素有以下几个:

 

  • select - 映射sql查询语句
  • insert - 映射sql插入语句
  • update - 映射sql更新语句
  • delete - 映射sql删除语句
  • sql - 就像程序中可以复用的函数一样,这个元素下放置可以被其他语句重复引用的sql语句
  • resultMap - 用来描述如何从数据库查询结果集中来加载对象
  • cache - 给定命名空间的缓存配置
  • cache-ref - 其他命名空间缓存配置引用
下面从语句本身开始,在上一篇《Mybatis系列之简单示例》的基础上,为大家一一阐述各元素用法。

 

查询语句映射

查询语句,是sql中使用频率最高的语句,Mybatis中的查询语句映射也是很简单的。如:

 

	<select id="getById" parameterType="int" resultType="User">
		SELECT user_name, user_password, nick_name, email, user_type_id, is_valid, created_time
		FROM sys_user WHERE user_id = #{id}
	</select>


这是一条被称作getById的查询,需要一个类型为int或是Integer的参数,查询返回一个User类型对象,对象的属性名称就是查询语句中的列名,属性值就是查询结果行中对应的值。

 

 

请注意,上句话中斜体加粗部分,“查询语句中的列名”意味着在对查询结果进行实体映射时,使用的是查询语句中的列名进行映射的,而非数据表中的。举例说明:select user_name .....,那么对应的实体对象属性名称就是user_name;如果在查询时使用了别名,如select user_name as userName,那么对应的实体对象的属性名称就是userName。

通常情况下,数据表对字段命名规则使用下划线进行分词的,而Java中却是使用驼峰式的命名规则,那么是不是意味着我们在数据表中也要使用驼峰式命名规则,或是在查询语句中都要使用别名方式呢?其实完全不必,Mybatis早早就替我们考虑到这点的,在Mybatis核心配置文件中,只需要添加以下代码,Mybatis就可以自动的将a_column转换为aColumn。

 

<settings>
    <!-- 将数据库字段命名规则A_COLUMN转换为Java使用的驼峰式命名规则aCloumn -->
    <setting name="mapUnderscoreToCamelCase" value="true" />
</settings>

 

请注意select元素中#{id}的用法,这里就是告诉Mybatis创建一个预处理语句参数,通过JDBC,这样的参数在sql中会是用一个"?"来标识,并被传递到预处理语句中。就像下面这段代码:

 

// Similar JDBC code, NOT MyBatis…
String getById = "SELECT user_name, user_password, nick_name, email, user_type_id, is_valid, created_time FROM sys_user WHERE user_id=?";
PreparedStatement ps = conn.prepareStatement(getById);
ps.setInt(1,id);


当然,在获得结果集后,我们还需要额外编写很多代码,将结果集的中数据映射到一个Java对象上。如果使用Mybatis,这些全部省去了,想想都很让人兴奋。(Mybatis会将#{与}之间的内容转换为预处理语句中的"?")

 

 

select语句有,有很多属性允许我们来配置,以决定每条sql语句的作用细节。

 

<select
  id="getById"
  parameterType="int"
  parameterMap="deprecated"
  resultType="User"
  resultMap="userResultMap"
  flushCache="false"
  useCache="true"
  timeout="10000"
  fetchSize="256"
  statementType="PREPARED"
  resultSetType="FORWARD_ONLY">

属性 描述
id 在命名空间中唯一的标识符,可以被用来引用这条语句。
parameterType 将会传入这条语句的参数类的完全限定名或别名。这个属性是可选的,因为 MyBatis 可以通过 TypeHandler 推断出具体传入语句的参数,默认值为 unset。
resultType 从这条语句中返回的期望类型的类的完全限定名或别名。注意如果是集合情形,那应该是集合可以包含的类型,而不能是集合本身。使用 resultType 或 resultMap,但不能同时使用。
resultMap 外部 resultMap 的命名引用。结果集的映射是 MyBatis 最强大的特性,对其有一个很好的理解的话,许多复杂映射的情形都能迎刃而解。使用 resultMap 或 resultType,但不能同时使用。
flushCache 将其设置为 true,任何时候只要语句被调用,都会导致本地缓存和二级缓存都会被清空,默认值:false。
useCache 将其设置为 true,将会导致本条语句的结果被二级缓存,默认值:对 select 元素为 true。
timeout 这个设置是在抛出异常之前,驱动程序等待数据库返回请求结果的秒数。默认值为 unset(依赖驱动)。
fetchSize 这是尝试影响驱动程序每次批量返回的结果行数和这个设置值相等。默认值为 unset(依赖驱动)。
statementType STATEMENT,PREPARED 或 CALLABLE 的一个。这会让 MyBatis 分别使用 Statement,PreparedStatement 或 CallableStatement,默认值:PREPARED。
resultSetType FORWARD_ONLY,SCROLL_SENSITIVE 或 SCROLL_INSENSITIVE 中的一个,默认值为 unset (依赖驱动)。
databaseId 如果配置了 databaseIdProvider,MyBatis 会加载所有的不带 databaseId 或匹配当前 databaseId 的语句;如果带或者不带的语句都有,则不带的会被忽略。
resultOrdered 这个设置仅针对嵌套结果 select 语句适用:如果为 true,就是假设包含了嵌套结果集或是分组了,这样的话当返回一个主结果行的时候,就不会发生有对前面结果集的引用的情况。这就使得在获取嵌套的结果集的时候不至于导致内存不够用。默认值:false
resultSets 这个设置仅对多结果集的情况适用,它将列出语句执行后返回的结果集并每个结果集给一个名称,名称是逗号分隔的。

在映射文件中定义好查询语句之后,就可以在Java代码中做如下调用:(这里插播个预告,在后面的《Mybatis系列之接口方式编程》中,我们会使用一个更简洁的方式来调用映射文件中的sql语句)

 

	@Test
	public void testGetById() {
		SqlSession session = sqlSessionFactory.openSession();
		try {
			User user;

			Object obj = session.selectOne("com.emerson.learning.mapping.user.getByID", 1);
			if (null == obj) {
				System.out.println("the result is null.");
			} else {
				user = (User) obj;
				System.out.println(user);
			}
		} finally {
			session.close();
		}
	}

 

 

插入语句映射

插入语句和查询语句类似,也需要定义唯一的id,指定传入参数类型。

 

	<!-- 写入新记录并返回主键值,注意,这里的KeyProperty应该是Java类里的属性名称,而非数据表中的字段名 -->
	<insert id="insertUser" parameterType="User" useGeneratedKeys="true"
		keyProperty="userId">
		INSERT INTO sys_user(user_name, user_password, nick_name,
		user_type_id, is_valid, created_time)
		VALUES(#{userName},
		#{userPassword}, #{nickName}, #{userTypeId}, #{isValid},
		#{createdTime})
	</insert>

 

针对插入语句,这里有一点需要进行特别说明,那就是如何获得新插入数据的主键值。

在允许使用自增长字段做为主键的数据库中(如MSSQL,Mysql),我们只需要在insert元素中增加两个属性值即可。如:

 

<insert id="insertUser" parameterType="User" useGeneratedKeys="true" keyProperty="userId">

将属性userGeneratedKeys设为true,并将KeyProperty属性设为数据表主键对应的实体对象属性名称。这句话有点绕,我们就以上面这条插入语句为例,数据表中主键是user_id,对应的实体对象中的属性名称是userId,所以这里我们就把userId高为KeyProperty的值。

 

在不允许有自增字段的数据库中(如Oracle数据库),Mybatis有另外一种方法生成数据表主键,即在insert元素内部增加一个selectKey元素,用于生成数据表主键。如

 

<insert id="insertUser" parameterType="User">
	<selectKey keyProperty="userId" resultType="int" order="BEFORE">
		select CAST(RANDOM()*1000000 as INTEGER) a from SYSIBM.SYSDUMMY1
	</selectKey>
	INSERT INTO sys_user(user_name, user_password, nick_name,
	user_type_id, is_valid, created_time)
	VALUES(#{userName},
	#{userPassword}, #{nickName}, #{userTypeId}, #{isValid},
	#{createdTime})
</insert>

 

selectKey属性
属性 描述
keyProperty selectKey 语句结果应该被设置的目标属性。如果希望得到多个生成的列,也可以是逗号分隔的属性名称列表。
keyColumn 匹配属性的返回结果集中的列名称。如果希望得到多个生成的列,也可以是逗号分隔的属性名称列表。
resultType 结果的类型。MyBatis 通常可以推算出来,但是为了更加确定写上也不会有什么问题。MyBatis 允许任何简单类型用作主键的类型,包括字符串。如果希望作用于多个生成的列,则可以使用一个包含期望属性的 Object 或一个 Map。
order 这可以被设置为 BEFORE 或 AFTER。如果设置为 BEFORE,那么它会首先选择主键,设置 keyProperty 然后执行插入语句。如果设置为 AFTER,那么先执行插入语句,然后是 selectKey 元素 - 这和像 Oracle 的数据库相似,在插入语句内部可能有嵌入索引调用。
statementType 与前面相同,MyBatis 支持 STATEMENT,PREPARED 和 CALLABLE 语句的映射类型,分别代表 PreparedStatement 和 CallableStatement 类型。

Java中的调用代码如下,session对象的insert/update/delete方法均返回一个整型数值,表示操作所影响的记录行数。

 

	@Test
	public void testInsertUser() {
		SqlSession session = sqlSessionFactory.openSession();
		try {
			User user = new User();
			user.setEmail("chris.mao.zb@163.com");
			user.setNickName("Chris Mao");
			user.setUserName("cmzb");
			user.setIsValid(1);
			user.setUserPassword("5f4dcc3b5aa765d61d8327deb882cf99");

			int effectedRows = session.insert("com.emerson.learning.mapping.user.insertUser", user); assertEquals(effectedRows, 1);
			System.out.println("New Id is " + user.getUserId());
			session.commit();
		} finally {
			session.close();
		}
	}

更新语句映射

 

<update id="udpateUser" parameterType="User">
    UPDATE sys_user
    SET user_name = #{userName}, user_password = #{userPassword},nick_name = #{nickName},user_type_id = #{userTypeId},is_valid = #{isValid}
    WHERE user_id = #{userId}
</update>

 

删除语句映射

 

<delete id="deleteById" parameterType="int">
    DELETE FROM sys_user WHERE user_id = #{id}
</delete>

 

SQL

 

这个元素用来定义可以重复使用的sql语句。可复用的不一定要是一个完整的sql语句,也可以是sql语句中的一部分,如字段名称等。

以查询和插入为例,我们在查询语句中会写出好多的列名称;同样,在插入语句时也要写出这些字段名称,那么这时,我们就可以把这部分重复的sql语句单独拿出来定义。如

 

 

	<sql id="columns">user_name, user_password, nick_name, email, user_type_id,
		is_valid, created_time</sql>

	<!-- 根据传入的Id值,到数据库中查询记录 -->
	<select id="getByID" parameterType="int" resultType="User">
		SELECT
		<include refid="columns"></include>
		FROM sys_user WHERE user_id = #{id}
	</select>

	<!-- 按用户名进行模糊查询 -->
	<select id="queryByName" parameterType="User" resultType="User">
		SELECT
		<include refid="columns"></include>
		FROM sys_user
		<where>
			<if test="userName != null">user_name like '%' #{userName} '%'</if>
		</where>
	</select>

	<!-- 创建新用户,并写入到数据表中 -->
	<!-- 写入新记录并返回主键值,注意,这里的KeyProperty应该是Java类里的属性名称,而非数据表中的字段名 -->
	<insert id="insertUser" parameterType="User" useGeneratedKeys="true"
		keyProperty="userId">
		INSERT INTO sys_user(<include refid="columns"></include>)
		VALUES(#{userName},
		#{userPassword}, #{nickName}, #{userTypeId}, #{isValid},
		#{createdTime})
	</insert>

 

查询参数

 

通过上面部分的讲解,细心的朋友已经发现了,Mybatis是使用#{}来定义参数的,出现在sql语句中的#{}都会为转换为预处理语句中的"?"。

如果参数是简单类型,如int, string等,则#{}中写什么名称什么名称都可以,或是写成通用的#{_parameter}。这种写法仅限于简单数据类型。

如果参数是一个自定义类型,则#{}中写的就是相应的属性名称,如#{userName},#{nickName}。

Mybatis还定义了另外一种参数形式,就是${}。这个可以理解成一个占位符,她会被替找成传入的值。

默认情况下,使用#{}格式的语法会导致Mybatis创建预处理语句属性,并安全地设置传入值(比如会自动对字符型数据两边加上引号等)。这样做更安全、更迅速,也是道选做法。不过有时只是想直接在sql语句中原样不变地插入一个字符串,比如ORDER BY  ${COLUMN}。

查询结果集

ResultMap是Mybatis最重要、最强大,也是相对最复杂的一个元素。这里就不多做说明,待后续文章《Mybatis系列之一对多关系》时再做具体讲解。

缓存

Mybatis包含了一个很强大的缓存特性,可以非常方便地配置和使用。默认情况下,缓存功能是没有开启的。要想使用缓存只需要sql映射文件中加入cache元素即可。
 
<cache />

这个简单语句效果如下:
  • 映射文件中所有的select语句都将会被缓存
  • 映射文件中所有的insert / update / delete语句会刷新缓存
  • 缓存默认使用LRU最近最少使用算法来回收
  • 根据时间表,缓存不会以作何时间顺序来刷新
  • 缓存最多会存储列表集合或是对象的1024个引用
  • 缓存被视为可读、写缓存,这意味着对象检索不是共享的,且可以安全地被调用者修改,而不干拢其他调用过或线程所做的潜在修改。
所有这些属性,都可以通过cache元素的属性进行修改配置。如
<cache
  eviction="FIFO"
  flushInterval="60000"
  size="512"
  readOnly="true"/>
这个算法将缓存的回收策略改为了先进先出,并且每隔60秒刷新一次,最大缓存对象引用数量为512,且返回的对象是只读的,因此在不同线程中的调用者修改它们会导致冲突。

Mybatis中回收策略有以下几种:
  • LRU - 最近最少使用的:移除最长时间不被使用的对象
  • FIFO - 先进先出:按对象进入缓存的时间顺序来移除
  • SOFT - 软引用:移除基于垃圾回收器状态和软引用规则的对象
  • WEAK - 弱引用:更积极地移除基于垃圾回收器状态和弱引用规则的对象
flushInterval,刷新间隔,可以被设置为任意的正整数,代表每隔多少毫秒进行一次刷新动作。默认情奖品是不设置,也就是没有刷新间隔,缓存仅仅在有sql语句被调用时刷新。
size,最大引用数量,可以被设置为任意的正整数。默认是1024
readOnly,只读属性,可以被设为true 或 false。只读的缓存会给所有调用者返回缓存对象的相同实例,因此这些对象不能被修改。这提供了很重要的性能优势。可读写缓存则返回对象的拷贝,这样在性能上会有一些损失,但是安全。Mybatis默认是false。

名称空间

每个sql映射文件的要元素中,都需要指定一个名称空间,用以确保每个映射语句的id属性不会重复。如

 

<mapper namespace="com.emerson.learning.mapping.user">

 

在Java代码中引用某个sql映射时,使用的亦时含有名称空间的全路径。如

 

 

session.update("com.emerson.learning.mapping.user.udpateUser", user);

 

代码示例

 

 

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" 
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">

<mapper namespace="com.emerson.learning.mapping.user">

	<sql id="columns">user_name, user_password, nick_name, email, user_type_id,
		is_valid, created_time</sql>

	<!-- 根据传入的Id值,到数据库中查询记录 -->
	<select id="getByID" parameterType="int" resultType="User">
		SELECT
		<include refid="columns"></include>
		FROM sys_user WHERE user_id = #{id}
	</select>

	<!-- 按用户名进行模糊查询 -->
	<select id="queryByName" parameterType="User" resultType="User">
		SELECT
		<include refid="columns"></include>
		FROM sys_user
		<where>
			<if test="userName != null">user_name like '%' #{userName} '%'</if>
		</where>
	</select>

	<!-- 创建新用户,并写入到数据表中 -->
	<!-- 写入新记录并返回主键值,注意,这里的KeyProperty应该是Java类里的属性名称,而非数据表中的字段名 -->
	<insert id="insertUser" parameterType="User" useGeneratedKeys="true"
		keyProperty="userId">
		INSERT INTO sys_user(<include refid="columns"></include>)
		VALUES(#{userName},
		#{userPassword}, #{nickName}, #{userTypeId}, #{isValid},
		#{createdTime})
	</insert>

	<!-- 更新用户信息,并写回到数据表中 -->
	<update id="udpateUser" parameterType="User">
		UPDATE sys_user
		<set>
			<if test="userName != null">user_name = #{userName},</if>
			<if test="userPassword != null">user_password = #{userPassword},</if>
			<if test="nickName != null">nick_name = #{nickName},</if>
			<if test="userTypeId != null">user_type_id = #{userTypeId},</if>
			<if test="isValid != null">is_valid = #{isValid}</if>
		</set>
		WHERE user_id = #{userId}
	</update>

	<!-- 根据传入的Id值,删除单条记录 -->
	<delete id="deleteById" parameterType="int">
		DELETE FROM sys_user WHERE
		user_id = #{id}
	</delete>

	<!-- 根据传入的Id值列表,删除多条记录 -->
	<delete id="deleteBatch" parameterType="java.util.List">
		DELETE FROM sys_user WHERE user_id in
		<foreach collection="list" item="item" index="index" open="("
			close=")" separator=",">
			#{item}
		</foreach>
	</delete>
</mapper>

 

 

结束语

 

至此,我们把Mybatis中sql映射文件的元素都已向大家介绍了一遍(除了ResultMap,这个留在后续的文章中详细讲解)。在下一篇文章《Mybatis系列(五)动态SQL》中,我们继续为大家讲解用于定义动态SQL的映射标签,静请期待!

 

分享到:
评论

相关推荐

    Mybatis系列学习源码

    本资源是"Mybatis系列学习源码",适合初学者和有一定经验的开发者深入理解Mybatis的工作原理和实践应用。下面将详细探讨Mybatis的核心概念和关键功能。 1. **SqlSession与Executor** - **SqlSession**:它是...

    MyBatis:SQL映射框架的深度探索.pdf

    - **SQL映射文件**:这是MyBatis的核心配置文件之一,它定义了SQL语句与Java方法之间的映射关系。通过XML文件或注解的方式,开发者可以明确指定如何将Java对象的属性映射到数据库表的列上,以及如何执行各种数据库...

    MyBatis逆向工程所需文件

    MyBatis逆向工程是一种自动化工具,用于快速生成MyBatis的Mapper接口、XML映射文件以及对应的实体类,极大地简化了开发过程。这个压缩包文件包含了一系列与MyBatis逆向工程相关的必要文件,帮助开发者高效地进行...

    Mybatis系列教程Mybatis插件共8页.pdf.z

    【标签】"Mybatis系列教程Mybat" 暗示了教程的主题,虽然标签不完整,但可以推断与Mybatis框架相关,可能包括Mybatis的基础知识,以及可能涉及到的其他相关主题,如Mybatis的XML配置、动态SQL、结果映射等。...

    mybatis文件

    每个映射文件包含一系列`&lt;mapper&gt;`标签,每个`&lt;mapper&gt;`标签对应一个Java接口,其中的`namespace`属性通常与接口全限定名相同。 4. **映射元素(Mapping Elements)**:在映射文件中,`&lt;select&gt;`、`&lt;insert&gt;`、`...

    Mybatis系列教程Mybatis架构原理共4页.pdf

    【标题】:Mybatis系列教程Mybatis架构原理共4页.pdf 【描述】:这个压缩文件包含了一份关于Mybatis架构原理的系列教程,总计四页的内容。Mybatis是一款优秀的持久层框架,它支持定制化SQL、存储过程以及高级映射。...

    mybatis-3-mapper.dtd文件下载

    在 Mybatis 中,`mybatis-3-mapper.dtd` 文件扮演着至关重要的角色,它是 Mybatis 映射器接口的定义文件,用于验证 XML 映射文件的语法正确性。 `mybatis-3-mapper.dtd` 文件是基于 DTD(Document Type Definition...

    Mybatis系列教程Mybatis源码剖析共15页.pd

    【标题】"Mybatis系列教程Mybatis源码剖析共15页.pdf" 是一份详细的Mybatis框架源码解析教程,涵盖了Mybatis的核心概念和技术细节。这份教程深入浅出地介绍了Mybatis如何工作,以及其背后的代码实现,对于理解...

    Java的MyBatis框架中Mapper映射配置的使用及原理解析

    Mapper的内置方法是MyBatis提供的一系列方便的CRUD(创建、读取、更新、删除)操作,它们直接映射到SQL语句上: 1. `countByExample`:这个方法用于根据指定的条件查询记录的数量。例如,`UserMapper`中的`...

    深入浅出mybatis系列

    MyBatis是一个轻量级的ORM(对象关系映射)框架,它允许开发者将SQL语句直接写在XML映射文件中,提供了灵活的数据访问控制。 首先,我们注意到“springmvc + mybatis”的组合在近年来非常流行。SpringMVC作为Spring...

    Mybatis系列教程Mybatis注解开发共9页.pdf

    9. **动态SQL**: Mybatis的动态SQL功能允许在XML映射文件或注解中使用条件语句,根据传入的参数动态构造SQL,提高代码的可读性和灵活性。 这个9页的教程很可能会涵盖这些基础和进阶的Mybatis注解用法,帮助读者理解...

    mybatis系列一:开发环境搭建

    在本篇中,我们将深入探讨"Mybatis系列一:开发环境搭建"的相关知识,这将包括如何设置一个基于Maven的Mybatis开发环境,以及如何理解并使用Mybatis的核心概念。首先,我们需要明白Mybatis是一个优秀的持久层框架,...

    Mybatis系列课程-Association

    "Mybatis系列课程-Association"显然是一个专门针对Mybatis中“关联”这一概念的教程。在本课程中,我们将深入探讨Mybatis如何处理实体类之间的关联关系,以及如何通过XML或注解配置来实现这种关联。 首先,我们需要...

    Mybatis系列教程Mybatis基本应用共9页.pdf

    - **动态SQL**:Mybatis允许在XML映射文件中编写动态SQL,可以根据条件改变SQL结构,提高了灵活性。 - **参数映射**:通过`@Param`注解或命名参数机制,将方法参数与SQL参数关联。 - **结果映射**:通过`@...

    mybatis-3-config.dtd mybatis-3-mapper.dtd

    通过`&lt;mapper&gt;`元素在全局配置文件中引用映射文件,MyBatis可以在运行时加载并解析这些映射文件,从而执行相应的SQL操作。 `8fdbba6b804e4dc2a8c301f21e0a5ee9`这个文件名可能是某个具体的MyBatis配置或映射文件的...

    mybatis源码级课件DTD文件jar包xml文件最全最新

    这个资源集合包含的是一系列关于MyBatis源码分析的课件,以及相关的DTD文件、jar包和XML配置文件,这些都是深入理解MyBatis工作原理的重要资料。 首先,`mybatis-source.mdl`可能是一个模型文件,用于描述MyBatis...

    Mybatis notes系列博客配套资源

    - XML 配置文件:定义数据源、事务管理器、映射文件等,是 Mybatis 的全局配置。 - 映射文件(Mapper XML):包含 SQL 语句和结果映射,可以使用参数占位符和动态 SQL。 - 注解配置:在 Java 类上直接使用注解...

    完整版 Java开发实训课程系列-MyBatis框架技术 03.MyBatis关联映射查询与缓存配置(共25页).pptx

    配置二级缓存需要在全局配置文件中开启,并在Mapper的XML映射文件中启用对应的缓存配置。 在实践中,开发者需要根据业务需求选择合适的关联映射方式,并合理利用缓存机制来优化性能。此外,通过自定义ResultMap,...

    MyBatis系列操作资源

    动态SQL允许在XML映射文件或注解中编写条件语句,提高了SQL的灵活性。缓存机制可以提高数据读取的效率,分为一级缓存和二级缓存,分别在SqlSession和Mapper级别生效。而事务管理则可以通过MyBatis的...

    MyBatis-3.4.6.zip

    3. 动态SQL:MyBatis允许在映射文件中直接写SQL,这使得动态SQL的编写变得极为方便,可以根据条件灵活拼接SQL语句。 4. 强大的映射机制:MyBatis可以将结果集直接映射到Java对象,同时也支持自定义映射,使数据对象...

Global site tag (gtag.js) - Google Analytics