What is MyBatis?
MyBatis是一个一流的支持自定义SQL,存储过程和高级映射的持久化框架。
MyBatis隐藏了几乎所有的JDBC代码、参数的手动设置和结果检索。
它通过简单的XML或注解来实现映射器层,所谓映射器层,是用于在对象和数据库之间搬运数据,同时保证对象、数据库以及映射器本身都相互独立。
(MyBatis 本是apache的一个开源项目 iBatis , 2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBatis)
MyBatis与ORM的不同?
我们已经有了Hibernate,还有JPA这种标准规范,为什么还需要MyBatis?
MyBatis与O/RM不同:他不是直接把类映射为数据库表或者说把类的字段映射为数据库列,而是“把SQL语句的参数和结果映射为类”。
使用SQL进行管理的好处:
1、易用性 -- 我们很多程序员是善于写SQL的,但是,他们在学习Hibernate这种存持久框架的时候感到有些困难,因为Hibernate真实用起来并不是传说中那么简单。MyBatis是一种混合型的持久层解决方案,这个持久层框架广泛使用了SQL,他使得SQL更容易使用、更容易集成到现代的面向对象软件中。
2、灵活性 -- MyBatis在数据库和类之间建立了一个额外的间接层,这就为在类和数据库直接建立映射关系带来了更大的灵活性,使得不用改变数据库模型或者对象模型的情况下改变他们的映射关系成为可能。(这里的间接层就是SQL)
3、增强部门间沟通 -- 经常数据库的管理权限不属于自己部门的,使用MyBatis可以让SQL彻底暴漏出来,增强和DBA的沟通。
何时不该使用MyBatis?
当你的团队大多都对Hibernate比较熟悉,且能很好的应用Hibernate达到项目的性能要求。因为毕竟Hibernate更节省代码量。
(个人推荐,如果没有特殊需求,还是用Hibernate)
helloworld
(iBatis更名为MyBatis后,从主要变化可以看出正向Hibernate靠拢)
(导读,具体配置含义,我们下一章有详细解释,这里,你要保证的是,你大体能看懂它们的含义)
第一步:获取Connection HelloWorld
MyBatis和Hibernate一样也有一个SessionFactory,全名为:SqlSessionFactory。
SqlSessionFactory通过SqlSessionFactoryBuilder创建,但是SqlSessionFactoryBuilder需要传入一个XML文件,也就是我们MyBatis的主文件(类似于Hibernate的hibernate.cfg.xml,我们这里起名为mybatis-config.xml)。
1、mybatis-config.xml
这个XML配置文件包含MyBatis的核心设置,包括一个数据库配置标签dataSource,事务管理方式相关transactionManager。
具体配置含义,我们后面有具体解释,先看一个简单的配置:
- <?xml version="1.0" encoding="UTF-8" ?>
- <!--iBatis 和 MyBatis 的全局配置文件使用不同的 DTD 约束,在将应用由 iBatis 升级至 MyBatis 时需要注意(两者的映射文件
- DTD 约束也不相同) -->
- <!DOCTYPE configuration
- PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
- "http://mybatis.org/dtd/mybatis-3-config.dtd">
- <!-- 这是根标签 -->
- <configuration>
- <!-- 元素允许在主配置文件之外提供一个properties格式对应文件,从而使得主配置文件更加通用。这样对部署非常有用 -->
- <properties resource="mysql.properties" />
- <!-- 配置数据源相关的信息 -->
- <environments default="demo">
- <environment id="demo">
- <transactionManager type="JDBC" />
- <dataSource type="POOLED">
- <property value="${driver}" name="driver" />
- <property value="${url}" name="url" />
- <property value="${username}" name="username" />
- <property value="${password}" name="password" />
- </dataSource>
- </environment>
- </environments>
- </configuration>
2、对配置文件测试下
- public static void main(String[] args) throws IOException {
- //获取配置文件的输入流
- InputStream is = Resources.getResourceAsStream("mybatis-config.xml");
- //获取我们的SqlSessionFactory(相当于Hibernate的SessionFactory);SqlSessionFactoryBuilder有点类似于Hibernate的Configuration。
- SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);
- //获取一个Session
- System.out.println(sqlSessionFactory.openSession().getConnection());
- }
打印了一个Connection,证明已经连接成功
(现在自己动手实现一下)
我们获取到了连接,总要做些什么吧?
第二步:执行查询,获取返回结果HelloWorld
session的具体操作也和Hibernate很类似,不同的是,我们前面概念中提到的:MyBatis与O/RM不同,他不是直接把类映射为数据库表或者说把类的字段映射为数据库列,而是“把SQL语句的参数和结果映射为类”。
那么我们可以推测到,MyBatis无非就是需要我们做两点:1、配置我们要执行的SQL;2、配置输入参数和返回结果的相对于SQL的映射关系。
我们先学习一下第一点,因为第二点MyBatis大部分情况下会自动帮我买完成(在后面章节会介绍第二点):
两种配置方式:XML、注解;
1、XML
我们以前学Hibernate的时候,常用的做法是把每一张表和对应Entity的对应放入单独的XML中,而MyBatis是把一组相关SQL查询放入一个XML中。
示例:
我们查询出User表的所有数据,并打印所有获取结果。
主要分为四小步完成:
1:我们创建了接收返回结果的POJO(注意这里POJO字段的名字和数据库字段名字相同)
- public class User {
- private Integer id;
- private String username;
- private String password;
2:创建包含SQL的XML
/mybatis_hello/src/main/java/com/partner4java/demo2/User.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为我们的根元素 -->
- <mapper namespace="user">
- <!-- 查询的元素为select,没什么好说的,先记住;id为我们后面需要用到的。resultType为我们的返回Java类型 -->
- <select id="selectUser" resultType="com.partner4java.demo2.User">
- select * from user
- </select>
- </mapper>
3:把XML交给mybatis-config.xml
用到了mappers,和我们Hibernate里的命名规则一样
- <!-- mybatis-config.xml -->
- <mappers>
- <mapper resource="com/partner4java/demo2/User.xml"/>
- </mappers>
4:测试
- public static void main(String[] args) throws IOException {
- InputStream is = Resources.getResourceAsStream("mybatis-config4.xml");
- SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);
- SqlSession session = sqlSessionFactory.openSession();
- //虽然我们没有指定SQL返回结果列和POJO列的映射关系,但是它会自动把返回数据给我们塞进POJO,很容易想到是因为名字相同。
- List<User> users = session.selectList("user.selectUser");
- for(User user:users){
- System.out.println(user);
- }
- }
(当然我们还应该关闭各种资源,这里我们只是最初步的展示,后面会一一道来)
不管你信不信,MyBatis就是如此简单。