1. Mybatis 简介
a. Mybatis是支持定制化sql,存储过程,以及高级映射的持久层框架。
b. Mybatis 避免了所有jdbc代码,手动设置参数以及获取结果集。
c. Mybatis可以对配置和原生Map使用简单的XML或注解,
将接口和Java的POJO(Plain Old Java Object,普通的Java对象)映射成数据库中的记录。
d. Mybatis 是一种SQL 到POJO的模型,它需要我们提供SQL,映射关系(XML或注解,目前以XML为主),
和POJO。对于sql和pojo的映射关系,它提供自动映射和驼峰映射,使开发工作大大减少。
e. MyBatis的配置文件 包括两大部分:一是基础配置文件,二是映射文件。
f. Mybatis 所需pom 依赖
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>1.3.1</version>
</dependency>
2. MyBatis 的配置
a. MyBatis 是基于SqlSessionFactory 构建的框架,SqlSessionFactory的作用是生成SqlSession接口对象,
这个接口对象是Mybatis操作的核心。
b. 在Mybatis应用的生命周期中SqlSessionFactory只是为了创建核心接口SqlSession ,
所以 在Mybatis应用生命周期中SqlSessionFactory是单例的,只存在一个对象。
c. 构建SqlSessionFactory是通过配置类Configuration完成的,因此对于mybatis-spring-boot-starter
它会给与我们在配置文件(application.properties)进行Configuration配置的相关内容。
配置内容如下图:
c1. properties:
一般采用spring的配置,而不是mybatis。
c2. setting: 它的配置将会改变mybatis的底层行为,可以配置映射规则,如自动映射和驼峰映射,
执行器类型,缓存等。具体请参考:http://www.mybatis.org/mybatis-3/zh/configuration.html#settings
c3. typeAliases(类型别名):
因为使用类全限定名会比较长,所以mybatis会对常用的类提供默认的别名。
此外还允许我们通过typeAliases配置自定义别名。
c4. typeHandlers (类型处理器) :
这是mybatis 的重要配置之一,在mybatis写入和读取数据库的过程中,
对于不同类型的数据(Java是javaType,数据库是jdbcType)进行自定义转换,
typeHandlers 一般用于枚举。
c5. objectFactory(对象工厂):
一般使用默认的DefaultObjectFactory就可以,不需任何配置。
c6. plugins(插件):
又称拦截器,通过动态代理和责任链模式完成,可以修改mybatis底层实现功能。
c7. databaseIdProvider(数据库厂商标识):
允许mybatis配置多类型数据库支持。
c8. mappers(映射器):
是mybatis最核心的组件,它提供sql和pojo映射关系,这是mybatis开发的核心。
3. 使用示例:
package com.didispace.bean;
import com.didispace.connn.SexEnum;
import lombok.Data;
import org.apache.ibatis.type.Alias;
import javax.persistence.*;
// 下面的@Getter ,@Setter 注解也可用 @Data代替,
// 使用 @Data可直接生成getter,setter
// 标明是一个实体类
// @Alias 为指定别名
@Alias(value="user")
@Data
public class User {
private Long id;
private String userName;
// 性别枚举,这里需要使用typeHandler进行转换
private SexEnum sex;
private String note;
}
package com.didispace.dao;
import com.didispace.bean.User;
import org.springframework.stereotype.Repository;
// @Repository 用来扫描加载MyBatis接口bean
// 也可使用@Mapper注解
@Repository
public interface UserDao {
// 方法名getUser 需要和 userMapper select id 一致
public User getUser(Long id);
}
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!--
mapper 元素中 namespace 属性,指定一个接口;
select 中 id 代指sql,parameterType 指参数类型,
resultType 指定返回值类型,这里使用了user这是别名(通过POJO(User.java)中@Alias(name="user) )
指定的。如果没有指定,需要用全限定名(com.didispace.bean.User)
-->
<mapper namespace="com.didispace.dao.UserDao">
<select id="getUser" parameterType="long" resultType="user">
select id, username,sex,note from t_user where id = #{id}
</select>
</mapper>
所有工程代码请参考github:https://github.com/sss996/springboot-mybatis