mybatis
resultType和resultMap功能类似 ,都是返回对象信息 ?
resultMap
高级映射 :(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)使用resultType进行输出映射,只有查询出来的列名和pojo中的属性名一致,该列才可以映射成功。(数据库,实体,查询字段,这些全部都得一一对应)
SQL删除数据空格函数
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映射文件
mybatis 转义对照表
优势
1、 简化JDBC的开发
2、 能够更好的完成ORM(对象关系映射)
ORM思想
对象关系映射(英语:Object Relational Mapping,简称ORM,或O/RM,或O/R mapping),是一种程序设计技术,用于实现面向对象编程语言里不同类型系统的数据之间的转换。从效果上说,它其实是创建了一个可在编程语言里使用的“虚拟对象数据库”。如今已有很多免费和付费的ORM产品,而有些程序员更倾向于创建自己的ORM工具。
总结: 以面向对象的方式操作数据库.
内部组件结构图
开发步骤
XML映射方式
1、添加pom.xml依赖
2、配置mybatis-config.xml核心配置文件
3、创建pojo
4、创建mapper映射文件UserMapper.xml
5、将映射文件UserMapper.xml配置到核心配置文件mybatis-config.xml中
6、测试 获取session,操作数据库
接口映射方式
1、添加pom.xml依赖
2、配置mybatis-config.xml核心配置文件
3、创建pojo
4、创建UserDao接口
5、创建mapper映射文件UserMapper.xml
namespace的值 = dao接口的全路径,SQL的id值 = 接口里方法的名字
6、将映射文件UserMapper.xml配置到核心配置文件mybatis-config.xml中
7、测试
Mapper.xml映射文件解析
参数值:paramterType
指定参数类型,通常制定一个对象类型。
返回值:resultType
非常重要的东西,即完成ORM的映射关系所在。这里指定的cd.tedu.mybatis.domain.User代表把结果集转换成一个User对象实例。
返回值:resultMap
resultMap 用于对复杂对象结构时,对应的ResultMap结构名称
集合:List
在MyBatis中,大多默认采用List集合,声明集合参数或者返回值时,都有个奇怪的写法,本应写List,但习惯只写集合元素的类型:String,大家切记。
#和$的区别
#:使用#{parameterName}引用参数的时候,Mybatis会把这个参数认为是一个字符串
$: 不做字符串拼接,传入什么就接收什么
从安全性上考虑,能使用#尽量使用#来传参,因为这样可以有效防止SQL注入的问题。
SQL中有特殊字符
当SQL中有特殊字符,mybatis不能正常解析时,用 <![CDATA[ ?? ]]> 括起来就解决了 <![CDATA[ and age<=#{age} ]]>
动态拼接sql的标签
<typeAlias> 类型别名,使用它们,你就可以不用输入类的全限定名了
<typeAlias type="com.someapp.model.User" alias="User"/>
<sql> 与 <include> sql片段及其引用
Sql标签用来提取SQL片段,来提高SQL的复用.
include引用指定SQL片段的使用位置
<if> 执行SQL时,可以添加一些判断条件.
<where> 去掉条件中可能多余的and或者or:
<set> 去掉最后可能多余的逗号:
<foreach> 用于in子查询中的多个值的遍历:
collection 的值可以是集合或数据
<trim> 模糊查询like的使用
1. sql中字符串拼接
2. 使用 ${...} 代替 #{...}
SELECT * FROM tableName WHERE name LIKE '%${text}%';
3. 程序中拼接
String searchText = new StringBuilder("%").append(text).append("%").toString();
parameterMap.put("text", searchText);
<choose> <when></otherwise>
ResultMap
简单使用
当数据库的字段名 和 对象的属性名 一致时,可以用简单属性resultType。
但是当 数据库中的字段名称 和 对象中的属性名称 不 一致时,就需要resultMap属性。
对象的属性名与表里的字段名匹配
自动匹配规范驼峰规则
数据库中我们习惯使用全大写,多个单词用下划线隔开,而po对象中,习惯使用java驼峰规则
一个一个手工写resultMap字段,浪费开发时间,采用自动匹配规范驼峰规则。
例如:
数据库字段: is_man Javabean属性: private Integer isMan
mapper配置不需要写字段与属性的配置,会自动映射
注意:主键需要单独写,其它字段就可以直接利用驼峰规则自动映射。
配置步骤
第一步:在sqlMapConfig.xml中配置settings:
第二步:在映射文件中,resultMap配置autoMapping="true"
resultMap元素的概念视图
constructor - 用于在实例化类时,注入结果到构造方法中
idArg - ID 参数;标记出作为 ID 的结果可以帮助提高整体性能
arg - 将被注入到构造方法的一个普通结果
id – 一个 ID 结果;标记出作为 ID 的结果可以帮助提高整体性能
result – 注入到字段或 JavaBean 属性的普通结果
association – 一个复杂类型的关联;许多结果将包装成这种类型
嵌套结果映射 – 关联可以是 resultMap 元素,或是对其它结果映射的引用
collection – 一个复杂类型的集合
嵌套结果映射 – 集合可以是 resultMap 元素,或是对其它结果映射的引用
discriminator – 使用结果值来决定使用哪个 resultMap
case – 基于某些值的结果映射
嵌套结果映射 – case 也是一个结果映射,因此具有相同的结构和元素;或者引用其它的结果映射
复杂使用
PageHelper实现分页
第一步引入依赖
PageHelper.startPage(1,2).doSelectPageInfo(new ISelect())
扩展
JDBC和MyBatis的区别?
JDBC是java提供了一套专门用于和数据库对接的api,java.sql.*,其规范了如何和数据库进行对接,实现由各数据库厂商进行各自的实现和扩展。学习JDBC重点在学习如何使用其api。
MyBatis框架是轻量级封装了JDBC,我们已经看不到这些api,连接connection、语句preparedstatement、结果集ResultSet,而关注的是mybatis框架体系如何去使用,一旦写好,我们关注的是java对象。
XML和接口方式的区别?
MyBatis提供了两种操作数据库的方式,一种是通过xml映射文件,一种是通过java的接口类。按面向对象方式更加推荐接口方式,但如果复杂的多表映射,仍然需要使用xml映射文件的ResultMap方式实现。
接口只是假象,其底层仍然是通过xml实现,好不容易实现了一套方式,怎忍丢掉呢?可以做个测试就知道它底层怎么实现的?把xml中的sql删除,它就玩不转了。
接口方式怎么找到xml执行的?
SqlSession的getMapper方法找到类,通过反射可以获取到类的全路径(包名.类名),相加后就定位到某个xml的命名空间namespace,在根据调用的方法去找到xml中某个标签的id属性。从而实现价值接口,调用接口的方法而间接找到xml中的标签,通过解析xml获取这个标签的内容,从而获取到sql语句。