MyBatis
一、入门
1、安装
将mybatis-x.x.x.jar文件置于类路径(classpath)中或者如果项目使用maven创建,将依赖放入pom.xml即可:
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>x.x.x</version>
</dependency>
2、从XML文件构建SqlSessionFactory
每一个基于MyBatis的应用都是以SqlessionFactory
的实例对象为核心的,所以SqlessionFactory
的作用域应该是应用级
的,SqlSessionFactory
一旦被创建就应该在应用的运行期间一直存在,没有任何理由丢弃它或重新创建另一个实例。
对于请求的每一个线程,SqlessionFactory
可以生产每一个SqlSession
提供数据库操作,而SqlSesson
的实例则是线程不安全的,不能被共享,他的作用域是请求或者方法作用域,用完就必须要销毁。
回到SqlSessionFactory
的构建中,通过SqlSessionFactoryBuilder
中的build方法可以通过读取转换为InputStream
的XML配置文件从而创建SqlSessionFactory
实例对象,MyBatis
封装了一个Resources
工具类,使得从路径加载资源更加方便:
//classpath相当于类路径,在SpringBoot中就是Resource目录
String resource = "classpath:config/mybatisConfig.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
下面要了解的就是XML配置文件的内容,MyBatis用于和数据库打交道,所以配置文件中必不可少的一项就是获取数据库连接实例的数据源DataSource
,以及决定事务控制域和控制方式的事务管理TransactionManager
,下面就是XML配置文件的简单示例:
<?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>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="${driver}"/>
<property name="url" value="${url}"/>
<property name="username" value="${username}"/>
<property name="password" value="${password}"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="com/example/UserMapper.xml"/>
</mappers>
</configuration>
XML的头部声明用来验证XML文档格式的正确性,包括XML标记内部有哪些元素以及他们的值的类型。environment 标签中包含了事务管理和连接池的配置。mappers 元素则包含了一组映射器(mapper),这些映射器的 XML 映射文件包含了 SQL 代码和映射定义信息
。
3、使用java代码构建SqlSessionFactory
DataSource dataSource = BlogDataSourceFactory.getBlogDataSource();
TransactionFactory transactionFactory = new JdbcTransactionFactory();
Environment environment = new Environment("development", transactionFactory, dataSource);
Configuration configuration = new Configuration(environment);
configuration.addMapper(BlogMapper.class);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(configuration);
4、从SqlSessionFactory获取SqlSession
try (SqlSession session = sqlSessionFactory.openSession()) {
Blog blog = (Blog) session.selectOne("org.mybatis.example.BlogMapper.selectBlog", 101);
}
5、mapper.xml简单格式以及内容
<?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 namespace="org.mybatis.example.BlogMapper">
<select id="selectBlog" resultType="Blog">
select * from Blog where id = #{id}
</select>
</mapper>
命名解析规则:
为了减少输入量,MyBatis 对所有具有名称的配置元素(包括语句,结果映射,缓存等)使用了如下的命名解析规则。
- 全限定名(比如 “com.example.User)将被直接用于查找及使用。
- 短名称(比如 “selectAllUser”)如果全局唯一也可以作为一个单独的引用。 如果不唯一,有两个或两个以上的相同名称(比如 “com.sub.selectAllThings” 和 “com.bar.selectAllThings”),那么使用时就会产生“短名称不唯一”的错误,这种情况下就必须使用全限定名。
二、XML配置
1、属性(properties)
属性允许预先配置一些指定名称的值方便管理了,类似于key,value的形式:
<properties>
<property name="username" value="root"/>
<property name="password" value="root"/>
</properties>
设置好的属性可以在真个配置文件中使用:
<dataSource type="POOLED">
<property name="driver" value="${driver}"/>
<property name="url" value="${url}"/>
<property name="username" value="${username}"/>
<property name="password" value="${password}"/>
</dataSource>
也可以在代码中配置:
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(reader, props);
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(reader, environment, props);
如果属性在不止一个地方进行了配置,那么MyBatis按照下面的顺序来加载:
- 首先读取在XML中的properties元素体内指定的属性。
- 然后根据properties标签内的resource属性中指定的路径下读取属性并且覆盖之前的同名属性。
- 最后在代码中作为参数传递的属性会覆盖之前的属性
优先级:代码中的属性>>resource的属性>properties中指定的属性