MyBatis除了可以用注解来映射sql语句,还可以通过XML配置,相比个人觉得XML映射文件的方式比注解的方式更强大。
在其api文件中的描述为:MyBatis的真正强大在于它的映射语句,也是它的魔力所在。由于它的异常强大,映射器的XML文件就显得相对简单。如果拿它跟具有相同功能的JDBC代码进行对比,你会发现省掉了将近95%的代码。MyBatis就是针对SQL构建的,并且比普通的方法做的更好。
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
SQL映射文件有几个顶级元素:
cache——给定命名空间的缓存配置
cache-ref——其他命名空间缓存配置的引用
resultMap——从数据库结果集中加载的对象
parameterMap——已废弃,老式风格的参数映射
sql——可以被其他语句引用的可重用sql语句块
insert——插入语句
update——更新语句
delete——删除语句
select——查询语句
1.select
<select id="selectPerson" parameterType="int" resultType="hashmap">相当于JDBC中的
SELECT * FROM PERSON WHERE ID = #{id}
</select>
String selectPerson = "SELECT * FROM PERSON WHERE ID=?";#{id}就相当于?
PreparedStatement ps = conn.prepareStatement(selectPerson);
ps.setInt(1,id);
*#{id}和${id}的区别:
1)#将传入的数据当成一个字符串,会对自动传入的数据加一个双引号;$将传入的数据直接显示在sql语句中,例如order by ${id}->order by 9
2)#方式能够很大程度上防止sql注入,而$无法防止sql注入
3)$一般用于传入数据库对象,例如传入表名,一般能用#就别用$。order by动态参数时用$不用#.
select中的元素有很多属性,如下。
<select
id="selectPerson"
parameterType="int"
parameterMap="deprecated"
resultType="hashmap"
resultMap="personResultMap"
flushCache="false"
useCache="true"
timeout="10000"
fetchSize="256"
statementType="PREPARED"
resultSetType="FORWARD_ONLY">
属性 | 描述 |
---|---|
id | 在命名空间中唯一的标识符,可以被用来引用这条语句。 |
parameterType | 将会传入这条语句的参数类的完全限定名或别名。 |
resultType | 从这条语句中返回的期望类型的类的完全限定名或别名。注意集 合情形,那应该是集合可以包含的类型,而不能是集合本身。使 用 resultType 或 resultMap,但不能同时使用。 |
resultMap | 命名引用外部的 resultMap。 返回 map 是 MyBatis 最具力量的特性, 对其有一个很好的理解的话, 许多复杂映射的情形就能被解决了。 使用 resultMap 或 resultType,但不能同时使用。 |
flushCache | 将其设置为 true,不论语句什么时候被带哦用,都会导致缓存被 清空。默认值:false。 |
useCache | 将其设置为 true, 将会导致本条语句的结果被缓存。 默认值: true。 |
timeout | 这个设置驱动程序等待数据库返回请求结果,并抛出异常时间的 最大等待值。默认不设置(驱动自行处理) |
fetchSize | 这是暗示驱动程序每次批量返回的结果行数。默认不设置(驱动 自行处理)。 |
statementType | STA TEMENT,PREPARED 或 CALLABLE 的一种。 这会让 MyBatis 使用选择使用 Statement,PreparedStatement 或 CallableStatement。 默认值:PREPARED。 |
resultSetType | FORWARD_ONLY|SCROLL_SENSITIVE|SCROLL_INSENSITIVE 中的一种。默认是不设置(驱动自行处理)。 |
databaseId | In case there is a configured databaseIdProvider, MyBatis will load all statements with nodatabaseId attribute or with a databaseId that matches the current one. If case the same statement if found with and without thedatabaseId the latter will be discarded. |
resultOrdered | This is only applicable for nested result select statements: If this is true, it is assumed that nested results are contained or grouped together such that when a new main result row is returned, no references to a previous result row will occur anymore. This allows nested results to be filled much more memory friendly. Default: false. |
2.insert,update,delete
属性 | 描述 |
---|---|
id | 在命名空间中唯一的标识符,可以被用来引用这条语句。 |
parameterType | 将会传入这条语句的参数类的完全限定名或别名。 |
flushCache | 将其设置为 true,不论语句什么时候被带哦用,都会导致缓存被清 空。默认值:false。 |
timeout | 这个设置驱动程序等待数据库返回请求结果, 并抛出异常时间的最 大等待值。默认不设置(驱动自行处理)。 |
statementType | STA TEMENT,PREPARED 或 CALLABLE 的一种。这会让 MyBatis 使用选择使用 Statement,PreparedStatement 或 CallableStatement。 默认值:PREPARED。 |
useGeneratedKeys | ( 仅 对 insert 有 用 ) 这 会 告 诉 MyBatis 使 用 JDBC 的 getGeneratedKeys 方法来取出由数据(比如:像 MySQL 和 SQL Server 这样的数据库管理系统的自动递增字段)内部生成的主键。 默认值:false。 |
keyProperty | (仅对 insert 有用) 标记一个属性, MyBatis 会通过 getGeneratedKeys 或者通过 insert 语句的 selectKey 子元素设置它的值。 默认: 不设置。 |
keyColumn | (仅对 insert 有用) 标记一个属性, MyBatis 会通过 getGeneratedKeys 或者通过 insert 语句的 selectKey 子元素设置它的值。 默认: 不设置。 |
databaseId | In case there is a configured databaseIdProvider, MyBatis will load all statements with nodatabaseId attribute or with a databaseId that matches the current one. If case the same statement if found with and without thedatabaseId the latter will be discarded. |
<insert id="insertAuthor" parameterType="domain.blog.Author" useGeneratedKeys="true"3.sql
keyProperty="id">
insert into Author (username,password,email,bio)
values (#{username},#{password},#{email},#{bio})
</insert>
这个元素可以被用来定义可重用的 SQL 代码段,可以包含在其他语句中。比如:
<sql id="userColumns"> id,username,password </sql>
这个 SQL 片段可以被包含在其他语句中,例如:
<select id="selectUsers" parameterType="int" resultType="hashmap">
select <include refid="userColumns"/>
from some_table
where id = #{id}
</select>
本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。