Mybatis使用

2018/08/02 Mybatis 共 6533 字,约 19 分钟

mybatis 介绍

mybatis 是一个持久层的框架,是 apache 下的顶级项目。

mybatis 托管到 goolecode 下,再后来托管到 github 下(https://github.com/mybatis/mybatis-3/releases)。

mybatis 让程序将主要精力放在 sql 上,通过 mybatis 提供的映射方式,自由灵活生成(半自动化,大部分需要程序员编写 sql)满足需要 sql 语句。

mybatis 可以将向 preparedStatement 中的输入参数自动进行输入映射,将查询结果集灵活映射成 java 对象。(输出映射)

mybatis 框架执行过程

1、配置 mybatis 的配置文件,SqlMapConfig.xml(名称不固定)

2、通过配置文件,加载 mybatis 运行环境,创建 SqlSessionFactory 会话工厂(SqlSessionFactory 在实际使用时按单例方式)

3、通过 SqlSessionFactory 创建 SqlSession。SqlSession 是一个面向用户接口(提供操作数据库方法),实现对象是线程不安全的,建议 sqlSession 应用场合在方法体内。

4、调用 sqlSession 的方法去操作数据。如果需要提交事务,需要执行 SqlSession 的 commit()方法。

5、释放资源,关闭 SqlSession

mybatis 开发 dao 的方法

1.原始 dao 的方法

  • 需要程序员编写 dao 接口和实现类
  • 需要在 dao 实现类中注入一个 SqlSessionFactory 工厂

    2.mapper 代理开发方法(建议使用)

只需要程序员编写 mapper 接口(就是 dao 接口)。 程序员在编写 mapper.xml(映射文件)和 mapper.java 需要遵循一个开发规范:

  • mapper.xml 中 namespace 就是 mapper.java 的类全路径。
  • mapper.xml 中 statement 的 id 和 mapper.java 中方法名一致。
  • mapper.xml 中 statement 的 parameterType 指定输入参数的类型和 mapper.java 的方法输入参数类型一致
  • mapper.xml 中 statement 的 resultType 指定输出结果的类型和 mapper.java 的方法返回值类型一致。

SqlMapConfig.xml 配置文件:可以配置 properties 属性、别名、mapper 加载。

输入映射和输出映射

  • 输入映射:

    • parameterType:指定输入参数类型可以简单类型、pojo、hashmap。
    • 对于综合查询,建议 parameterType 使用包装的 pojo,有利于系统扩展。
  • 输出映射:

    • resultType:查询到的列名和 resultType 指定的 pojo 的属性名一致,才能映射成功。
    • reusltMap:可以通过 resultMap 完成一些高级映射。如果查询到的列名和映射的 pojo 的属性名不一致时,通过 resultMap 设置列名和属性名之间的对应关系(映射关系)。可以完成映射。
      • 高级映射: 将关联查询的列映射到一个 pojo 属性中。(一对一) 将关联查询的列映射到一个 List中。(一对多)

动态 sql

  • 动态 sql:(重点)
    • if 判断(掌握)
    • where
    • foreach
    • sql 片段(掌握)

创建项目和模块

记得 model 添加 maven

添加 pom.xml,比如 junit,mybatis,sql-connector

配置 mybatis-config.xml

添加配置,在 resources 下新建文件 mybatis-config.xml,详情可见官网 xml

配置用户名和密码,和 Mysql 驱动名,记得建立 mybatis 数据库

<?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/mybatis"/>
                <property name="username" value="root"/>
                <property name="password" value="root"/>
            </dataSource>
        </environment>
    </environments>
    <mappers>
        <mapper resource="org/mybatis/example/BlogMapper.xml"/>
    </mappers>
</configuration>

数据库建表

CREATE TABLE IF NOT EXISTS `users` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(20) DEFAULT NULL,
  `age` int(11),
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

运行主要代码

package com.mfl.mybatisdemo;

import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

import java.io.IOException;
import java.io.InputStream;

public class App {
    public static void main(String[] args){
        try{
            String resource = "mybatis-config.xml";
            InputStream inputStream = Resources.getResourceAsStream(resource);
            SqlSessionFactory sqlSessionFactory =
                    new SqlSessionFactoryBuilder().build(inputStream);
            SqlSession sqlSession=sqlSessionFactory.openSession();
            System.out.println(sqlSession);
        }catch (IOException e){

        }

    }
}

编写 mapper 文件

创建 User 类和 user 对应

package com.mfl.model;

public class User {
    private Integer id;
    private String name;
    private int age;

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

    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 int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
}

创建 UserMapper.xml

在与 User 类的同包下创建 UserMapper.xml

namespace 作为名称空间,任何方式,一般类名小写

<?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="users">
    <insert id="insert">
        insert into users(name,age) values (#{name},#{age})
    </insert>
</mapper>

修改 mybatis-config.xml,引入 UserMapper.xml

    <mappers>
        <mapper resource="com/mfl/model/UserMapper.xml"/>
    </mappers>

App main

单元测试

package com.mfl.mybatisdemo.test;

import com.mfl.model.User;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Test;

import java.io.IOException;
import java.io.InputStream;
import java.util.List;

public class TestCRUD {
    @Test
    public void insert() throws Exception{

        String resource = "mybatis-config.xml";
        InputStream inputStream = Resources.getResourceAsStream(resource);
        SqlSessionFactory sqlSessionFactory =
                new SqlSessionFactoryBuilder().build(inputStream);
        SqlSession sqlSession=sqlSessionFactory.openSession();
        User u=new User();
        u.setName("mafulong");
        u.setAge(22);
        sqlSession.insert("users.insert",u);
        sqlSession.commit();
        sqlSession.close();
        System.out.println(sqlSession);

    }

    @Test
    public void update() throws Exception{
        String resource = "mybatis-config.xml";
        InputStream inputStream = Resources.getResourceAsStream(resource);
        SqlSessionFactory sqlSessionFactory =
                new SqlSessionFactoryBuilder().build(inputStream);
        SqlSession sqlSession=sqlSessionFactory.openSession();
        User u=new User();
        u.setName("mafulongUpdate");
        u.setAge(24);
        u.setId(1);
        sqlSession.update("users.update",u);
        sqlSession.commit();
        sqlSession.close();
    }
    @Test
    public void selectOne() throws Exception{
        String resource = "mybatis-config.xml";
        InputStream inputStream = Resources.getResourceAsStream(resource);
        SqlSessionFactory sqlSessionFactory =
                new SqlSessionFactoryBuilder().build(inputStream);
        SqlSession sqlSession=sqlSessionFactory.openSession();
        User user=sqlSession.selectOne("users.selectOne",1);
        System.out.println(user);
        sqlSession.commit();
        sqlSession.close();
    }
    @Test
    public void selectALL() throws Exception{
        String resource = "mybatis-config.xml";
        InputStream inputStream = Resources.getResourceAsStream(resource);
        SqlSessionFactory sqlSessionFactory =
                new SqlSessionFactoryBuilder().build(inputStream);
        SqlSession sqlSession=sqlSessionFactory.openSession();
        List<User> list=sqlSession.selectList("users.selectList",24);
        System.out.println(list);
        sqlSession.commit();
        sqlSession.close();
    }
}


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="users">
    <insert id="insert">
        insert into users(name,age) values (#{name},#{age})
    </insert>
    <update id="update" >
        update users set name=#{name} where age=#{age}
    </update>
    <select id="selectOne" parameterType="int" resultType="com.mfl.model.User">
        select * from users where id=#{id1}
    </select>
    <select id="selectList" parameterType="int" resultType="com.mfl.model.User">
        select * from users where age=#{age}
    </select>
</mapper>

Search

    Table of Contents