Mybatis系列(四)映射文件
转自:https://blog.csdn.net/chris_mao/article/details/48811507
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 - 其他命名空间缓存配置引用
查询语句映射
查询语句,是sql中使用频率最高的语句,Mybatis中的查询语句映射也是很简单的。如:
- <select id="getById" parameterType="int" resultType="User">
- SELECT <span style="font-family: Arial, Helvetica, sans-serif;">user_name, user_password, nick_name, email, user_type_id, </span><span style="font-family: Arial, Helvetica, sans-serif;">is_valid, created_time</span>
- 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语句的作用细节。
id="getById"
parameterType="int"
parameterMap="deprecated"
resultType="User"
resultMap="userResultMap"
flushCache="false"
useCache="true"
timeout="10000"
fetchSize="256"
statementType="PREPARED"
resultSetType="FORWARD_ONLY">
| 描述 | |
|---|---|
| id | 将会传入这条语句的参数类的完全限定名或别名。这个属性是可选的,因为 MyBatis 可以通过 TypeHandler 推断出具体传入语句的参数,默认值为 unset。 |
| 从这条语句中返回的期望类型的类的完全限定名或别名。注意如果是集合情形,那应该是集合可以包含的类型,而不能是集合本身。使用 resultType 或 resultMap,但不能同时使用。 | |
| resultMap | 将其设置为 true,任何时候只要语句被调用,都会导致本地缓存和二级缓存都会被清空,默认值:false。 |
| useCache | 这个设置是在抛出异常之前,驱动程序等待数据库返回请求结果的秒数。默认值为 unset(依赖驱动)。 |
| fetchSize | STATEMENT,PREPARED 或 CALLABLE 的一个。这会让 MyBatis 分别使用 Statement,PreparedStatement 或 CallableStatement,默认值:PREPARED。 |
| resultSetType | 如果配置了 databaseIdProvider,MyBatis 会加载所有的不带 databaseId 或匹配当前 databaseId 的语句;如果带或者不带的语句都有,则不带的会被忽略。 |
| resultOrdered | false。 |
| 这个设置仅对多结果集的情况适用,它将列出语句执行后返回的结果集并每个结果集给一个名称,名称是逗号分隔的。 |
在映射文件中定义好查询语句之后,就可以在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>
属性
| 描述 | |
|---|---|
| keyProperty | 匹配属性的返回结果集中的列名称。如果希望得到多个生成的列,也可以是逗号分隔的属性名称列表。 |
| resultType | 这 可以被设置为 BEFORE 或 AFTER。如果设置为 BEFORE,那么它会首先选择主键,设置 keyProperty 然后执行插入语句。如果设置为 AFTER,那么先执行插入语句,然后是 selectKey 元素 - 这和像 Oracle 的数据库相似,在插入语句内部可能有嵌入索引调用。 |
| statementType |
|
Mybatis系列(四)映射文件的更多相关文章
- Mybatis系列全解(五):全网最全!详解Mybatis的Mapper映射文件
封面:洛小汐 作者:潘潘 若不是生活所迫,谁愿意背负一身才华. 前言 上节我们介绍了 < Mybatis系列全解(四):全网最全!Mybatis配置文件 XML 全貌详解 >,内容很详细( ...
- MyBatis系列四 之 智能标签进行查询语句的拼接
MyBatis系列四 之 智能标签进行查询语句的拼接 使用Foreach进行多条件查询 1.1 foreach使用数组进行多条件查询 在MyBatis的映射文件中进行如下配置 <!--根据数组进 ...
- Mybatis 系列2-配置文件
[Mybatis 系列10-结合源码解析mybatis 执行流程] [Mybatis 系列9-强大的动态sql 语句] [Mybatis 系列8-结合源码解析select.resultMap的用法] ...
- Mybatis(二) SQL映射文件
SQL映射文件 单条件查询 1. 在UserMapper接口添加抽象方法 //根据用户名模糊查询 List<User> getUserListByName(); 2. 在UserMappe ...
- Mybatis的XML映射文件(四)
MyBatis 的真正强大在于它的映射语句,也是它的魔力所在.由于它的异常强大,映射器的 XML 文件就显得相对简单.如果拿它跟具有相同功能的 JDBC 代码进行对比,你会立即发现省掉了将近 95% ...
- mybatis Mapper XML 映射文件
传送门:mybatis官方文档 Mapper XML 文件详解 一. 数据查询语句 1. select <select id="selectPerson" parameter ...
- Mybatis框架基于映射文件和配置文件的方式,实现增删改查,可以打印日志信息
首先在lib下导入: 与打印日志信息有关的架包 log4j-1.2.16.jar mybatis架包:mybatis-3.1.1.jar 连接数据库的架包:mysql-connector-java-5 ...
- 初始MyBatis、SQL映射文件
MyBatis入门 1.MyBatis前身是iBatis,是Apache的一个开源项目,2010年这个项目迁移到了Google Code,改名为MyBatis,2013年迁移到GitHub.是一个基于 ...
- MyBatis 的 XML 映射文件使用说明
简介 文档参考地址:http://www.mybatis.org/mybatis-3/zh/index.html MyBatis 的真正强大在于它的映射语句,也是它的魔力所在.由于它的异常强大,映射器 ...
- mybatis教程3(映射文件)
MyBatis 的真正强大在于它的映射语句,也是它的魔力所在.由于它的异常强大,映射器的 XML 文件就显得相对简单.如果拿它跟具有相同功能的 JDBC 代码进行对比,你会立即发现省掉了将近 95% ...
随机推荐
- canvas压缩图片成base64,传到后台解码需要注意的问题
去除压缩完后的头部标志,data:imge一直到,位置,然后看看有没有空格,有的就替换成+号,传送的时候+号被http协议去掉了
- git合并分支与解决冲突
前提: 当前开发的分支为feature/20161129_317606_algoplatform_1,由于feature/20161130_322574_tmstools_1分支有新内容,所以准备将f ...
- will-change 提高页面滚动、动画等渲染性能
一.先来看一个例子 视差滚动现在不是挺流行的嘛,然后Chris Ruppel当其使用background-attachment: fixed实现背景图片不随滚动条滚动而滚动效果的时候,发现,页面的绘制 ...
- Kali Linux:使用nmap扫描主机
nmap-Network Mapper,是著名的网络扫描和嗅探工具包.他同样支持Windows和OS X. 扫描开放端口和判断操作系统类型 先让我们ping一段地址范围,找到启动的主机: # nmap ...
- 解放内存之搭建自己的 R Server
学校的课五门有四门需要跑R程序,有一些长长长的代码实在是占用了太多的内存,果断决定搭个R的服务器放着自己跑. 愉快的是,R studio server 的搭建真心简单快捷~这个从前被我忽略的东东终于排 ...
- Linux 监视文件、文件夹改动
/******************************************************************** * Linux 监视文件.文件夹改动 * 说明: * 主要是 ...
- (一)canvas简介
<canvas>元素主要用来图形的绘制,通过脚本来完成(通常时js来实现): 可以利用其实现图表,游戏等项目的开发. getContext 获取画布的摸板是2d还是3d strokeRec ...
- 关于list.extend(iterable)
extend内的参数只要是iterable就可以,那么也可以添加定制的iterable,开整. class A(object): def __init__(self): self.a = 0 def ...
- bzoj 1925 地精部落
Written with StackEdit. Description 传说很久以前,大地上居住着一种神秘的生物:地精. 地精喜欢住在连绵不绝的山脉中.具体地说,一座长度为 \(N\) 的山脉 \(H ...
- 微软原版WINDOWS10-LTSB-X64位操作系统的全新安装与优化
原版WINDOWS10_LTSB_X64位操作系统,安装U盘的制作 1.在一台能正常运行的电脑上,下载原版WINDOWS10_LTSB_X64位操作系统镜像(ISO)文件: 2.运行UltraISO. ...