查看Mybatis官方文档:https://mybatis.org/mybatis-3/zh/index.html
- Mybatis是一款优秀的持久层框架,它支持自定义SQL,存储过程以及高级映射。
- Mybatis免除了几乎所有的JDBC代码以及设置参数和获取结果集的工作。
- Mybatis可以通过简单的XML或者注解来配置和映射原始类型,接口和java POJO为数据库中的记录。
Mybatis SQL 映射框架使得一个面向对象构建的应用程序去访问一个关系型数据库变得更容易。
MyBatis使用XML描述符或注解将对象与存储过程或SQL语句耦合。
接口层:SqlSession就是我们与myabtis完成交互的核心接口。
核心层:SqlSession执行的方法,底层需要经过配置文件的解析,SQL解析,请求参数映射,结果集映射的支持。
支持层:核心层的功能实现,是基于底层的各个模块,共同协同完成。
注意点:
- mapper.xml文件中的namespace属性配置一定要和Mapper(定义的Dao接口)接口的全限定名相同。
- mapper.xml文件中定义的元素statement,它们的id属性要和Mapper(定义的Dao接口)接口的方法名相同。
- Mapper(定义的Dao接口)接口方法的方法参数类型,mapper.xml中定义的元素statement的parameterType 属性中声明的类型一致。
- Mapper(定义的Dao接口)接口方法的方法返回值类型,mapper.xml中定义的元素statement的resultType 属性中声明的类型一致。
定义Mybatis配置文件org.mybatis mybatis 3.5.0
定义Mapper接口
public interface UserInfoMapper {
UserInfo findById();
}
实体类
public class UserInfo {
private String id;
private String name;
private String sex;
// getter setter toString equals hashcode
}
mapper.xml编写
测试运行select * from user_info where id = #{id}
public static void main(String[] args) throws Exception {
InputStream xml = Resources.getResourceAsStream("mybatis-config.xml");
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(xml);
SqlSession sqlSession = sqlSessionFactory.openSession();
// 获取Mapper接口的代理
UserInfoMapper mapper = sqlSession.getMapper(UserInfoMapper.class);
UserInfo userData= mapper .findById("123456");
System.out.println(userData);
}
一对一,多对一配置
如果存在关联查询,那么在mapper.xml中,可以配置
一对一
使用一对一查询时,在一个实体类中添加另一实体类属性。用resultMap实现映射关系时,使用association连接,javaType为封装的类型。
多对多
表之间的多对多关系稍微复杂,需要一个中间表来表示。
中间表有三个字段,其中两个字段分别作为外键指向各自一方的主键,由此通过中间表来表示多对多关系,通过一个表联合另一个中间表可以表示为一对多关系。
多对多,其实可以从一方到另一方表示为一对多关系,反之亦然
如:查找学生并包含职位信息
Mybatis中设置的配置文件详解
properties(属性)
settings(设置)
typeAliases(类型别名)
typeHandlers(类型处理器)
objectFactory(对象工厂)
plugins(插件)
environments(环境配置)
environment(环境变量)
transactionManager(事务管理器)
dataSource(数据源)
databaseIdProvider(数据库厂商标识)
mappers(映射器)
properties属性作用:
- 定义全局配置变量
- 加载外部化的properties配置文件
定义全局配置变量,使用 ${} 的表达式如下:
加载外部化配置文件
1.我们先把数据源连接配置到properties文件中,文件名称为jdbc.properties
jdbc.driverClassName=com.mysql.jdbc.Driver jdbc.url=jdbc:mysql://localhost:3306/mybatis?characterEncoding=utf-8 jdbc.username=root jdbc.password=123456
2.通过properties标签把上面的properties文件加载进来。
resource/url只能声明一个文件。resource 跟 url 是互斥的,二者只能取其一。那么如何声明多个文件呢?
通过xml配置的方式是无法实现的。我们可以通过定义Properties对象,加载多个配置文件。通过构造SqlSessionFactory的时候,传入Properties对象。
InputStream xml = Resources.getResourceAsStream("mybatis-config.xml");
// 使用Properties的API加载这些properties文件
Properties properties = new Properties();
properties.load(Resources.getResourceAsStream("jdbc1.properties"));
properties.load(Resources.getResourceAsStream("jdbc2.properties"));
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(xml, properties);
3.配置的优先级
总共配置的方式有三种
(1)直接在
(2)借助
(3)编程式加载外部化配置文件
按照官方的说法,优先级为:
第一:编程式加载的外部化配置文件
第二:借助
第三:在
MyBatis 中可供调整的所有内部配置项的全局设置。
typeAliases 类型别名的设置,是考虑到 mapper.xml 中我们每次写实体类的时候,都要写它们的全限定类名,太麻烦,于是 MyBatis 提供了类型别名的机制。
typeHandlers-类型处理器
typeHandlers 类型处理器,它的意义是针对一个特定的 Java 类型,或者 jdbc 类型,采用特定的处理器来处理这个类型的字段。
Java 类型和 jdbc 类型之间,用什么类型进行转换,都是这些 typeHandler 干的活。
一般情况下,我们只需要使用 MyBatis 内置的这些 typeHandler 就完全够用。
实现 TypeHandler 接口,并声明其泛型,泛型就是要处理的目标类型。
TypeHandler 接口中定义了 4 个方法。分别对应对方法参数的处理,对返回结果集的处理。
当方法传入的参数为TypeHandler接口中指定的泛型的时候,如何对PreparedStatement 操作。
当方法返回结果封装时,对于实体类中出现的指定泛型类型的属性时,应该如何从ResultSet中取到数据,并转换为指定类型。
每次查询动作中,数据库返回 ResultSet 时,MyBatis 会根据 statemet 的定义,创建对应的结果对象(跟表对应的实体类对象)。
创建结果对象的工厂,是一个叫 ObjectFactory 的家伙负责的。
默认情况下,MyBatis 内置了一个 DefaultObjectFactory 来实现结果对象的创建,而我们定义的结果对象通常都有默认的无参构造器,或者有显式定义无参构造器,这样也是方便 DefaultObjectFactory 帮我们创建结果对象。
既然 MyBatis 的全局配置文件中提供了 objectFactory 标签,就说明 MyBatis 允许我们自定义 ObjectFactory 以代替默认的 DefaultObjectFactory 。
如果要自定义对象创建工厂objectFactory,我们只需要继承DefualtObjectFactory即可。然后重写创建对象的create方法。
public class ExtendsObjectFactory extends DefaultObjectFactory {
@Override
public T create(Class type) {
T t = super.create(type);
// 判断是否为User类型,如果是,则预初始化值
if (User.class.equals(type)) {
User user = (User) t;
user.setAge(0);
}
return t;
}
}
然后注册到mybatis-config.xml配置文件中。
plugins-插件
MyBatis 的插件实际上就是拦截器,它可以拦截 MyBatis 的执行流程,并在特定的位置上提供扩展。
Mybatis提供的可扩展的位置有4个:
Executor (update, query, flushStatements, commit, rollback, getTransaction, close, isClosed)
ParameterHandler (getParameterObject, setParameters)
ResultSetHandler (handleResultSets, handleOutputParameters)
StatementHandler (prepare, parameterize, batch, update, query)
我们都知道有一个分页插件PageHelper,它就是基于Mybatis的插件机制实现的。
environments-环境环境的配置和spring中profile概念差不多。我们数据源的配置都配置在这里。
databaseIdProvider-数据库厂商标识databaseIdProvider 数据库厂商标识,它为我们提供了数据库可移植性的支持。
我们在编写 mapper.xml 时,针对不同的 statement ,声明不同的数据库厂商标识,MyBatis 即会动态的根据数据库厂商标识,使用不同的 statement ,从而达到不同的数据库发送不同 SQL 的效果。
在mapper.xml中进行引用 mappers-映射器
配置 mapper.xml 都在这里面写。
三种方式:
1.通过resource指定加载的mapper.xml。
2.通过class指定加载的mapper.xml。
3.通过package指定扫描mapper.xml的路径。



