MyBatis学习笔记
⛅ ⛅ ⛅
利用接口实现增删改查,Mapper…
MyBatis简介
一. MyBatis历史
1)MyBatis是Apache的一个开源项目iBatis, 2010年6月这个项目由Apache Software Foundation 迁移到了Google Code,随着开发团队转投Google Code旗下, iBatis3.x 正式更名为MyBatis ,代码于2013年11月迁移到Github
2)iBatis一词来源于“internet”和“abatis”的组合,是一个基于Java的持久层框架。 iBatis 提供的持久层框架包括SQL Maps和Data Access Objects(DAO)
二. MyBatis简介
1) MyBatis 是支持定制化 SQL、存储过程以及高级映射的优秀的持久层框架
2) MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集
3) MyBatis可以使用简单的XML或注解用于配置和原始映射,将接口和Java的POJO(Plain Old Java Objects,普通的Java对象)映射成数据库中的记录
4) Mybatis 是一个 半自动的ORM(Object Relation Mapping)框架
三. 如何下载MyBatis
1). 下载网址
https://github.com/mybatis/mybatis-3/
四. 持久化技术的对比
1).JDBC
- ① SQL夹在Java代码块里,耦合度高导致硬编码内伤
- ② 维护不易且实际开发需求中sql有变化,频繁修改的情况多见
2).Hibernate和JPA
- ① 长难复杂SQL,对于Hibernate而言处理也不容易
- ② 内部自动生产的SQL,不容易做特殊优化
- ③ 基于全映射的全自动框架,大量字段的POJO进行部分映射时比较困难。导致数据库性能下降
3).MyBatis
- ① 对开发人员而言,核心sql还是需要自己优化
- ② sql和java编码分开,功能边界清晰,一个专注业务、一个专注数据
五. 优缺点
优点:
1.简单易学
2.程序与sql语言分离,降低耦合,重用
3.支持动态sql
4.sql与对象之间的映射
缺点:
1.工作量大
2.可移植性差
六. Mybatis执行过程
1). 语言描述

2). 图解

七. 三个对象的作用域
| 作用域 | 有效范围 | 生命周期 |
|---|---|---|
| SqlSessionFactoryBuilder | 局部变量 | 方法体内 |
| SqlSessionFactory | 整个程序 | application |
| SqlSession | 一次会话 | jsp里的session |
八. session方法
- selectOne(查询一条数据)
- insert(插入数据)
- update(修改数据)
- delete(删除数据)
- selectList (查询多条数据)
- getMapper(①要保证映射文件的包名和接口的类全名一致,②要保证映射文件里的id和接口的标准名一致)
MyBatis Helloworld项目
一. 开发环境的准备
1). 导入MyBatis框架的jar包、Oracle驱动包、log4j的jar包

2). 导入log4j 的配置文件
1 |
|
二. 创建javaBean(实体类)
1). 属性名要和表的列名相同
1 | package com.AAA.Text1; |
三. 创建MyBatis的全局配置文件
1). 参考MyBatis的官网手册
1 |
|
四. 创建Mybatis的sql映射文件
1). <select>:定义查询语句
2). ID:设置SQL语句的唯一标识
3). resultType:结果类型,即实体类的全限定名
1 |
|
五. 测试
1 | package com.AAA.Text1; |
MyBatis CRUD项目
目录结构

注意事项
1). 如果使用的 事务方式为 jdbc,则需要 手工commit提交,即session.commit();
2). 所有的标签 <select> <update>等 ,都必须有sql语句,但是sql参数值可选select* from student where stuno = #{xx}
3). sql有参数:session.insert(statement, 参数值 );
sql没参数:session.insert(statement);
一. 创建一个实体类
1 | package com.AAA.Text.entity; |
二. 创建一个工具类
1 | package com.AAA.Text.util; |
三. sql映射文件
1 |
|
四. 创建一个Mapper接口
接口中的方法必须遵循以下约定:
- 1.方法名和mapper.xml文件中标签的id值相同
- 2.方法的 输入参数 和mapper.xml文件中标签的 parameterType类型一致 (如果mapper.xml的标签中没有 parameterType,则说明方法没有输入参数)
- 3.方法的返回值 和mapper.xml文件中标签的 resultType类型一致 (无论查询结果是一个 还是多个(Emp、List
),在mapper.xml标签中的resultType中只写 一个(Emp);如果没有resultType,则说明方法的返回值为void)
1 | package com.AAA.Text.dao; |
五. 实现这个接口
1 | package com.AAA.Text.dao.impl; |
六. 测试
1 | package com.AAA.Text.test; |
Mapper动态实现CRUD
getMapper绑定
1). 根据 接口名 找到 mapper.xml文件(根据的是namespace=接口全类名)
2). 根据 接口的方法名 找到 mapper.xml文件中的SQL标签 (方法名=SQL标签Id值)
习惯:SQL映射文件(mapper.xml) 和 接口放在同一个包中 (注意修改全局配置文件中加载mapper.xml文件的路径)
约定的目标: 省略掉实现方法,即根据约定 直接可以定位出SQL语句
目录结构
一. 删除实现类,修改映射文件
- 映射文件修改地址,要在配置文件中重新设置
- namespace的值 ,就是 接口的全类名( 接口 - mapper.xml 一一对应)
1 |
|
二. 工具类
factory.openSession(true)该方法需改为自动提交事务
1 | package com.AAA.Text.util; |
三. 测试
1 | package com.AAA.Text.test; |
优化
- 可以将配置信息 单独放入 db.properties文件中,然后再动态引入
一. 创建db.properties文件
1 | driver=oracle.jdbc.OracleDriver |
二. 修改全局配置文件
1 |
|
扩展
insert从序列中获取主键值
1). sql映射文件
1 | <insert id="add" parameterType="com.AAA.Text.entity.Emp" databaseId="oracle"> |
参数传递
1). 单个普通类型参数
可以接受基本类型,包装类型,字符串类型等。这种情况MyBatis可直接使用这个参数,不需要经过任何处理。
2). 多个参数
任意多个参数,都会被MyBatis重新包装成一个Map传入。Map的key是param1,param2,或者0,1…,值就是参数的值
3). 命名参数
为参数使用@Param起一个名字,MyBatis就会将这些参数封装进map中,key就是我们自己指定的名字
4). POJO
当这些参数属于我们业务POJO时,我们直接传递POJO
5). Map
我们也可以封装多个参数为map,直接传递
6). Collection/Array
会被MyBatis封装成一个map传入, Collection对应的key是collection,Array对应的key是array. 如果确定是List集合,key还可以是list.
- 本文作者:
腾飞
- 本文链接:
https://www.tengfei.eu.org/article/f6f3f545.html
- 版权声明: 本作品采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可。转载请注明出处!