导图社区 Mybatis
MyBatis本是apache的一个开源项目iBatis,2010年这个项目由apache software foundation迁移到了google code,并且改名为MyBatis。2013年11月迁移到Github。iBATIS一词来源于“internet”和“abatis”的组合,是一个基于Java的持久层框架。
编辑于2022-09-26 14:22:38 四川省listener 音标['lisnә] 读音 汉语翻译 n. 收听者, 听众 英语解释: 名词listener: someone who listens attentively 同义词:hearer, auditor, attender
Filter过滤器(重要) Javaweb中的过滤器可以拦截所有访问web资源的请求或响应操作。 1、Filter快速入门 1.1、步骤: 1. 创建一个类实现Filter接口 2. 重写接口中方法 d...
会话的解释 [conversation] 指两人以上的对话(多用于学习别种语言或方言时) 详细解释 (1).聚谈;对话。现多用于学习别种语言或方言时
社区模板帮助中心,点此进入>>
listener 音标['lisnә] 读音 汉语翻译 n. 收听者, 听众 英语解释: 名词listener: someone who listens attentively 同义词:hearer, auditor, attender
Filter过滤器(重要) Javaweb中的过滤器可以拦截所有访问web资源的请求或响应操作。 1、Filter快速入门 1.1、步骤: 1. 创建一个类实现Filter接口 2. 重写接口中方法 d...
会话的解释 [conversation] 指两人以上的对话(多用于学习别种语言或方言时) 详细解释 (1).聚谈;对话。现多用于学习别种语言或方言时
Mybatis
介绍
框架
是软件开发中的一套解决方案,不同的框架解决不同的问题
使用框架好处
框架封装了很多细节,使开发者可以使用极简的方式实现功能,大大提高效率
三层架构
介绍
1.控制层(视图层)controller
完成和用户的交互,接收请求,显示请求的处理结果,展示数据
解决方案
SpringMVC框架
2.业务逻辑层service
计算数据,处理业务逻辑
3.数据访问层(持久层)dao
与数据库交互
解决方案
JDBC技术
Connection
PreparedStatement
ResultSet
Spring的JdbcTemplate
Spring对jdbc的简单封装
Apache的DBUtils
和Spring的JdbcTemplate很像,也是对Jdbc的简单封装
这些都不是框架
JDBC是规范
Spring的JdbcTemplate和Apache的DBUtils都只是工具类
Mybatis框架
调用流程
ORM思想
Object Relational Mappging对象关系映射
指的是持久化数据和实体对象的映射模式,为了解决面向对象与关系型数据库存在的互不匹配的现象的技术。
就是把数据库表和实体类及实体类的属性对应起来这样可以操作实体类就实现操作数据库表
映射规则
数据表→类
表字段→类属性
表行数据→对象
JDBC
原始JDBC的操作问题分析
1.频繁创建和销毁数据库的连接会造成系统资源浪费从而影响系统性能。
2.sql语句在代码中硬编码,如果要修改sql语句,就需要修改java代码,造成代码不易维护。
3.查询操作时,需要手动将结果集中的数据封装到实体对象中。
4.增删改查操作需要参数时,需要手动将实体对象的数据设置到sql语句的占位符。
原始JDBC的操作问题解决方案
1.使用数据库连接池初始化连接资源。
2.将sql语句抽取到配置文件中。
3.使用反射、内省等底层技术,将实体与表进行属性与字段的自动映射。
Mybatis框架
MyBatis官网
http://www.mybatis.org/mybatis-3/
mybatis 是一个优秀的基于 java 的持久层框架,它内部封装了 jdbc,使开发者只需要关注 sql 语句本身,而不需要花费精力去处理加载驱动、创建连接、创建 statement 等繁杂的过程。
mybatis 通过 xml 或注解的方式将要执行的各种 statement 配置起来,并通过 java 对象和 statement 中sql 的动态参数进行映射生成最终执行的 sql 语句,最后由 mybatis 框架执行 sql 并将结果映射为 java 对象并返回
采用 ORM 思想解决了实体和数据库映射的问题,对 jdbc 进行了封装,屏蔽了 jdbc api 底层访问细节,不用与 jdbc api 打交道,就可以完成对数据库的持久化操作。
环境搭建
步骤
1.创建maven工程并导入坐标
2.创建实体类和dao的接口
3.创建Mybatis的核心配置文件:SqlMapConfig.xml
4.创建映射配置文件:IUserDao.xml
注意
1.创建IUserDao.xml和IUserDao.java时名称是为了与之前的知识保持一致。在Mybatis中它把持久层的操作接口名称和映射文件也叫做:Mapper所以:IUserDao和IUserMapper是一样的
2.在idea中创建目录的时候,和包是不一样的包在创建时:com.itheima.dao它是三级结构目录在创建时:com.itheima.dao是一级目录
3.mybatis的映射配置文件位置必须和dao接口的包结构相同
4.映射配置文件的mapper标签namespace属性的取值必须是dao接口的全限定类名
5.映射配置文件的操作配置(select),id属性的取值必须是dao接口的方法名
必要规定
遵从了这些规定之后,在开发中就无须再写dao的实现类
特别
在实际开发中,都是越简便越好,所以都是采用不写dao实现类的方式,不管使用XML还是注解配置,但是Mybatis是支持写dao实现类的。
相关API
org.apache.ibatis.io.Resources
介绍
加载资源的工具类
Resources类帮助从类路径下、文件系统或一个 web URL 中加载资源文件
核心方法
org.apache.ibatis.session.SqlSessionFactoryBuilder
介绍
获取SqlSessionFactory工厂对象的功能
核心方法
org.apache.ibatis.session.SqISessionFactory
介绍
获取SqISession构建者对象的工厂接口
指定事务的提交方式
核心方法
org.apache.ibatis.session.SqlSession
介绍
构建者对象接口。用于执行SQL、管理事务、接口代理
核心方法
注意
对于增删改操作,如果没有在创建SqlSession对象时指定事务的提交方式,则一定需要使用commit()方法实现手动提交
映射配置文件
介绍
映射配置文件包含了数据和对象之间的映射关系以及要执行的SQL语句
例子
<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
详解
标签
<mapper>
核心根标签
<select>
查询功能标签
<insert>
新增功能标签
<update>
修改功能标签
<delete>
删除功能标签
属性
namespace
名称空间
id
唯一标识,配合名称空间使用
resultType
指定结果映射的对象类型
对于增删改操作返回值为影响的行数,所以此时该属性可以省略
例子
resultType="com. itheima. bean. Student"
parameterType
指定参数映射的对象类型
例子
parameterType="java. lang. Integer"
parameterType="com. itheima. bean. Student"
SQL获取参数
#{属性名}
核心配置文件
介绍
核心配置文件包含了MyBatis最核心的设置和属性信息。如数据库的连接、事务、连接池信息等
例子
<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd">
详解
<configuration>
核心根标签
<properties>
引入数据库连接信息配置文件标签
获取数据库连接参数
${键名}
属性
resource
数据库连接配置文件路径
<typeAliases>
为全类名起别名的父标签
标签
<typeAlias>
为全类名起别名的子标签
<package>
为指定包下所有类起别名的子标签。(别名就是类名)
<package name="包名"/>
属性
type
指定全类名
alias
指定别名
补充
自带别名
string
java.lang.String
long
java.lang.Long
int
java.lang.Integer
double
java.lang.Double
boolean
java.lang.Boolean
<environments>
配置数据库环境标签
属性
default
决定使用哪一个数据库环境
<environment>
配置数据库信息标签,可以有多个
属性
id
数据库信息唯一标识
<transactionManager>
事务管理标签
属性
type
事务管理类型
<dataSource>
数据源标签
属性
type
数据源类型
<property>
数据库连接信息标签
属性
name
连接信息名称
driver、url、username、password
value
连接信息值
<mappers>
引入映射配置文件标签
标签
<mapper>
引入指定的映射配置文件
可以有多个
属性
resource
指定映射配置文件的名称
实现Dao层
传统方式
调用过程
实现
Mapper
持久层接口impl
持久层实现类
Service
业务层接口impl
业务层实现类
Controller
控制层实现类
Log4j
作用
输出MyBatis真正执行的SQL语句、参数、结果等信息
使用步骤
导入jar包
修改核心配置文件
在src下编写Log4j配置文件
接口代理方式
介绍
Mapper 接口开发方法只需要程序员编写Mapper 接口(相当于Dao 接口),由Mybatis 框架根据接口定义创建接口的动态代理对象,代理对象的方法体同上边Dao接口实现类方法,负责数据库的crud操作
开发规范
Mapper.xml文件中的namespace与mapper接口的全限定名相同
Mapper接口方法名和Mapper.xml中定义的每个statement的id相同
Mapper接口方法的输入参数类型和mapper.xml中定义的每个sql的parameterType的类型相同
Mapper接口方法的输出参数类型和mapper.xml中定义的每个sql的resultType的类型相同
例子
实现
在传统方式上改进
删除mapper层接口的实现类。
修改映射配置文件。
修改service层接口的实现类,采用接口代理方式实现功能。
//获取StudentMapper接口的实现类对象StudentMapper mapper = sqlSession.getMapper(StudentMapper.class); //StudentMapper mapper = new StudentMapperImpl();//通过实现类对象调用方法,接收结果stu = mapper.selectById(id);
具体步骤
1.获取SqlSession对象,SqlSessionFactory.openSession的方法执行sql语句
2.使用getMapper方法获取某个接口的对象,sqlSession.getMapper(接口.class)
3.使用dao接口的方法,调用方法就执行了mapper文件中的sql语句
注意
获取动态代理对象
SqlSession 功能类中的 getMapper() 方法
动态代理对象的生成
通过动态代理开发模式,只编写一个接口,不写实现类,通过 getMapper() 方法最终获取到 org.apache.ibatis.binding.MapperProxy 代理对象,然后执行功能,而这个代理对象正是MyBatis 使用了 JDK 的动态代理技术,帮助生成了代理实现类对象。从而可以进行相关持久化操作。
分析方法的执行
动态代理实现类对象在执行方法的时候最终调用了 mapperMethod.execute() 方法,这个方法中通过 switch 语句根据操作类型来判断是新增、修改、删除、查询操作,最后一步回到了 MyBatis最原生的 SqlSession 方式来执行增删改查。
动态sql
介绍
Mybatis 的映射配置文件中,有些时候业务逻辑复杂时,需要 SQL是动态变化的,根据条件,能够得到不同的sql语句
标签
<where>
介绍
条件标签。如果有动态条件,则使用该标签代替where关键字
里面是多个if,如果有一个if成立,会在sql的后见加入where关键字,去掉无用的and,or等字符
<if>
介绍
条件判断标签
条件为true,就会把if之间的sql加入到主sql之后
格式
<foreach>
介绍
循环遍历标签。适用于多个参数或者的关系,循环数组,list集合
格式
属性
collection
参数容器类型, (list-集合, array-数组)
item
自定义的,表示数组和集合成员的变量
open
开始的 SQL 语句
close
结束的 SQL 语句
separator
分隔符
SQL片段抽取
介绍
可将重复的 sql 提取出来,使用时用 include 引用即可,最终达到 sql 重用的目的
标签
<sql>
介绍
抽取 SQL 语句标签。
格式
<include>
介绍
引入 SQL 片段标签
格式
使用
1.先定义<sql id = "自定义名称唯一"> sql语句,表名,字段等</sql>
2.再使用,<include refid = "id的值" />
分页插件
介绍
分页
分页可以将很多条结果进行分页显示。
如果当前在第一页,则没有上一页。如果当前在最后一页,则没有下一页。
需要明确当前是第几页,这一页中显示多少条结果
在企业级开发中,分页也是一种常见的技术。而目前使用的 MyBatis 是不带分页功能的,如果想实现分页的功能,需要手动编写 LIMIT 语句。但是不同的数据库实现分页的 SQL 语句也是不同的,所以手写分页成本较高。这个时候就可以借助分页插件来帮助实现分页功能
PageHelper
第三方分页助手。将复杂的分页操作进行封装,从而让分页功能变得非常简单
使用步骤
1.加入maven依赖
<dependency> <groupId>com.github.pagehelper</groupId> <artifactId>pagehelper</artifactId> <version>5.1.1</version></dependency>
2.在mybatis核心配置文件,加入plugin
3.在查询方法之前,加入PageHelper方法的调用
PageHelper.startPage(1,2);
相关参数
PageInfo
介绍
封装分页相关参数的功能类
核心方法
long
getTotal()
获取总条数
int
getPageso()
获取总页数
int
getPageNum()
获取当前页
int
getPageSize()
获取每页显示条数
int
getPrePage ()
获取上一页
int
getNextPage ()
获取下一页
boolean
islsFirstPage()
获取是否是第一页
boolean
islastPage()
获取是否是最后一页
多表操作
介绍
在实际开发中,随着业务难度的加深,肯定需要多张表共同操作的,Mybatis的多表操作需要在映射配置文件中设置
多表模型分类
一对一
在任意一方建立外键,关联对方的主键
人和身份证,一个人只有一个身份证
一对多
在多的一方建立外键,关联一的一方的主键
班级和学生,一个班级可以有多个学生
多对多
借助中间表,中间表至少两个字段,分别关联两张表的主键
学生和课程,一个学生可以选择多门课程、一个课程也可以被多个学生所选择
标签
<resultMap>
介绍
配置字段和对象属性的映射关系标签
属性
id
唯一标识
type
实体对象类型
<id>
介绍
配置主键映射关系标签
属性
column
表中字段名称
property
实体对象变量名称
<result>
介绍
配置非主键映射关系标签
属性
column
表中字段名称
property
实体对象变量名称
<association>
介绍
配置被包含对象的映射关系标签
属性
property
被包含对象的变量名
javaType
被包含对象的数据类型
<collection>
介绍
配置被包含集合对象的映射关系标签
属性
property
被包含集合对象的变量名
ofType
集合中保存的对象数据类型
具体操作
一对一
<resultMap id="oneToOne" type="card"> <id column="cid" property="id" /> <result column="number" property="number" /><association property="p" javaType="person"> <id column="pid" property="id" /> <result column="name" property="name" /> <result column="age" property="age" /></association></resultMap>
一对多
<resultMap id="oneToMany" type="classes"> <id column="cid" property="id"/> <result column="cname" property="name"/><collection property="students" ofType="student"> <id column="sid" property="id"/> <result column="sname" property="name"/> <result column="sage" property="age"/></collection></resultMap>
多对多
<resultMap id="manyToMany" type="student"> <id column="sid" property="id"/> <result column="sname" property="name"/> <result column="sage" property="age"/><collection property="courses" ofType="course"> <id column="cid" property="id"/> <result column="cname" property="name"/></collection></resultMap>
注解开发
配置映射关系
介绍
修改MyBatis的核心配置文件,使用注解替代的映射文件,只需要加载使用了注解的Mapper接口即可
方式
常用注解
@Select("查询的SQL语句")
执行查询操作注解
例子
@insert("新增的SQL语句")
执行新增操作注解
例子
@Update("修改的SQL语句")
执行修改操作注解
例子
@Delete("删除的SQL语句")
执行删除操作注解
例子
多表操作
@Results
介绍
代替的是标签<resultMap>该注解中可以使用单个@Result注解,也可以使用@Result集合,其中定义了Result数组
可以与@Result 一起使用,封装多个结果集
格式
@Result
介绍
代替了<id>标签和<result>标签
实现结果集封装
属性
column
数据库的列名
property
实体对象的属性名
javaType
被包含对象的实际数据类型
one
需要使用的@One注解
many
需要使用的@Many注解
@One
介绍
代替了<assocation>标签,是多表查询的关键,在注解中用来指定子查询返回单一对象
实现一对一结果集封装
属性
select
指定用来多表查询的sqlmapper
指定调用某个接口中的某个方法
格式
@Many
介绍
代替了<collection>标签,是是多表查询的关键,在注解中用来指定子查询返回对象集合
实现一对多结果集封装
属性
select
指定用来多表查询的sqlmapper
指定调用某个接口中的某个方法
格式
构建SQL
介绍
通过注解开发时,相关 SQL 语句都是自己直接拼写的。一些关键字写起来比较麻烦、而且容易出错,MyBatis 提供了 org.apache.ibatis.jdbc.SQL 功能类,专门用于构建 SQL 语句
核心方法
SELECT(String...column)
根据字段拼接查询语句
FROM(String...table)
根据表名拼接语句
WHERE(String...condition)
根据条件拼接语句
INSERT_INTO(String table)
根据表名拼接新增语句
VALUES(String column,String values)
根据字段和值拼接插入数据语句
UPDATE(String table)
根据表名拼接修改语句
DELETE_FROM(String table)
根据表名拼接删除语句
步骤
在功能类中定义方法,返回想要的sql语句
在映射文件中添加相应的注解语句
功能实现
查询
注解
@SelectProvider
介绍
生成查询用的 SQL 语句注解
属性
type
生成 SQL 语句功能类对象
method
指定调用方法
例子
新增
注解
@InsertProvider
介绍
生成新增用的 SQL 语句注解
属性
type
生成 SQL 语句功能类对象
method
指定调用方法
例子
修改
注解
@UpdateProvider
介绍
生成修改用的 SQL 语句注解
属性
type
生成 SQL 语句功能类对象
method
指定调用方法
例子
删除
注解
@DeleteProvider
介绍
生成删除用的 SQL 语句注解
属性
type
生成 SQL 语句功能类对象
method
指定调用方法
例子
主题