1. mybatis安装
maven路径
org.mybatis
mybatis
x.x.x
2. mybatis基础
SqlSessionFactory配置
mybatis应用的核心为一个SqlSessionFactory
实例。而SqlSessionFactory
又是由SqlSessionFactoryBuilder
对象依据 mybatis-config.xml的配置生成的。
String resource = "org/mybatis/example/mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
mybatis-config.xml
当然你也可以用java代码来替代xml文件实现配置,在这就不赘述了,详见官方文档
Mapper配置
在这之后你就可以调用SqlSession.openSession()
方法来获得SqlSession
对象来操作数据库。鉴于mybatis框架最核心的作用,分离SQL语句和java代码。你还需要一个实际的Mapper接口的和一个对应的mapper.xml文件来实现一个dao对象。
public interface DemoMapper() {
List getDemo(Integer id);
}
上述两段代码就是一组最基本的映射。注意不要忘记在mybatis-config.xml中使用SqlSession
实例对数据库进行操作了。
需要注意的时SqlSesion时线程不安全的所以在每个方法结束前都要对它进行关闭。所以推荐使用下述代码来确保其标准关闭。
try(SqlSession sesssion = SqlSessionFactory.openSession()) {
DemoMapper mapper = session.getMapper(DemoMapper.Class);
//TODO
}
生命周期问题
- SqlSessionFactoryBuilder
这个类可以被实例化、使用和丢弃,一旦创建了 SqlSessionFactory,就不再需要它了。 因此SqlSessionFactoryBuilder实例的最佳作用域是方法作用域(也就是局部方法变量)。 你可以重用 SqlSessionFactoryBuilder来创建多个SqlSessionFactory实例,但最好还是不要一直保留着它,以保证所有的 XML 解析资源可以被释放给更重要的事情
- SqlSessionFactory
SqlSessionFactory一旦被创建就应该在应用的运行期间一直存在,没有任何理由丢弃它或重新创建另一个实例。使用SqlSessionFactory的最佳实践是在应用运行期间不要重复创建多次,多次重建 SqlSessionFactory 被视为一种代码“坏习惯”。因此 SqlSessionFactory 的最佳作用域是应用作用域。有很多方法可以做到,最简单的就是使用单例模式或者静态单例模式。
- SqlSession
每个线程都应该有它自己的 SqlSession 实例。SqlSession的实例不是线程安全的,因此是不能被共享的,所以它的最佳的作用域是请求或方法作用域。 绝对不能将 SqlSession 实例的引用放在一个类的静态域,甚至一个类的实例变量也不行。 也绝不能将 SqlSession 实例的引用放在任何类型的托管作用域中,比如 Servlet 框架中的 HttpSession。 如果你现在正在使用一种 Web 框架,考虑将 SqlSession 放在一个和 HTTP 请求相似的作用域中。 换句话说,每次收到 HTTP 请求,就可以打开一个 SqlSession,返回一个响应后,就关闭它。这个关闭操作很重要,为了确保每次都能执行关闭操作,应该把这个关闭操作放到 finally 块中。
3. mybatis配置
注意:所有的xml配置都有固定的先后顺序
属性(properties)
这些属性可以在外部进行配置,并可以进行动态替换。你既可以在典型的 Java 属性文件中配置这些属性,也可以在 properties 元素的子元素中设置。例如:
需要注意如果config.perproties中的属性与
设置好的值可以在整个配置文件中以${name}的方式进行取用。详见官方文档
设置(settings)
设置标签是MyBatis 中极为重要的调整设置,它们会改变 MyBatis 的运行时行为。
常见设置有
设置名 | 作用 |
---|---|
cacheEnabled | 全局性地开启或关闭所有映射器配置文件中已配置的任何缓存。 |
lazyLoadingEnabledd | 延迟加载的全局开关。当开启时,所有关联对象都会延迟加载。 特定关联关系中可通过设置 fetchType 属性来覆盖该项的开关状态。 |
mapUnderscoreToCamelCase | 是否开启驼峰命名自动映射,即从经典数据库列名 A_COLUMN 映射到经典 Java 属性名 aColumn。 |
详见官方文档
类型别名(typeAliases)
类型别名用于java类的简写有三种定义方式
- 单独指定
- 报名扫描方式
这种方式将会把类型的小写作为该类别名进行配置。比如domain.blog.Author
在此方式下的别名为author
3.使用注解
注意该方式要以第二种方式为基础!
@Alias("author")
public class Author {
...
}
- java类的内建别名
java基本类型的别名为_classname
如_int
,其他类的别名为其类型小写如string
。
环境(environments)
MyBatis 可以配置成适应多种环境,这种机制有助于将 SQL 映射应用于多种数据库之中, 现实情况下有多种理由需要这么做。例如,开发、测试和生产环境需要有不同的配置;或者想在具有相同 Schema 的多个生产数据库中使用相同的 SQL 映射。还有许多类似的使用场景。
不过要记住:尽管可以配置多个环境,但每个 SqlSessionFactory 实例只能选择一种环境。每个数据库对应一个 SqlSessionFactory 实例
可以通过修改default属性值来修改默认环境,也可以在创建SqlSessionFactory
通过参数指定
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputstream, environment);
数据源(dataSource)
dataSource 元素使用标准的 JDBC 数据源接口来配置 JDBC 连接对象的资源。
- 大多数 MyBatis 应用程序会按示例中的例子来配置数据源。虽然数据源配置是可选的,但如果要启用延迟加载特性,就必须配置数据源。
有三种内建的数据源类型(也就是 type="[UNPOOLED|POOLED|JNDI]")
映射器(mappers)
即对mapper.xml资源的定位,有四种方式。
1. 使用相对于类路径的资源引用
相对比较稳妥,适用于mapper数量少的时候
2. 使用映射器接口实现类的完全限定类名
- 注意一定要将mapper.xml文件和接口放在同一个包下!
- 接口名要与.xml文件名要一一对应保持一致!
3. 将包内的映射器接口实现全部注册为映射器
适用于大量mapper的情况,同样要将mapper.xml文件和接口放在同一个包下!
4. 使用完全限定资源定位符(URL)
不推荐使用
官方文档地址
mybatis – MyBatis 3