1200字范文,内容丰富有趣,写作的好帮手!
1200字范文 > MyBatis 入门到精通(二) SQL语句映射XML文件

MyBatis 入门到精通(二) SQL语句映射XML文件

时间:2019-09-01 16:42:31

相关推荐

MyBatis 入门到精通(二) SQL语句映射XML文件

MyBatis 真正强大之处就在这些映射语句,也就是它的魔力所在。对于它的强大功能,SQL 映射文件的配置却非常简单。

如果您比较SQL 映射文件配置与JDBC 代码,您很快可以发现,使用SQL 映射文件配置可以节省95%的代码量。MyBatis 被创建来专注于SQL,但又给您自己的实现极大的空间。

需要配置的基本元素

1. cache – 配置给定模式的缓存

2. cache-ref – 从别的模式中引用一个缓存

3. resultMap – 这是最复杂而却强大的一个元素了,它描述如何从结果集中加载对象

4. sql – 一个可以被其他语句复用的SQL 块

5. insert – 映射INSERT 语句

6. update – 映射UPDATE 语句

7. delete – 映射DELEETE 语句

8. select - 映射SELECT语句

配置注意

SQL 映射XML 文件只有一些基本的元素需要配置,并且要按照下面的顺序来定义 写好SQL语句映射文件后,需要在MyBAtis主配置文件mappers标签中引用! 例如:[html]view plaincopy <!--mappers是告诉MyBatis去哪寻找映射SQL的语句。可以使用类路径中的资源引用,或者使用字符,输入确切的URL引用。--><mappers><mapperresource="com/accp/mybatis/data/BlogMapper.xml"/></mappers>

当Java接口与XML文件在一个相对路径下时,可以不在myBatis配置文件的mappers中声明。

SQL

这个元素可以被用来定义可重用的SQL代码段,可以包含在其他语句中。

例子请看下面select中例子

SELECT

mybatis select是mybatis 中最常用的元素之一。 对简单的查询,select 元素的配置是相当简单的:[html]view plaincopy <?xmlversion="1.0"encoding="UTF-8"?><!DOCTYPEmapperPUBLIC"-////DTDMapper3.0//EN""/dtd/mybatis-3-mapper.dtd"><mappernamespace="com.accp.mybatis.model.Blog"><!--可重用的SQL代码段--><sqlid="blog_column">id,title,author_idasauthorId</sql><selectid="selectBlog_as_map"parameterType="int"resultType="hashmap">select<includerefid="blog_column"/>fromBlogwhereid=#{id}</select></mapper>

这个语句被称作selectBlog_as_map,使用一个int (或Integer)类型的参数,并返回一个HashMap类型的对象

#{id}告诉mybatis创建了一个PreparedStatement(预处理语句)参数。

在JDBC中,类似的代码如下:

[java]view plaincopy StringselectBlog_as_map=“select*fromBlogwhereid=?”;PreparedStatementps=conn.prepareStatement(selectBlog_as_map);ps.setInt(1,id); 测试代码:[java]view plaincopy publicstaticvoidselectBlogAsMap(intid){SqlSessionsession=sqlMapper.openSession();Map<String,Object>map=session.selectOne("selectBlog_as_map",id);System.out.println(map);session.close();}

INSERT

