重学Java-Mybatis-入门

305 阅读4分钟

mybatis – MyBatis 3 | 入门

执行步骤

//1 加载配置文件
InputStream resourceAsStream = Resources.getResourceAsStream("mybatis-config.xml");
//2 构建 SqlSessionFactory
SqlSessionFactory build = new SqlSessionFactoryBuilder().build(resourceAsStream);
//3 获取 SqlSession
SqlSession sqlSession = build.openSession();
//4 调用查询
List<User> objects = sqlSession.selectList("mapper.UserMapper.select");
// 删除 插入 与 更新操作需要提交事务 sqlSession.commit();
// 5 关闭 sqlSession
sqlSession.close();

作用域(Scope)和生命周期

对象生命周期和依赖注入框架

依赖注入框架可以创建线程安全的、基于事务的 SqlSession 和映射器,并将它们直接注入到你的 bean 中,因此可以直接忽略它们的生命周期。 如果对如何通过依赖注入框架使用 MyBatis 感兴趣,可以研究一下 MyBatis-Spring 或 MyBatis-Guice 两个子项目。

SqlSessionFactoryBuilder

这个类可以被实例化、使用和丢弃,一旦创建了 SqlSessionFactory,就不再需要它了。 因此 SqlSessionFactoryBuilder 实例的最佳作用域是方法作用域(也就是局部方法变量)。 你可以重用 SqlSessionFactoryBuilder 来创建多个 SqlSessionFactory 实例,但最好还是不要一直保留着它,以保证所有的 XML 解析资源可以被释放给更重要的事情。

SqlSessionFactory

SqlSessionFactory 一旦被创建就应该在应用的运行期间一直存在,没有任何理由丢弃它或重新创建另一个实例。 使用 SqlSessionFactory 的最佳实践是在应用运行期间不要重复创建多次,多次重建 SqlSessionFactory 被视为一种代码“坏习惯”。因此 SqlSessionFactory 的最佳作用域是应用作用域。 有很多方法可以做到,最简单的就是使用单例模式或者静态单例模式。

SqlSession

每个线程都应该有它自己的 SqlSession 实例。SqlSession 的实例不是线程安全的,因此是不能被共享的,所以它的最佳的作用域是请求或方法作用域。 绝对不能将 SqlSession 实例的引用放在一个类的静态域,甚至一个类的实例变量也不行。 也绝不能将 SqlSession 实例的引用放在任何类型的托管作用域中,比如 Servlet 框架中的 HttpSession。 如果你现在正在使用一种 Web 框架,考虑将 SqlSession 放在一个和 HTTP 请求相似的作用域中。 换句话说,每次收到 HTTP 请求,就可以打开一个 SqlSession,返回一个响应后,就关闭它。 这个关闭操作很重要,为了确保每次都能执行关闭操作,你应该把这个关闭操作放到 finally 块中。

映射器实例

映射器是一些绑定映射语句的接口。映射器接口的实例是从 SqlSession 中获得的。虽然从技术层面上来讲,任何映射器实例的最大作用域与请求它们的 SqlSession 相同。但方法作用域才是映射器实例的最合适的作用域。 也就是说,映射器实例应该在调用它们的方法中被获取,使用完毕之后即可丢弃。 映射器实例并不需要被显式地关闭。尽管在整个请求作用域保留映射器实例不会有什么问题,但是你很快会发现,在这个作用域上管理太多像 SqlSession 的资源会让你忙不过来

下边是具体的代码

第一步使用 Maven构建项目

使用依赖

<dependency>
    <groupId>org.mybatis</groupId>
    <artifactId>mybatis</artifactId>
    <version>3.4.5</version>
</dependency>

<dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>4.13.2</version>
</dependency>

<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>8.0.26</version>
</dependency>

