MyBatis使用入门

                                                                                MyBatis使用入门

1.      没有ORM的时代

 

在实际Java开发过程中,ORM 是不可或缺的一种工具。没有ORM工具是,  Java 程序中访问数据库比较麻烦: 通过JDBC 执行SQL 语句,  然后还要负责将SQL 语句的结果转换为对象。

 

下面是一段使用JDBC的示例代码:

        try(Connection c =DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/how2java?characterEncoding=UTF-8","root","admin");

            Statement s = c.createStatement();) {

 

            String sql = "select * from hero where id = "+ id;

   

            ResultSet rs = s.executeQuery(sql);

   

            // 因为id是唯一的,ResultSet最多只能有一条记录

            // 所以使用if代替while

            if(rs.next()) {

                hero = newHero();

                String name = rs.getString(2);

                floathp = rs.getFloat("hp");

                intdamage = rs.getInt(4);

                hero.name = name;

                hero.hp = hp;

                hero.damage = damage;

                hero.id = id;

            }

   

        } catch(SQLException e) {

            // TODO Auto-generated catch block

            e.printStackTrace();

        }

 

 

 

每一次数据库操作(增,删,改,查) 都要有执行SQL语句 和将结果转换为Java对象的过程,比较繁琐。

 

ORM 框架提供了Object和Relation之间的映射,  使用ORM 工具一般直接回返回所需的对象。

 

以前有用过hibernate, 这里记录下最近比较流行的MyBatis的入门使用。

 

MyBatis 具体使用可以参考官方文档:http://www.mybatis.org/mybatis-3/getting-started.html

 

 

2.      MyBatis 下载

 

可以直接从MyBatis的Github下载其Jar包或者源码, 然后导入到项目中,  下载地址为:

https://github.com/mybatis/mybatis-3/releases

 

或者使用Maven自动下载MyBatis

 

这里选择Maven自动下载, 在Maven的配置文件中添加MyBatis的引用(从MavenRepository 查到):

<!--https://mvnrepository.com/artifact/org.mybatis/mybatis -->

<dependency>

   <groupId>org.mybatis</groupId>

   <artifactId>mybatis</artifactId>

   <version>3.4.5</version>

</dependency>

 

 

访问MySQL数据库还需要MySQL的驱动,  这里也通过Maven 自动获取

 

 

3.      准备数据库

      

MySQL 上准备一个数据库testdb,   数据中准备一张表 user:

 MyBatis使用入门

 

4.      创建主配置文件mybatis-config.xml

 

<?xml version="1.0"encoding="UTF-8"?>
<!DOCTYPE
configuration
       
PUBLIC "-//mybatis.org//DTDConfig 3.0//EN"
       "http://mybatis.org/dtd/mybatis-3-config.dtd"
>
<configuration>
    <environments
default="development">
        <environment
id="development">
            <transactionManager
type="JDBC"/>
            <dataSource
type="POOLED">
                <property
name="driver" value="com.mysql.jdbc.Driver"/>
                <property
name="url" value="jdbc:mysql://localhost:3306/testdb?characterEncoding=UTF-8"/>
                <property
name="username" value="root"/>
                <property
name="password" value="admin"/>
            </dataSource>
        </environment>
    </environments>
    <mappers>
        <mapper
resource="org/mybatis/example/BlogMapper.xml"/>
    </mappers>
</configuration>

 

 

MyBatis 的配置文件和hibernate 类似,  主要是填充一些数据库相关的信息:

数据库连接串, 数据库用户名,密码

 

 

5.      创建表对应的类

 

 创建和数据库中user 表对应的Java 类型:

public class User {
    private int id;
    private String userName;
    private String pwd;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getUserName() {
        return userName;
    }

    public void setUserName(String userName) {
        this.userName = userName;
    }

    public String getPwd() {
        return pwd;
    }

    public void setPwd(String pwd) {
        this.pwd = pwd;
    }

    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", userName='" + userName + '\'' +
                ", pwd='" + pwd + '\'' +
                '}';
    }
}

 

 

 

6.      创建映射文件

 

这里也和hibernate类似, 需要通过映射文件将数据库中的表记录和具体的类关联起来

