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>
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()); }
public class User { private Integer id; private String username; private String password;
<?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>
<!-- mybatis-config.xml --> <mappers> <mapper resource="com/partner4java/demo2/User.xml"/> </mappers>
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各配置。