高级映射 :(resultMap) 如果查询出来的列名和pojo的属性名不一致,通过定义一个resultMap对列名和pojo属性名之间作一个映射关系。(高级映射,字段名称可以不一致,通过映射来实现
resultMap对于一对一表连接的处理方式通常为在主表的pojo中添加嵌套另一个表的pojo,然后在mapper.xml中采用association节点元素进行对另一个表的连接处理。例如
订单查询关联用户的resultMap
将整个查询的结果映射到cn.itcast.mybatis.po.Orders中
?
association:
????????作用:将关联查询信息映射到一个pojo对象中
resultMap的处理方式为在订单表数据的pojo中添加一个list,list中为订单明细表的属性,在mapper.xml中采用如下的处理方式:
订单及订单明细的resultMap
使用extends继承,不用在中配置订单信息和用户信息的映射
?
collection:
????????作用:将关联查询信息映射到一个list集合中。
基本映射 :(resultType)使用resultType进行输出映射,只有查询出来的列名和pojo中的属性名一致,该列才可以映射成功。(数据库,实体,查询字段,这些全部都得一一对应)
????????1、Trim()函数:前后空格?用来删除数据左右两边(开始和结尾处)的空格。
????????2、RTrim()函数:后面空格??用来删除数据右边(结尾处)的空格。
????????3、LTrim()函数:前面空格??用来删除数据左边(开始处)的空格。
????????注意:Trim()、RTrim()、LTrim() 函数不光可以用于SELECT语句中,还可以用于WHERE等语句中。
????????4、Replace函数:中间空格??字符中的空格,用replace(string, ' ', '')
Mybatis之<trim prefix="" suffix="" suffixOverrides="" prefixOverrides=""></trim>
prefix: 在trim标签内sql语句加上前缀。
suffix: 在trim标签内sql语句加上后缀。
prefixOverrides: 指定去除多余的前缀内容
suffixOverrides: 指定去除多余的后缀内容,如:suffixOverrides="," 去除trim标签内sql语句多余的后缀","?
????????MyBatis 是一款优秀的持久层框架
????????它的前身是IBatis
????????它支持定制化 SQL、存储过程以及高级映射。
????????它是一个半自动化的ORM(对象 关系 映射)映射框架
MyBatis的前身就是iBatis,iBatis本是apache的一个开源项目,2010年5月这个项目由apahce sofeware foundation 迁移到了google code,并且改名为MyBatis。
MyBatis 是支持普通 SQL 查询,存储过程和高级映射的优秀持久层框架。MyBatis 消除了几乎所有的 JDBC 代码和参数的手工设置以及结果集的检索。
Mybatis是持久化层的框架,与数据库进行交互. Mybatis在内部封装了JDBC.
Mybatis称之为半自动化的ORM映射框架
????????1. 添加依赖
????????2. 配置 yml (数据源等)
????????3. 定义mapper接口
????????4. 添加mapper.xml映射文件
????????1、 简化JDBC的开发
????????2、 能够更好的完成ORM(对象关系映射)
对象关系映射(英语:Object Relational Mapping,简称ORM,或O/RM,或O/R mapping),是一种程序设计技术,用于实现面向对象编程语言里不同类型系统的数据之间的转换。从效果上说,它其实是创建了一个可在编程语言里使用的“虚拟对象数据库”。如今已有很多免费和付费的ORM产品,而有些程序员更倾向于创建自己的ORM工具。
总结: 以面向对象的方式操作数据库.
?
?
?
?
?
?
?
?
?
?
?
?
????????指定参数类型,通常制定一个对象类型。
????????非常重要的东西,即完成ORM的映射关系所在。这里指定的cd.tedu.mybatis.domain.User代表把结果集转换成一个User对象实例。
????????resultMap 用于对复杂对象结构时,对应的ResultMap结构名称
????????在MyBatis中,大多默认采用List集合,声明集合参数或者返回值时,都有个奇怪的写法,本应写List,但习惯只写集合元素的类型:String,大家切记。
????????#:使用#{parameterName}引用参数的时候,Mybatis会把这个参数认为是一个字符串
????????$: 不做字符串拼接,传入什么就接收什么
????????从安全性上考虑,能使用#尽量使用#来传参,因为这样可以有效防止SQL注入的问题。
当SQL中有特殊字符,mybatis不能正常解析时,用 <![CDATA[ ?? ]]> 括起来就解决了 <![CDATA[ and age<=#{age} ]]>
?
<typeAlias type="com.someapp.model.User" alias="User"/>
Sql标签用来提取SQL片段,来提高SQL的复用.
include引用指定SQL片段的使用位置
?
?
?
collection 的值可以是集合或数据
?
?
SELECT * FROM tableName WHERE name LIKE '%${text}%';
String searchText = new StringBuilder("%").append(text).append("%").toString();
parameterMap.put("text", searchText);
????????当数据库的字段名 和 对象的属性名 一致时,可以用简单属性resultType。
????????但是当 数据库中的字段名称 和 对象中的属性名称 不 一致时,就需要resultMap属性。
????????对象的属性名与表里的字段名匹配
????????自动匹配规范驼峰规则
????????数据库中我们习惯使用全大写,多个单词用下划线隔开,而po对象中,习惯使用java驼峰规则
????????一个一个手工写resultMap字段,浪费开发时间,采用自动匹配规范驼峰规则。
数据库字段: is_man Javabean属性: private Integer isMan
mapper配置不需要写字段与属性的配置,会自动映射
注意:主键需要单独写,其它字段就可以直接利用驼峰规则自动映射。
配置步骤
?
?
constructor - 用于在实例化类时,注入结果到构造方法中
????????idArg - ID 参数;标记出作为 ID 的结果可以帮助提高整体性能
????????arg - 将被注入到构造方法的一个普通结果
id – 一个 ID 结果;标记出作为 ID 的结果可以帮助提高整体性能
result – 注入到字段或 JavaBean 属性的普通结果
association – 一个复杂类型的关联;许多结果将包装成这种类型
????????嵌套结果映射 – 关联可以是 resultMap 元素,或是对其它结果映射的引用
collection – 一个复杂类型的集合
????????嵌套结果映射 – 集合可以是 resultMap 元素,或是对其它结果映射的引用
discriminator – 使用结果值来决定使用哪个 resultMap
????????case – 基于某些值的结果映射
????????????????嵌套结果映射 – case 也是一个结果映射,因此具有相同的结构和元素;或者引用其它的结果映射
第一步引入依赖
?
PageHelper.startPage(1,2).doSelectPageInfo(new ISelect())
?
JDBC是java提供了一套专门用于和数据库对接的api,java.sql.*,其规范了如何和数据库进行对接,实现由各数据库厂商进行各自的实现和扩展。学习JDBC重点在学习如何使用其api。
MyBatis框架是轻量级封装了JDBC,我们已经看不到这些api,连接connection、语句preparedstatement、结果集ResultSet,而关注的是mybatis框架体系如何去使用,一旦写好,我们关注的是java对象。
MyBatis提供了两种操作数据库的方式,一种是通过xml映射文件,一种是通过java的接口类。按面向对象方式更加推荐接口方式,但如果复杂的多表映射,仍然需要使用xml映射文件的ResultMap方式实现。
接口只是假象,其底层仍然是通过xml实现,好不容易实现了一套方式,怎忍丢掉呢?可以做个测试就知道它底层怎么实现的?把xml中的sql删除,它就玩不转了。
SqlSession的getMapper方法找到类,通过反射可以获取到类的全路径(包名.类名),相加后就定位到某个xml的命名空间namespace,在根据调用的方法去找到xml中某个标签的id属性。从而实现价值接口,调用接口的方法而间接找到xml中的标签,通过解析xml获取这个标签的内容,从而获取到sql语句。?