说道的JavaWeb,很多人都知道SSH,这里的^ h代表了冬眠,这是一个数据库访问框架,休眠在的Java开发中的地位也是相当高,众所周知的JPA标准就是由休眠主导完成的。然而,数据库访问框架除了休眠之外,还有另外一个大名鼎鼎的数据库框架,那就是MyBatis的设计时,MyBatis的前身ibatis则早在2001年就发布了,那么这里我不想过多的去比较这两个东西孰优孰劣,因为当你真正了解了这两个框架之后自然就知道在什​​么情况下该用什么框架.OK,废话不多说,那么今天我们就来看看mybatis的基本使用吧 
。mybatis在使用的过程中,我们可以通过XML的方式来构建,也可以通过Java代码来构建,本文我先用Java代码来创建,下一篇博客我们再来介绍如何用XML来构建 
。OK,那么在开始写代码之前,我们还是有必要先来了解下的MyBatis中几个基本的组件:

1.SqlSessionFactoryBuilder:这是一个SqlSessionFactory的构造器,它根据我们的xml配置文件或者Java代码来生成SqlSessionFactory。2.SqlSessionFactory 
:这个有点类似于我们在JDBC中使用的Connection,我们到时候要根据SqlSessionFactory来生成是一个会话,也就是SqlSession。3.SqlSession 
:它可以发送一条SQL语句去执行,并返回结果,从这个角度来说,它有点类似于PrepareStatement,当然,我们也可以利用SqlSession获取Mapper的接口,这个算法是SqlSession的一个核心用法了 
。4.Mapper:Mapper也可以发送一条SQL语句并返回执行结果,Mapper由两部分组成,一部分是Java接口,另一部分是XML配置文件或者注解。

OK,以上四点就是MyBatis的中非常基础的四个组件,我们后面的代码都将围绕这四个类来展开。


创建项目并搭建环境

这里我们先不创建网络工程,就以普通的Java的工程为例,首先在的IntelliJ中创建一个Java的工程,然后在工程的根目录下创建的lib文件夹。由于现在的MyBatis托管在GitHub上上,所以我们可以直接在GitHub上下载mybatis(点我下载),下载好之后,解压,如图: 
 
mybatis-3.4.2.jar这个是mybatis的包,lib文件夹中是mybatis的依赖包,将这些jar包全部拷贝到我们的项目的lib文件夹中。另外,由于我这里使用的是mysql数据库,所以还要要mysql的驱动jar包(点我下载),同时我使用了单元测试,所以还需要两个单元测试相关的罐包(点我下载).OK,搞完这些之后,我们的MyBatis的环境就算搭建好了,刚开始写这样搞吧,下篇博客我再来介绍通过Maven的快速导入依赖。将所有的罐包都加进来之后,我们的项目是这个样子: 

创建数据库并预设数据

涉及到数据库的操作,我先创建一个名为的MyBatis的数据库,然后在数据库中创建名为用户的数据表,再向表中添加四条数据,结果如下: 
创建数据库: 
 
创建用户表: 
 
插入数据之后结果如下: 

创建配置类并获取了SqlSessionFactory

这里我们使用的Java代码来创建配置类,一般情况下一个数据库只需要有一个SqlSessionFactory的实例,过多的SqlSessionFactory中会导致数据库有过多的连接,从而消耗过多的数据库资源,因此SqlSessionFactory中需要我们将之做成一个单例模式,如下:

public class DBUtils {

    private static SqlSessionFactory sqlSessionFactory = null;
    private static final Class CLASS_LOCK = DBUtils.class;

    public static SqlSessionFactory initSqlSessionFactory() {
        synchronized (CLASS_LOCK) {
            if (sqlSessionFactory == null) {
                PooledDataSource dataSource = new PooledDataSource();
                dataSource.setDriver("com.mysql.jdbc.Driver");
                dataSource.setUrl("jdbc:mysql://localhost:3306/mybatis");
                dataSource.setUsername("root");
                dataSource.setPassword("sang");
                TransactionFactory transactionFactory = new JdbcTransactionFactory();
                Environment environment = new Environment("development", transactionFactory, dataSource);
                Configuration configuration = new Configuration(environment);
                configuration.addMapper(UserMapper.class);
                sqlSessionFactory = new SqlSessionFactoryBuilder().build(configuration);
            }
        }
        return sqlSessionFactory;
    }

