最近要学习使用MyBatis,参照网上的资料和官方的教程,根据自己的理解,记录一下。
MyBatisJar包下载地址:http://download.youkuaiyun.com/detail/jolingogo/5220163
官方教程:http://mybatis.github.com/mybatis-3/zh/index.htm
一.什么是MyBatis
MyBatis 是支持普通 SQL 查询,存储过程和高级映射的优秀持久层框架。MyBatis 消除 了几乎所有的 JDBC 代码和参数的手工设置以及结果集的检索。MyBatis 使用简单的 XML 或注解用于配置和原始映射,将接口和 Java 的 POJOs(Plan Old Java Objects,普通的 Java 对象)映射成数据库中的记录。
以前学习过Hibernate,在网上查了一下,说MyBatis是半自动化的,需要自己写SQL语句,这样就可以根据需要自己优化SQL了。
Hibernate可以根据配置文件或者注解自动生成表,省去了自己写建表语句,在网上找了一下,MyBatis好像不可以。Google提供了generator,可以根据表结构生成实体类和映射文件,试了一下,还不错,以后会写一下。
二.配置文件
这些框架什么的,基本上都需要配置文件。MyBatis的XML 配置文件包含对 MyBatis 系统的核心设置,包含获取数据库连接实例的数据源和 决定事务范围和控制的事务管理器。
mybatis-config.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>
-
- <properties resource="config.properties"></properties>
-
-
- <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>
- </mappers>
-
- </configuration>
config.properties

三.从 XML 中构建 SqlSessionFactory
每 一 个 MyBatis 的 应 用 程 序 都 以 一 个 SqlSessionFactory 对 象 的 实 例 为 核 心 。 SqlSessionFactory 对 象 的 实 例 可 以 通 过 SqlSessionFactoryBuilder 对 象 来 获 得 。 SqlSessionFactoryBuilder 对象可以从 XML 配置文件,或从 Configuration 类的习惯准备的实 例中构建 SqlSessionFactory 对象。
这里的SqlSessionFactory和Hibernate中的SessionFactory是一样的,我们可以通过factory,获取session。
- package org.ygy.util;
-
- import java.io.IOException;
- import java.io.InputStream;
-
- import org.apache.ibatis.io.Resources;
- import org.apache.ibatis.session.SqlSession;
- import org.apache.ibatis.session.SqlSessionFactory;
- import org.apache.ibatis.session.SqlSessionFactoryBuilder;
-
-
-
-
-
-
- public class MyBatisUtil {
- private static SqlSessionFactory sqlSessionFactory = null;
-
-
-
-
-
- private static void initialFactory() throws IOException {
- String resource = "mybatis-config.xml";
- InputStream inputStream = Resources.getResourceAsStream(resource);
- sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
- }
-
-
-
-
-
- public static SqlSession getSession() {
- if(sqlSessionFactory == null) {
- try {
- initialFactory();
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
-
- return sqlSessionFactory.openSession();
- }
-
-
- }
接下来,我们测试一下,看看配置是否正确:
- package org.ygy.model;
-
- import static org.junit.Assert.*;
-
- import org.apache.ibatis.session.SqlSession;
- import org.junit.Test;
- import org.ygy.util.MyBatisUtil;
-
- public class ModelTest {
-
- @Test
- public void testGetSession() {
- SqlSession session = MyBatisUtil.getSession();
-
- assertNotNull(session);
-
- if(session != null) {
- session.close();
- session = null;
- }
- }
- }
貌似,想当然的悲剧了,这样测试好像不行,刚才忘记添加数据库驱动了,结果运行一样成功了,如果不执行SQL语句的话,MyBatis好像不会去连接数据库,测试还是等一下吧
。
既然这样的话,我们就先写一个映射文件。
首先,我们要建一张表,就来一个用户表吧(t_user),我用的SqlServer,语句就省略了吧
然后,和表对应的实体类:
- package org.ygy.model;
-
-
-
-
-
-
- public class User {
- private Integer id;
- private String name;
- private String password;
- private String email;
- private Integer age;
- private Integer gender;
-
- public Integer getId() {
- return id;
- }
-
- public void setId(Integer id) {
- this.id = id;
- }
-
- public String getName() {
- return name;
- }
-
- public void setName(String name) {
- this.name = name;
- }
-
- public String getPassword() {
- return password;
- }
-
- public void setPassword(String password) {
- this.password = password;
- }
-
- public String getEmail() {
- return email;
- }
-
- public void setEmail(String email) {
- this.email = email;
- }
-
- public Integer getAge() {
- return age;
- }
-
- public void setAge(Integer age) {
- this.age = age;
- }
-
- public Integer getGender() {
- return gender;
- }
-
- public void setGender(Integer gender) {
- this.gender = gender;
- }
-
- @Override
- public String toString() {
- return "User [id=" + id + ", name=" + name + ", password=" + password
- + ", email=" + email + ", age=" + age + ", gender=" + gender
- + "]";
- }
-
- }
接下来,是映射文件:UserMapper.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.ygy.mapper.UserMapper">
-
- <insert id="insert" parameterType="org.ygy.model.User" useGeneratedKeys="true">
- insert into t_user(name , password , email , gender , age)
- values(#{name} , #{password} , #{email} , #{gender} , #{age})
- </insert>
-
- <select id="selectUser" resultType="org.ygy.model.User">
- select * from t_user
- </select>
-
- </mapper>
最后,在mybatis-config.xml配置文件中添加映射文件:
-
- <mappers>
- <mapper resource="org/ygy/mapper/UserMapper.xml"/>
- </mappers>
好了,这下,我们可以测试了:
- package org.ygy.model;
-
- import static org.junit.Assert.assertEquals;
- import static org.junit.Assert.assertNotNull;
-
- import java.util.List;
-
- import org.apache.ibatis.session.SqlSession;
- import org.junit.After;
- import org.junit.Before;
- import org.junit.Test;
- import org.ygy.util.MyBatisUtil;
-
- public class ModelTest {
- private SqlSession session = null;
-
- @Before
- public void before() {
- session = MyBatisUtil.getSession();
- }
-
- @After
- public void after() {
- session.commit();
- session.close();
- }
-
- @Test
- public void testGetSession() {
- assertNotNull(session);
-
- if(session != null) {
- session.close();
- session = null;
- }
- }
-
- @Test
- public void testSelectUser() {
- List<User> userList = session.selectList("org.ygy.mapper.UserMapper.selectUser");
-
- for(User each : userList) {
- System.out.println("each->" + each);
- }
-
- }
-
- @Test
- public void testInsert() {
- User user = new User();
- user.setName("路飞");
- user.setPassword("lufei");
- user.setEmail("lufei@op.com");
- user.setAge(23);
- user.setGender(0);
-
- int result = session.insert("org.ygy.mapper.UserMapper.insert" , user);
- assertEquals(1 , result);
- }
- }
,这样,一个入门的示例,就差不多了。
拓展:
1.别名
在mybatis-config.xml中可以配置别名 (typeAliases)
类型别名是为 Java 类型命名一个短的名字。它只和 XML 配置有关,只用来减少类完全限定名的多余部分。
看看上面UserMapper.xml中

只要在mybatis-config.xml中添加
-
- <typeAliases>
- <typeAlias type="org.ygy.model.User" alias="User"/>
- </typeAliases>
就可以了。