第二步定义Mapper文件与操作对象

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="mapper.UserMapper">
    <!--    namespace  命名空间 用于 区分mapper  namespace.id 组成调用的 唯一标记 -->
    <!--select  查询标签  id 方法标记 resultType 返回参数类型 -->
    <select id="select" resultType="pojo.User">
        select *
        from user
    </select>
    <!-- insert  保存标签    parameterType 入产类型   -->
    <insert id="save" parameterType="pojo.User">
        insert into user
        values (#{userId}, #{userName})
    </insert>
    <!-- update 更新标签   -->

    <update id="update" parameterType="pojo.User">
        update user
        set userName =#{userName}
        where userId = #{userId}
    </update>
    <!--    delete  删除标签 -->
    <delete id="del" parameterType="java.lang.String">
        delete
        from user
        where userId = #{userId}
    </delete>

</mapper>

定义操作对象

package pojo;

/**
 * @ClassName User
 * @Description 用户实体
 * @Author Hello豆包
 * @Date 2021/7/22 21:18
 * @Version 1.0
 */
public class User {

    private  String userId;
    private  String userName;

    public User(String userId, String userName) {
        this.userId = userId;
        this.userName = userName;
    }

    public User() {

    }

    public String getUserId() {
        return userId;
    }

    public void setUserId(String userId) {
        this.userId = userId;
    }

    public String getUserName() {
        return userName;
    }

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

    public  String  toString(){
        return  "userId:" + userId +",userName:" + userName;
    }
    }

第三步测试

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 pojo.User;

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

/**
 * @ClassName Test
 * @Description TODO
 * @Author zjh
 * @Date 2021/7/28 20:01
 * @Version 1.0
 */
public class Test {

    @org.junit.Test
    public  void  test1() throws IOException {
        //1. 定义Mapper文件
        //2. 定义配置文件

        //3 加载配置文件
        InputStream resourceAsStream = Resources.getResourceAsStream("mybatis-config.xml");
        //4 构建 SqlSessionFactory
        SqlSessionFactory build = new SqlSessionFactoryBuilder().build(resourceAsStream);
        //5 获取 SqlSession
        SqlSession sqlSession = build.openSession();
        //6 调用查询
        List<User> objects = sqlSession.selectList("mapper.UserMapper.select");

        System.out.println(objects);
        // 7 关闭 sqlSession
        sqlSession.close();

    }


    @org.junit.Test
    public  void  test2() throws IOException {
        SqlSession sqlSession = getSqlSession();
        User user = new User();
        user.setUserId("2");
        user.setUserName("2322");
        int insert = sqlSession.insert("mapper.UserMapper.save", user);
        //提交事务
        sqlSession.commit();
        System.out.println(insert);
        // 7 关闭 sqlSession
        sqlSession.close();

    }

    @org.junit.Test
    public  void  test3() throws IOException {
        SqlSession sqlSession = getSqlSession();
        User user = new User();
        user.setUserId("2");
        user.setUserName("232221212");
        int insert = sqlSession.update("mapper.UserMapper.update", user);
        //提交事务
        sqlSession.commit();
        System.out.println(insert);
        // 7 关闭 sqlSession
        sqlSession.close();

    }


    @org.junit.Test
    public  void  test4() throws IOException {
        SqlSession sqlSession = getSqlSession();

        int insert = sqlSession.delete("mapper.UserMapper.del", "1");
        //提交事务
        sqlSession.commit();
        System.out.println(insert);
        // 7 关闭 sqlSession
        sqlSession.close();

    }
    private  SqlSession getSqlSession() throws IOException {
        //3 加载配置文件
        InputStream resourceAsStream = Resources.getResourceAsStream("mybatis-config.xml");
        //4 构建 SqlSessionFactory
        SqlSessionFactory build = new SqlSessionFactoryBuilder().build(resourceAsStream);
        //5 获取 SqlSession
       return  build.openSession();
    }
}

映射实例写法

第一步定义接口对象

package mapper;

import pojo.User;

import java.util.List;

/**
 * @ClassName UserMapper
 * @Description TODO
 * @Author zjh
 * @Date 2021/7/22 21:28
 * @Version 1.0
 */
public interface UserMapper {
    /**
     * 查询用户
      * @param user
     * @return
     */
  List<User> select(User user);

    /**
     * 保存用户
     *
     * @param user
     * @return
     */
  Long  save(User user);

    /**
     * 更新用户
     * @param user
     * @return
     */
  Long update(User user);

    /**
     * 删除用户
     * @param user
     * @return
     */
  Long del(User user);


}

第二步测试

import mapper.UserMapper;
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 pojo.User;

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

/**
 * @ClassName Test
 * @Description TODO
 * @Author zjh
 * @Date 2021/7/28 20:01
 * @Version 1.0
 */
public class Test2 {



    @org.junit.Test
    public  void  test2() throws IOException {
        SqlSession sqlSession = getSqlSession();
        //获取映射
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
        User user = new User();
        user.setUserId("2");
        user.setUserName("2322");
        Long save = mapper.save(user);
        //提交事务
        sqlSession.commit();
        System.out.println(save);
        // 7 关闭 sqlSession
        sqlSession.close();

    }

    private  SqlSession getSqlSession() throws IOException {
        //3 加载配置文件
        InputStream resourceAsStream = Resources.getResourceAsStream("mybatis-config.xml");
        //4 构建 SqlSessionFactory
        SqlSessionFactory build = new SqlSessionFactoryBuilder().build(resourceAsStream);
        //5 获取 SqlSession
       return  build.openSession();
    }
}