    public static SqlSession openSqlSession() {
        if(sqlSessionFactory==null)
            initSqlSessionFactory();
        return sqlSessionFactory.openSession();
    }
}
  • 1
  • 2
  • 3
  • 4
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29

OK,关于这个工具类我说如下几点:

1.首先该类一共两个工具方法,一个用于获取SqlSessionFactory,另一个用于获取SqlSession 
2.获取SqlSessionFactory的使用我们采用了单例模式,这是常见的单例写法,不用多说 
3.在获取SqlSessionFactory的方法中,我们通过PooledDataSource对象的实例来设置数据库驱动,数据库连接地址,数据库用户名和密码等
。4 第15行的代码我们创建了数据库的运行环境,并将这个环境命名为开发 
5第17行代码添加了一个映射器,这个映射器就是我们前文说的Mapper,用来执行一个SQL语句
。6 有了SqlSessionFactory之后接下来在27行我们就可以通过SqlSessionFactory来构造一个SqlSession了。

构建映射器

映射器可以通过Java的接口+ XML文件来构成,也可以通过Java的接口+注解来构成,我这里先以Java的接口+注解为例来说明,代码如下:

public interface UserMapper {
    @Select(value = "select * from user where id=#{id}")
    public User getUser(Long id);
}
  • 1
  • 2
  • 3
  • 4

当我调用getUser方法时实际上就执行了@Select注解中的SQL语句,在执行SQL语句的时候会将getUser方法的参数id传入SQL语句中。当然这里还需要一个User对象,如下:

public class User {
    private Long id;
    private String username;
    private String password;
    private String address;

    //省略getter/setter
}
  • 1
  • 2
  • 3
  • 4
  • 6
  • 7
  • 8

OK,做完这些之后我们就可以来测试了。

测试

创建两个测试方法,如下:

@org.junit.Test
    public void test2() {
        SqlSession sqlSession = null;
        try {
            sqlSession = DBUtils.openSqlSession();
            UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
            User user = userMapper.getUser(3l);
            System.out.println(user.toString());
            sqlSession.commit();
        } catch (Exception e) {
            e.printStackTrace();
            sqlSession.rollback();
        } finally {
            if (sqlSession != null) {
                sqlSession.close();
            }
        }
    }

    @org.junit.Test
    public void test3() {
        SqlSession sqlSession = null;
        try {
            sqlSession = DBUtils.openSqlSession();
            User user = (User) sqlSession.selectOne("org.sang.db.UserMapper.getUser", 1l);
            System.out.println(user.toString());
            sqlSession.commit();
        } catch (Exception e) {
            e.printStackTrace();
            sqlSession.rollback();
        } finally {
            if (sqlSession != null) {
                sqlSession.close();
            }
        }
    }
  • 1
  • 2
  • 3
  • 4
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 三十
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36

在test2的方法中,我们先获取一个SqlSession的,然后通过SqlSession的获取我们刚刚创建的映射对象,调用映射器中的方法就可以执行查询操作,test2的执行结果如下: 

在MyBatis的的中我们也可以不去获取映射对象,直接去调用方法,这个就如TEST3的写法。如果在映射器中就只有这一个方法叫的的getUser,我们也可以不用写的这么冗长,可以像下面这样简写:

    @org.junit.Test
    public void test4() {
        SqlSession sqlSession = null;
        try {
            sqlSession = DBUtils.openSqlSession();
            User user = (User) sqlSession.selectOne("getUser", 1l);
            System.out.println(user.toString());
            sqlSession.commit();
        } catch (Exception e) {
            e.printStackTrace();
            sqlSession.rollback();
        } finally {
            if (sqlSession != null) {
                sqlSession.close();
            }
        }
    }
  • 1
  • 2
  • 3
  • 4
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

执行结果如下: 
 