创建映射文件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="UserMapper">
    <select id="selectUser" resultType="User">
    select * from user where id = #{id}
    </select>
    <select id="selectAllUser" resultType="User">
        select * from user
    </select>
    <insert id="insertUser" parameterType="User">
        insert into user(userName,pwd) values(#{userName}, #{pwd})
    </insert>
    <update id="updateUser" parameterType="User">
        update user set userName = #{userName}, pwd = #{pwd}  where id = #{id}
    </update>
    <delete id="deleteUser" parameterType="int">
        delete from user where id = #{id}
    </delete>
</mapper>

 

 

 

 

 

 

 

 

 

 

 

主配置文件中Mappers使用定义好的映射文件:

<mappers>
    <mapper resource="UserMapper.xml"/>
</mappers>

 

完整的配置文件如下:

<?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>
    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://localhost:3306/testdb?characterEncoding=UTF-8"/>
                <property name="username" value="root"/>
                <property name="password" value="admin"/>
            </dataSource>
        </environment>
    </environments>
    <mappers>
        <mapper resource="UserMapper.xml"/>
    </mappers>
</configuration>

 

 

到这里使用MyBatis的准备工作都已经完成。 其实MyBatis和hibernate类似,  主要就是两个配置文件。  下面就是通过MyBatis 进行增删改查操作了。

 

7.      获取Session

 

定义一个MyBatis工具类,  其中提供获取session f方法:

public class MyBatisUtil {

    public  SqlSession getSession() throws IOException {

        String resource = "mybatis-config.xml";
        InputStream inputStream = Resources.getResourceAsStream(resource);
        SqlSessionFactory sqlSessionFactory =
                new SqlSessionFactoryBuilder().build(inputStream);
        SqlSession session = sqlSessionFactory.openSession();
        return session;
    }
}

 

 

8.      测试MyBatis
9.  public class MyBatisUtilTest {
    @Test
    public void getSession() throws Exception {
        SqlSession session = new MyBatisUtil().getSession();
        System.out.println(session);
        session.close();
    }


    @Test
    public void TestSelectUser() throws Exception {
        SqlSession session = new MyBatisUtil().getSession();
        User user = session.selectOne("UserMapper.selectUser",1);
        System.out.println(user);
        session.close();
    }

    @Test
    public void TestSelectAllUser() throws Exception {
        SqlSession session = new MyBatisUtil().getSession();
        List<User> list = session.selectList("UserMapper.selectAllUser");
        System.out.println(list);
        session.close();
    }

    @Test
    public void TestInsertUser() throws Exception {
        SqlSession session = new MyBatisUtil().getSession();
        User user = new User();
        user.setUserName("TestMyBatis");
        user.setPwd("TestMyBatis");
        session.insert("UserMapper.insertUser",user);
        session.commit();
        session.close();
    }

    @Test
    public void TestUpdateUser() throws Exception {
        SqlSession session = new MyBatisUtil().getSession();
        User user = new User();
        user.setId(1);
        user.setUserName("Hello");
        user.setPwd("World");
        session.update("UserMapper.updateUser",user);
        session.commit();
        session.close();
    }

    @Test
    public void TestDeleteUser() throws Exception {
        SqlSession session = new MyBatisUtil().getSession();
        session.update("UserMapper.deleteUser",4);
        session.commit();
        session.close();
    }

}

 

 

 

这些测试用例包括获取session, 增删改查操作都通过,  说明MyBatis 已经可以正常使用了。

 

注意, session调用增删改查方法时的第一个参数就是在前面在映射文件中定义的SQL 语句的ID

 

 

总结

MyBatis 的配置和hibernate基本类似, 也是两个配置文件,  一个主配置文件用于描述数据库信息(连接串,用户名,密码等),  一个映射文件用于将Java 类型和数据库进行关联。  MyBatis 和hibernate 的映射文件不同,  MyBatis 是SQL 语句映射,  hibernate 的是Java 类和数据表各个字段的一一映射。  所以正如两者官网介绍的,准确来说,  Mybatis 是一种SQL Mapping 框架,  hibernate 是一种ORM 框架。

 

当然这里介绍的知识MyBatis最基础的使用,  MyBatis 还支持通过接口的方式类访问数据库, 也支持注解方式配置映射,  更多类型参考Mybatis 官方文档:

http://www.mybatis.org/mybatis-3/getting-started.html