简单的insert语句:[html]view plaincopy <?xmlversion="1.0"encoding="UTF-8"?><!DOCTYPEmapperPUBLIC"-////DTDMapper3.0//EN""/dtd/mybatis-3-mapper.dtd"><mappernamespace="com.accp.mybatis.model.Blog"><insertid="insertBlog"parameterType="Blog">insertintoBlog(id,title,author_id)values(#{id},#{title},#{authorId})</insert></mapper>

对于insert如果你的数据库支持自动生成主键的字段(比如 MySQL 和 SQL Server),那么你可以设置 useGeneratedKeys=”true”,然后把keyProperty 设成对应的列,就搞定了。

例如Blog表已经对 id 使用了自动生成的列类型,那么语句如下:

[html]view plaincopy <?xmlversion="1.0"encoding="UTF-8"?><!DOCTYPEmapperPUBLIC"-////DTDMapper3.0//EN""/dtd/mybatis-3-mapper.dtd"><mappernamespace="com.accp.mybatis.model.Blog"><insertid="insertBlog"parameterType="Blog"useGeneratedKeys=”true”keyProperty=”id”>insertintoBlog(title,author_id)values(#{title},#{authorId})</insert></mapper>

还可以使用selectKey元素。下面例子,使用mysql数据库nextval('student')为自定义函数,用来生成一个key。

例如:

[html]view plaincopy <?xmlversion="1.0"encoding="UTF-8"?><!DOCTYPEmapperPUBLIC"-////DTDMapper3.0//EN""/dtd/mybatis-3-mapper.dtd"><mappernamespace="com.accp.mybatis.model.Blog"><insertid="insertBlog"parameterType="Blog"><selectKeykeyProperty="studentID"resultType="String"order="BEFORE">selectnextval('id')</selectKey>insertintoBlog(id,title,author_id)values(#{id},#{title},#{authorId})</insert></mapper>

insert语句属性配置细节:

selectKey语句属性配置细节:

UPDATE,DELETE

update 简单例子:[html]view plaincopy <?xmlversion="1.0"encoding="UTF-8"?><!DOCTYPEmapperPUBLIC"-////DTDMapper3.0//EN""/dtd/mybatis-3-mapper.dtd"><mappernamespace="com.accp.mybatis.model.Blog"><updateid="updateBlog"parameterType="Blog">UPDATEBlogSETtitle=#{title},author_id=#{author.id},WHEREid=#{id};</update></mapper>

delete 简单例子:[html]view plaincopy <deleteid="deleteBlog"parameterType="Blog">DELETEFROMBLOGWHEREID=#{id}</delete>

update、delete语句属性配置细节:

Parameters

这个元素说的直白点就是定义参数。注意一个语句中只能有一个参数。 所以参数类型在以后的使用中,可能需要复杂的类型,比如hashmap,一个复杂的对象等。例如:[html]view plaincopy <?xmlversion="1.0"encoding="UTF-8"?><!DOCTYPEmapperPUBLIC"-////DTDMapper3.0//EN""/dtd/mybatis-3-mapper.dtd"><mappernamespace="com.accp.mybatis.model.Blog"><insertid="insertBlog"parameterType="Blog">insertintoBlog(id,title,author_id)values(#{id},#{title},#{author.id})</insert></mapper>

如果blog类型的参数对象传递到了语句中,id、title和author属性将会被查找,然后它们的值就被传递到预处理语句的参数中。 这点对于传递参数到语句中非常好。但是对于参数映射也有一些其他的特性。

首先,像MyBatis的其他部分,参数可以指定一个确定的数据类型。[html]view plaincopy #{property,javaType=int,jdbcType=NUMERIC} 像MyBatis的剩余部分,javaType通常可以从参数对象中来确定,除非对象是一个HashMap。那么javaType应该被确定来保证使用正确类型处理器。

注意:如果null被当作值来传递,对于所有可能为空的列,JDBC Type是需要的。也可以通过阅读PreparedStatement. setNull()方法的JavaDocs文档来研究它。

为了以后自定义类型处理器,你可以指定一个确定的类型处理器类(或别名),比如:[html]view plaincopy #{age,javaType=int,jdbcType=NUMERIC,typeHandler=MyTypeHandler} 尽管它看起来繁琐,但是实际上是你很少设置它们其中之一。

对于数值类型,对于决定有多少数字是相关的,有一个数值范围。[html]view plaincopy #{height,javaType=double,jdbcType=NUMERIC,numericScale=2} mode属性允许你指定IN,OUT或INOUT参数。如果参数为OUT或INOUT,参数对象属性的真实值将会被改变,就像你期望你需要你个输出参数。如果mode为OUT(或INOUT),而且jdbcType为CURSOR(也就是Oracle的REFCURSOR),你必须指定一个resultMap来映射结果集到参数类型。要注意这里的javaType属性是可选的,如果左边的空白是jdbcType的CURSOR类型,它会自动地被设置为结果集。[html]view plaincopy #{department,mode=OUT,jdbcType=CURSOR,javaType=ResultSet,resultMap=departmentResultMap} 字符串替换

默认情况下,使用#{}格式的语法会导致MyBatis创建预处理语句属性并以它为背景设置安全的值(比如?)。这样做很安全,很迅速,也是首选的做法,有时你只是想直接在SQL语句中插入一个不改变的字符串。比如,像ORDER BY,你可以这样来使用:

ORDER BY ${columnName}

这里MyBatis不会修改或转义字符串。

重要:接受从用户输出的内容并提供给语句中不变的字符串,这样做是不安全的。这会导致潜在的SQL注入攻击,因此你不应该允许用户输入这些字段,或者通常自行转义并检查。

resultMap

resultMap 元素是MyBatis中最重要最强大的元素。它就是让你远离90%的需要从结果集中取出数据的JDBC代码的那东西,而且在一些情形下允许你做一些JDBC不支持的事情。事实上,编写相似于对复杂语句联合映射这些等同的代码,也许可以跨过上千行的代码。ResultMap的设计就是简单语句不需要明确的结果映射,而很多复杂语句确实需要描述它们的关系。[java]view plaincopy packagecom.accp.mybatis.model;publicclassBlog{privateIntegerid;privateStringtitle;privateIntegerauthorId;//省略get和set方法}

基于JavaBean的规范,上面这个类有3个属性:id,title和authorId。这些在select语句中会精确匹配到列名。

这样的一个JavaBean可以被映射到结果集,就像映射到HashMap一样简单。[html]view plaincopy <?xmlversion="1.0"encoding="UTF-8"?><!DOCTYPEmapperPUBLIC"-////DTDMapper3.0//EN""/dtd/mybatis-3-mapper.dtd"><mappernamespace="com.accp.mybatis.model.Blog"><selectid="selectBlog_by_id"parameterType="int"resultType="Blog">select*fromBlogwhereid=#{id}</select></mapper>

这些情况下,MyBatis会在幕后自动创建一个ResultMap,基于属性名来映射列到JavaBean的属性上。如果列名没有精确匹配,你可以在列名上使用select字句的别名(一个标准的SQL特性)来匹配标签。

ResultMap最优秀的地方你已经了解了很多了,但是你还没有真正的看到一个。只是出于示例的原因,让我们来看看最后一个示例中外部的resultMap是什么样子的,这也是解决列名不匹配的另外一种方式。[html]view plaincopy <resultMapid="Blog_result"type="Blog"><idcolumn="id"property="id"/><resultcolumn="title"property="title"/><resultcolumn="author_id"property="authorId"/></resultMap>

引用它的语句使用resultMap属性就行了(注意我们去掉了resultType属性)。比如:[html]view plaincopy <?xmlversion="1.0"encoding="UTF-8"?><!DOCTYPEmapperPUBLIC"-////DTDMapper3.0//EN""/dtd/mybatis-3-mapper.dtd"><mappernamespace="com.accp.mybatis.model.Blog"><resultMapid="Blog_result"type="Blog"><idcolumn="id"property="id"/><resultcolumn="title"property="title"/><resultcolumn="author_id"property="authorId"/></resultMap><!--resultType与resultMap不能同时使用--><selectid="selectBlog_by_id"parameterType="int"resultMap="Blog_result">select*fromBlogwhereid=#{id}</select></mapper>

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。