OK,以上就是mybatis的一个简单应用,这里我们主要说了使用Java代码和注解来代替XML配置文件,下一篇博客和小伙伴们聊聊一种更常用的方法就是XML配置。

本文案例下载: 
本文GitHub地址https://github.com/lenve/JavaEETest/tree/master/Test27-mybatis2

以上。

参考资料: 
1. http://www.mybatis.org/mybatis-3/zh/index.html 

2.“深入浅出MyBatis的技术原理与实战”第二章




 上面我们介绍通过的的Java代码来创建的的MyBatis的配置文件,港真,这种方式看起来有意思实际在开发中用的并不多,MyBatis的的的配置还是以XML配置为主,本文我们就来看看如何通过XML文件来配置MyBatis的。关于MyBatis的一些的知识基础小伙伴们可以参考 这篇博客初识MyBatis的。另外,上篇博客中,小伙伴们也看到了通过添加JAR包的方式来搭建MyBatis的环境太过于麻烦,因此,本文我们还是回归到Maven的的上吧.OK,废话不多说,开始今天的编码之旅吧。

创建项目并添加的Maven的支持

我这里以IntelliJ为例来说明如何创建,先创建一个普通的java工程,创建成功之后,选中工程右键单击,选择Add Framework Support,然后选择Maven,点击OK就可以了。添加Maven支持src目录下多了几个文件夹,同时也多了一个pom.xml中的文件,如下: 
 
然后在pom.xml中的文件中添加相关依赖,我们这里一共添加三个,一个MyBatis的的,单元测试中,MySQL的驱动,如下:

    <dependencies>
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.4.2</version>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.40</version>
        </dependency>

    </dependencies>
  • 1
  • 2
  • 3
  • 4
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18

OK,如此我的MyBatis的的环境就搭建好了。接下来我们还是按照上文的顺序来看看要怎么做。

通过XML创建的MyBatis的配置

在创建XML配置文件的时候,对于数据库的配置信息我们可以直接创建一个db.properties文件,然后将数据库的配置信息放入其中,如下:

driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/mybatis
username=root
password=sang
  • 1
  • 2
  • 3
  • 4

注意,所有的配置文件我们都放在资源文件夹下(小伙伴如果放错了会出现文件找不到的情况,这个时候仔细检查下都很好解决的),如下图: 
 
有了数据库配置信息,接下来我们就可以创建的的MyBatis的配置文件了,我这里配置文件取名为的MyBatis的-conf.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="db.properties"/>
    <typeAliases>
        <typeAlias type="org.sang.bean.User" alias="user"/>
    </typeAliases>
    <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="userMapper.xml"/>
    </mappers>
</configuration>
  • 1
  • 2
  • 3
  • 4
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24

关于这个配置文件我说如下几点:

1.第6行我们引入刚刚创建的db.properties文件,方便我们在配置数据库的时候通过$ {XXX}来直接引用其中的值。

2.第7-9行给我们的用户实体类取一个别名,这样在映射器的配置文件中我们就可以直接使用这里的别名了。

3.从第10行开始配置我们的mybatis运行环境,我们可以在environments节点中配置多个environment,比如开发环境下的environment,生产环境下的environment,然后在environments中通过default属性来选择你要使用哪一种环境。

4.14-17行配置数据库相关属性,通过${XXX}来直接引用db.properties中的值。

5.第21行到23行配置映射器Mapper,下面我们来说说如何创建Mapper

有了这个XML文件,接下来我们就可以通过这个xml文件来获取一个SqlSession了,当然,如上篇博客所述,我们需要把SqlSessionFactory搞成单例模式,所以创建方式如下:

public class DBUtils {
    private static SqlSessionFactory sqlSessionFactory = null;
    private static final Class CLASS_LOCK = DBUtils.class;

