java programming

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 教程 java orm java数据库操作

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

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 教程总结

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


更多关于Java 的内容可以参考: Java从入门到精通


什么是ORM

mybatis orm mapping

对象关系映射(Object Relational Mapping,简称ORM)是通过使用描述对象和数据库之间映射的元数据,将面向对象语言程序中的对象自动持久化到关系数据库中。本质上就是将数据从一种形式转换到另外一种形式。 这也同时暗示着额外的执行开销;然而,如果ORM作为一种中间件实现,则会有很多机会做优化,而这些在手写的持久层并不存在。 更重要的是用于控制转换的元数据需要提供和管理;但是同样,这些花费要比维护手写的方案要少;而且就算是遵守ODMG规范的对象数据库依然需要类级别的元数据。

1 thought on “MyBatis使用入门”

  1. Pingback: spring mvc 入门 – Spring入门之IOC与AOP – The Hu Post

Leave a Comment

Your email address will not be published. Required fields are marked *

Scroll to Top