MyBatis数据映射及增删改查
SQL映射文件结构
1. cache:
1.1. 给定命名空间的缓存配置;
2. cache-ref:
2.2. 其他命名空间缓存配置的引用;
3. resultMap:
3.3. 是最复杂也是最强大的元素,用来描述如何从数据库结果集中来加载对象;
4. sql:
4.4. 可被其他语句引用的可重用语句块;
5. nsert,update,delete,select:
5.5. 映射对应功能的SQL语句;
select
1. 查询语句是MyBatis中最常用的元素之一,多数应用查询比修改要频繁。简单查询的 select 元素非常简单,如:
foreach简单介绍
•foreach简单介绍:
•foreach的主要用在构建in条件中,它可以在SQL语句中进行迭代一个集合。
•foreach元素的属性主要有item,index,collection,open,separator,close。
•item表示集合中每一个元素进行迭代时的别名,
•index指定一个名字,用于表示在迭代过程中,每次迭代到的位置,
•open表示该语句以什么开始,
•separator表示在每次进行迭代之间以什么符号作为分隔符,
•close表示以什么结束,
•collection属性是在使用foreach的时候最关键的也是最容易出错的,该属性是必须指定的,但是在不同情况下,该属性的值是不一样的,主要有一下3种情况:
•如果传入的是单参数且参数类型是一个List的时候,collection属性值为list。
•如果传入的是单参数且参数类型是一个Array数组的时候,collection的属性值为array 。
•如果传入的参数是多个的时候,我们就需要把它们封装成一个Map了,当然单参数也可以封装成map,实际上如果你在传入参数的时候,在MyBatis里面也是会把它封装成一个Map的,map的key就是参数名,所以这个时候collection属性值就是传入的List或Array对象在自己封装的map里面的key。
下面给出一个实例供大家参考。
select 所包含元素及属性。
属性 |
含义 |
id |
在命名空间中唯一的标识符,可以被用来引用这条语句 |
parameterType |
将会传入这条语句的参数类的完全限定名或别名。这个属性是可选的,因为MyBatis可以通过 TypeHandler 推断出具体传入语句的参数,默认值为unset |
resultType |
查询语句中返回的期望类型的类的完全限定名或别名。注意如果是集合情形,那应该是集合可以包含的类型,而不能是集合本身。resultType或resultMap不能同时使用 |
resultMap |
外部resultMap的命名引用。结果集的映射是MyBatis最强大的特性,对其有一个很好的理解的话,许多复杂映射的情形都能迎刃而解 |
resultMap:适合使用返回值是自定义实体类的情况
resultType:适合使用返回值得数据类型是非自定义的,即jdk的提供的类型
resultMap元素解析
1. resultMap元素是MyBatis映射中最重要最强大的元素。它在一些情形下允许完成一些JDBC不支持的功能;
2. 之前的示例中已经看到了,如果不提供resultMap,则语句执行结果可以自动被转换为基本数据类型、Map和对应的实体类对象(约定的映射依据是结果集中的列名映射为实体类中的属性名);
3. ResultMap的设计目标就是为复杂语句通过配置文件描述数据库表结果和Java实体类的关系(OR映射);
一个简单的resultMap声明如下:
#{}与${} 的区别
1. 在之前的默认情况下,使用#{}格式的语法会通知MyBatis创建预处理语句属性并安全地设置值(比如通过?占位符)。这样做更安全,更迅速,通常也是首选做法,不过有时只是想直接在 SQL语句中插入一个不改变的字符串。比如,像 ORDER BY,可以这样来使用:
ORDER BY ${columnName}
2. 这里 MyBatis 不会修改或转义字符串
3. 以这种方式接受从用户输出的内容并提供给语句中不变的字符串是不安全的,会导致潜在的SQL注入攻击,因此要么不允许用户输入这些字段,要么自行转义并检验;
最近在学习MyBatis框架,一点经验分享给大家,在下拙见,如有不足之处望读者多多谅解并提于建议。