    public static SqlSessionFactory initSqlSessionFactory() {
        InputStream is = null;
        try {
            is = Resources.getResourceAsStream("mybatis-conf.xml");
        } catch (IOException e) {
            e.printStackTrace();
        }
        synchronized (CLASS_LOCK) {
            if (sqlSessionFactory == null) {
                sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);
            }
        }
        return sqlSessionFactory;
    }

    public static SqlSession openSqlSession() {
        if(sqlSessionFactory==null)
            initSqlSessionFactory();
        return sqlSessionFactory.openSession();
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25

关于这个类我这里就不做过多说明了,小伙伴们有疑问可以参考上篇博客

创建Mapper

上篇博客我们说过Mapper由两部分组成,Java接口+注解或者Java接口+XML配置,我们在上篇博客中使用Java接口+注解的方式来创建了Mapper,那么本文我们就来看看一种更常用的方式Java接口+XML配置的方式。

创建Java接口:

public interface UserMapper {
    public User getUser(Long id);

    public int insertUser(User user);

    public int deleteUser(Long id);
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

小伙伴们注意,这里我并没有给getUser方法添加@Select注解,我们将在xml配置文件中通过xml来解决这个问题,同时我们还添加了两个方法,一个向数据库中添加数据,一个删除数据。

创建配置文件

在resources中创建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.sang.db.UserMapper">
    <select id="getUser" resultType="user" parameterType="Long">
        select * from user where id = #{id}
    </select>
    <insert id="insertUser" parameterType="user">
        INSERT INTO user(username,password,address) VALUES (#{username},#{password},#{address})
    </insert>
    <delete id="deleteUser" parameterType="Long">
        DELETE FROM user where id=#{id}
    </delete>
</mapper>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

关于这个配置文件我说两点:

1.mapper节点的命名空间属性就是UserMapper的接口全路径 
2.选择节点的ID属性就是UserMapper中的方法名称,与与resultType属性的值是我们在的MyBatis的-conf.xml中中定义给用户类定义的别名,参数类型是指定的getUser方法参数的类型 
3.插入节点用来执行数据的插入操作 
4.delete节点用来执行数据的删除操作

OK,最后再给小伙伴们看看我们的实体类,如下:

public class User {
    private Long id;
    private String username;
    private String password;
    private String address;

    //省略getter/setter
}
  • 1
  • 2
  • 3
  • 4
  • 6
  • 7
  • 8

OK,如此之后,我们就可以来测试代码啦。

测试

查询

    @Test
    public void test1() {
        SqlSession sqlSession = null;
        try {
            sqlSession = DBUtils.openSqlSession();
            UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
            User user = userMapper.getUser(1l);
            System.out.println(user);
            sqlSession.commit();
        } catch (Exception e) {
            e.printStackTrace();
            sqlSession.rollback();
        } finally {
            if (sqlSession != null) {
                sqlSession.close();
            }
        }

    }
  • 1
  • 2
  • 3
  • 4
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19

查询结果如下: 

添加

    @Test
    public void test2() {
        SqlSession sqlSession = null;
        try {
            sqlSession = DBUtils.openSqlSession();
            UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
            for (int i = 0; i < 3; i++) {
                userMapper.insertUser(new User(null, "u-" + i, "p-" + i, "a-" + i));
            }
            sqlSession.commit();
        } catch (Exception e) {
            e.printStackTrace();
            sqlSession.rollback();
        } finally {
            if (sqlSession != null) {
                sqlSession.close();
            }
        }
    }
  • 1
  • 2
  • 3
  • 4
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19

添加结果: 

删除

    @Test
    public void test3() {
        SqlSession sqlSession = null;
        try {
            sqlSession = DBUtils.openSqlSession();
            UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
            int i = userMapper.deleteUser(5l);
            System.out.println(i);
            sqlSession.commit();
        } catch (Exception e) {
            e.printStackTrace();
            sqlSession.rollback();
        } finally {
            if (sqlSession != null) {
                sqlSession.close();
            }
        }
    }
  • 1
  • 2
  • 3
  • 4
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18

删除结果: 

OK,以上就是我们通过XML配置文件来使用的MyBatis的。

本文案例下载: 
本文案例GitHub地址https://github.com/lenve/JavaEETest/tree/master/Test27-mybatis3

以上。

参考资料: 
1. http://www.mybatis.org/mybatis-3/zh/index.html 
2.“深入浅出MyBatis技术原理与实战”第二章