mybatis

resultType和resultMap功能类似 ,都是返回对象信息 ?

resultMap

高级映射 :(resultMap) 如果查询出来的列名和pojo的属性名不一致,通过定义一个resultMap对列名和pojo属性名之间作一个映射关系。(高级映射,字段名称可以不一致,通过映射来实现

单表查询

mybatis_第1张图片

关联查询(一对一)

resultMap对于一对一表连接的处理方式通常为在主表的pojo中添加嵌套另一个表的pojo,然后在mapper.xml中采用association节点元素进行对另一个表的连接处理。例如

订单查询关联用户的resultMap

将整个查询的结果映射到cn.itcast.mybatis.po.Orders中

mybatis_第2张图片 

association:

        作用:将关联查询信息映射到一个pojo对象中

关联查询(一对多)

resultMap的处理方式为在订单表数据的pojo中添加一个list,list中为订单明细表的属性,在mapper.xml中采用如下的处理方式:

订单及订单明细的resultMap

使用extends继承,不用在中配置订单信息和用户信息的映射

mybatis_第3张图片 

collection:

        作用:将关联查询信息映射到一个list集合中。

resultType

基本映射 :(resultType)使用resultType进行输出映射,只有查询出来的列名和pojo中的属性名一致,该列才可以映射成功。(数据库,实体,查询字段,这些全部都得一一对应)

SQL删除数据空格函数

        1、Trim()函数:前后空格 用来删除数据左右两边(开始和结尾处)的空格。

        2、RTrim()函数:后面空格  用来删除数据右边(结尾处)的空格。

        3、LTrim()函数:前面空格  用来删除数据左边(开始处)的空格。

        注意:Trim()、RTrim()、LTrim() 函数不光可以用于SELECT语句中,还可以用于WHERE等语句中。

        4、Replace函数:中间空格  字符中的空格,用replace(string, ' ', '')

语法:

mybatis_第4张图片

Mybatis之

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 转义对照表

mybatis_第5张图片

 优势

        1、 简化JDBC的开发

        2、 能够更好的完成ORM(对象关系映射)

ORM思想

对象关系映射(英语:Object Relational Mapping,简称ORM,或O/RM,或O/R mapping),是一种程序设计技术,用于实现面向对象编程语言里不同类型系统的数据之间的转换。从效果上说,它其实是创建了一个可在编程语言里使用的“虚拟对象数据库”。如今已有很多免费和付费的ORM产品,而有些程序员更倾向于创建自己的ORM工具。

总结: 以面向对象的方式操作数据库.

内部组件结构图

mybatis_第6张图片

开发步骤

XML映射方式

1、添加pom.xml依赖

mybatis_第7张图片 

2、配置mybatis-config.xml核心配置文件

mybatis_第8张图片 

3、创建pojo

mybatis_第9张图片 

4、创建mapper映射文件UserMapper.xml

mybatis_第10张图片 

5、将映射文件UserMapper.xml配置到核心配置文件mybatis-config.xml中

mybatis_第11张图片 

6、测试 获取session,操作数据库

mybatis_第12张图片 

接口映射方式

1、添加pom.xml依赖

mybatis_第13张图片 

2、配置mybatis-config.xml核心配置文件

 mybatis_第14张图片

3、创建pojo

mybatis_第15张图片 

4、创建UserDao接口

5、创建mapper映射文件UserMapper.xml

namespace的值 = dao接口的全路径,SQL的id值 = 接口里方法的名字

mybatis_第16张图片 

6、将映射文件UserMapper.xml配置到核心配置文件mybatis-config.xml中

mybatis_第17张图片 

7、测试

mybatis_第18张图片 

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不能正常解析时,用 括起来就解决了

动态拼接sql的标签

类型别名,使用它们,你就可以不用输入类的全限定名了

 

sql片段及其引用

Sql标签用来提取SQL片段,来提高SQL的复用.

include引用指定SQL片段的使用位置

mybatis_第19张图片

执行SQL时,可以添加一些判断条件.

 

去掉条件中可能多余的and或者or:

mybatis_第20张图片 

去掉最后可能多余的逗号:

mybatis_第21张图片 

用于in子查询中的多个值的遍历:

collection 的值可以是集合或数据

mybatis_第22张图片 

模糊查询like的使用

1. sql中字符串拼接

mybatis_第23张图片 

2. 使用 ${...} 代替 #{...}
   SELECT * FROM tableName WHERE name LIKE '%${text}%';
 3. 程序中拼接
   String searchText = new StringBuilder("%").append(text).append("%").toString();
   parameterMap.put("text", searchText);

ResultMap

简单使用

        当数据库的字段名 和 对象的属性名 一致时,可以用简单属性resultType。

        但是当 数据库中的字段名称 和 对象中的属性名称 不 一致时,就需要resultMap属性。

        对象的属性名与表里的字段名匹配

mybatis_第24张图片

        自动匹配规范驼峰规则

        数据库中我们习惯使用全大写,多个单词用下划线隔开,而po对象中,习惯使用java驼峰规则

        一个一个手工写resultMap字段,浪费开发时间,采用自动匹配规范驼峰规则。

例如:

数据库字段: is_man Javabean属性: private Integer isMan

mapper配置不需要写字段与属性的配置,会自动映射

注意:主键需要单独写,其它字段就可以直接利用驼峰规则自动映射。

配置步骤

第一步:在sqlMapConfig.xml中配置settings:

mybatis_第25张图片 

第二步:在映射文件中,resultMap配置autoMapping="true"

 

resultMap元素的概念视图

constructor - 用于在实例化类时,注入结果到构造方法中

        idArg - ID 参数;标记出作为 ID 的结果可以帮助提高整体性能

        arg - 将被注入到构造方法的一个普通结果

id – 一个 ID 结果;标记出作为 ID 的结果可以帮助提高整体性能

result – 注入到字段或 JavaBean 属性的普通结果

association – 一个复杂类型的关联;许多结果将包装成这种类型

        嵌套结果映射 – 关联可以是 resultMap 元素,或是对其它结果映射的引用

collection – 一个复杂类型的集合

        嵌套结果映射 – 集合可以是 resultMap 元素,或是对其它结果映射的引用

discriminator – 使用结果值来决定使用哪个 resultMap

        case – 基于某些值的结果映射

                嵌套结果映射 – case 也是一个结果映射,因此具有相同的结构和元素;或者引用其它的结果映射

复杂使用

PageHelper实现分页

第一步引入依赖

mybatis_第26张图片 

PageHelper.startPage(1,2).doSelectPageInfo(new ISelect())

 mybatis_第27张图片

扩展

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语句。 

你可能感兴趣的:(mybatis,java,数据库)