1 简介
1.1 什么是MyBatis
MyBatis是一款优秀的持久层框架
它支持定制化SQL、存储过程以及高级映射
MyBatis避免了几乎所有的JDBC代码和手动设置参数以及获取届国际
MyBatis可以使用简单的XML或注解来配置和映射原声类型、借口和Java的POJO为数据库中的记录
MyBatis本是apache的一个开源项目iBatis,最后移植到了google code, 并改名为MyBatis
maven仓库
1
2
3
4
5
6<!-- https://mvnrepository.com/artifact/org.mybatis/mybatis -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.6</version>
</dependency>
1.2 持久化
数据持久化
持久化就是将程序的数据在持久状态和瞬时状态转化的过程
内存:断电即失
数据库(jdbc)、io文件持久化
为什么需要持久化?
- 有一些对象,不能让其丢失
- 内存太贵
1.3 持久层
Dao层、Service层、Controller层……
- 完成持久化工作的代码块
- 层界限明显
1.4 为什么需要MyBatis?
- 简单易学
- 灵活
- sql和代码的分离,提高了可维护性
- 提供映射标签,支持对象与数据库的orm子段关系映射
- 提供对象关系映射标签,支持对象关系组建维护
- 提供xml标签,支持编写动态sql
2 第一个MyBatis程序
2.1 搭建环境
创建数据库
1 | CREATE DATABASE `mybatis`; |
新建项目:
新建一个普通的maven项目
倒入maven依赖
2.2 创建模块
- 编写mybatis核心配置
3 CRUD
3.1 namespace
namespace中的包名要和接口中的包名一致
3.2 select
- id: 就是对应的namespace中的方法名
- resultType: sql语句执行的返回值
- parameterType:参数类型
编写接口
1
2//get user by id
User getUserById(int id);编写对应mapper中的sql语句
1
2
3<select id="getUserById" parameterType="int" resultType="com.promethuesYuan.pojo.User">
select * from user where id = #{id}
</select>测试
1
2
3
4
5
6
7
8
9
10
public void getUserByIdTest(){
try (SqlSession sqlSession = MyBatisUtils.getSqlSession()){
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
User userById = userMapper.getUserById(4);
System.out.println(userById);
}
}
3.3 insert
1 | <insert id="addUser" parameterType="com.promethuesYuan.pojo.User"> |
3.4 update
1 | <insert id="updateUser" parameterType="com.promethuesYuan.pojo.User"> |
3.5 delete
1 | <delete id="deleteUser" parameterType="com.promethuesYuan.pojo.User"> |
⚠️:增删改需要提交事物
3.6 万能的map
假设,我们的实体类或者数据库中的表,字段或者参数过多,我们应当考虑使用map!
1 | //insert one user vid map |
1 | <insert id="addUserByMap" parameterType="map"> |
1 | public void addUserByMapTest(){ |
map传递参数,直接在sql中取出key即可
多个参数用map,或者注解
4 配置解析
4.1 核心配置文件
Mybatis-config.xml
1
2
3
4
5
6
7
8
9
10
11
12properties(属性)
settings(设置)
typeAliases(类型别名)
typeHandlers(类型处理器)
objectFactory(对象工厂)
plugins(插件)
environments(环境配置)
environment(环境变量)
transactionManager(事务管理器)
dataSource(数据源)
databaseIdProvider(数据库厂商标识)
mappers(映射器)
4.2 环境配置(environments)
MyBatis 可以配置成适应多种环境,。
不过要记住:尽管可以配置多个环境,但每个 SqlSessionFactory 实例只能选择一种环境。
MyBatis默认的事务管理器就是JDBC, 连接池:POOLED
4.3 属性(properties)
可以通过properties属性来实现引用配置文件
这些属性可以在外部进行配置,并可以进行动态替换。你既可以在典型的 Java 属性文件中配置这些属性,也可以在 properties 元素的子元素中设置。
编写一个配置文件
1 | driver=com.mysql.jdbc.Driver |
核心配置文件中引入
1 | <properties resource="db.properties"></properties> |
- 可以直接引入外部文件
- 可以在其中增加一些属性
- 如果两个文件中有同名属性,优先使用外部配置文件的
4.4 类型别名(typeAliases)
类型别名可为 Java 类型设置一个缩写名字,意在降低冗余的全限定类名书写
1 | <typeAliases> |
也可以指定一个包名,mybatis会在该包下搜索需要的java bean。扫描实体类的包,他的默认别名为该类类名首字母小写
1 | <typeAliases> |
如果实体类比较少,使用第一种。十分多时,建议使用第二种。如果需要改,可以在实体类上加注释
1 | "hello") ( |
4.5 设置(settings)
这是 MyBatis 中极为重要的调整设置,它们会改变 MyBatis 的运行时行为。
4.6 映射器(mappers)
注册绑定我们的mapper文件
1 | <!-- 使用相对于类路径的资源引用 --> |
1 | <!-- 使用映射器接口实现类的完全限定类名 --> |
1 | <!-- 将包内的映射器接口实现全部注册为映射器 --> |
后面两种方法的注意点:
接口和他的mapper文件必须同名
接口和他的mapper文件必须在同一个包下
4.7 作用域(Scope)和生命周期
作用域和生命周期类别是至关重要的,因为错误的使用会导致非常严重的并发问题。
SqlSessionFactoryBuilder:
- 一旦创建了SqlSessionFactory,就不再需要他了
- 局部变量
SqlSessionFactory:
- 说白了就是可以想象为:数据库连接池
- 一旦被创建就应该在应用的运行期间一直存在,没有任何理由丢弃它或重新创建另一个实例
- 因此SqlSessionFactory的最佳作用域是应用作用域
- 最简单的就是使用单例模式或者静态单例模式
SqlSession:
- 连接到数据库连接池的一个请求
- SqlSession 的实例不是线程安全的,因此是不能被共享的,所以它的最佳的作用域是请求或方法作用域。
- 用完之后需要赶紧关闭
每一个Mapper,就代表一个具体的业务
5 解决属性名和字段名不一致的问题
解决方法:
- 起别名
结果集映射
resultMap
元素是 MyBatis 中最重要最强大的元素。ResultMap 的设计思想是,对简单的语句做到零配置,对于复杂一点的语句,只需要描述语句之间的关系就行了。
1 | <resultMap id="userResultMap" type="User"> |
然后在引用它的语句中设置 resultMap
属性就行了(注意我们去掉了 resultType
属性)。比如:
1 | <select id="selectUsers" resultMap="userResultMap"> |
6 日志
6.1 日志工厂
如果一个数据库操作出现了异常,我们需要排错。日志就是最好的助手
设置名 | 描述 | 有效值 | 默认值 |
---|---|---|---|
logImpl | 指定 MyBatis 所用日志的具体实现,未指定时将自动查找。 | SLF4J | LOG4J | LOG4J2 | JDK_LOGGING | COMMONS_LOGGING | STDOUT_LOGGING | NO_LOGGING | 未设置 |
具体设置:
1 | <settings> |
6.2 Log4j
什么事log4j:
- Log4j是Apache的一个开源项目,通过使用Log4j,我们可以控制日志信息输送的目的地是控制台、文件、GUI组件,甚至是套接口服务器
- 我们也可以控制每一条日志的输出格式
- 通过定义每一条日志信息的级别,我们能够更加细致地控制日志的生成过程
- 通过一个配置文件来灵活地进行配置,而不需要修改应用的代码。
倒入包
1
2
3
4
5<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>log4j配置文件
Mybatis-config中配置使用
1
2
3<settings>
<setting name="logImpl" value="LOG4J"/>
</settings>程序中使用log4j输出
测试,查看日志文件
7 分页实现
原始方法:使用limit进行分页
8 注解开发
8.1 面向接口编程
8.2 使用注解
9 Lombok
Project Lombok is a java library that automatically plugs into your editor and build tools, spicing up your java.
Never write another getter or equals method again, with one annotation your class has a fully featured builder, Automate your logging variables, and much more.
使用方法:
idea中安装lombok插件
倒入maven仓库
在实体类上加注解
1 | @Getter and @Setter |
说明:
1 | @Data: 无参构造器,getter, setter, tostring, hashcode, equals |