zoukankan      html  css  js  c++  java
  • MyBatis对象分析及创建工具类

    一、MyBatis 对象分析

    1. Resources 类

    mybatis中的一个类, 负责读取主配置文件,返回 IO 流对象

    InputStream in = Resources.getResourceAsStream("mybatis.xml");

    2. SqlSessionFactoryBuilder类

    SqlSessionFactory 的 创 建 , 需 要 使 用 SqlSessionFactoryBuilder 对 象 的 build() 方 法 。

    由 于SqlSessionFactoryBuilder 对象在创建完工厂对象后,就完成了其历史使命,即可被销毁。

    所以,一般会将该 SqlSessionFactoryBuilder 对象创建为一个方法内的局部对象,方法结束,对象销毁

    SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
    SqlSessionFactory factory = builder.build(in);

    3. SqlSessionFactory接口

    重量级对象, 程序创建一个对象耗时比较长,使用资源比较多,是线程安全的,

    在整个项目中,有一个就够用了

    SqlSessionFactory作用: 获取SqlSession对象

    SqlSession sqlSession = factory.openSession();

    openSession()方法说明:

    • openSession() :无参数的, 获取是非自动提交事务的SqlSession对象
    • openSession(boolean): openSession(true) 获取自动提交事务的SqlSession.
      openSession(false) 非自动提交事务的SqlSession对象

    对于 insert 、delete、update 如果使用的无参数的,那么需要在执行完sql语句之后,手动的提交事务

    4. SqlSession 接口

    SqlSession 接口对象用于执行持久化操作。

    SqlSession接口 :定义了操作数据的方法 例如 selectOne() ,selectList() ,insert(),update(), delete(), commit(), rollback()

    在IDEA中 Ctrl + H就可以看到实现类

    需要注意:

    SqlSession对象不是线程安全的,需要在方法内部使用, 在执行sql语句之前,使用openSession()获取SqlSession对象。
    在执行完sql语句后,需要关闭它,执行SqlSession.close(). 这样能保证他的使用是线程安全的

    这样的话在看之前写的操作就懂了

    public void testInsert() throws IOException {
            // 访问mybatis读取student数据
            //1.定义mybatis主配置文件的名称, 从类路径的根开始(target/clasess),编译之后的目录
            String config = "mybatis.xml";
    
            //2.读取这个config表示的文件
            InputStream in = Resources.getResourceAsStream(config);
            //3.创建了SqlSessionFactoryBuilder对象
            SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
            //4.创建SqlSessionFactory对象
            SqlSessionFactory factory = builder.build(in);
            //5.获取SqlSession对象,从SqlSessionFactory中获取SqlSession
            SqlSession sqlSession = factory.openSession();
            //6.【重要】指定要执行的sql语句的标识。  sql映射文件中的namespace + "." + 标签的id值
    //        String sqlId = "com.md.dao.StudentDao"+"."+"selectStudents";
            String sqlId = "com.md.dao.StudentDao.insertStudent";
            //7.【重要】执行sql语句,通过sqlId找到语句
            // 第一个参数是执行的sql语句,第二个是对象
            int i = sqlSession.insert(sqlId,new Student(1004,"刘桑","ls@qq.com",18));
    
            // 需要注意,mybatis默认不是自动提交事务,所以在写完insert、update、delete之后,手动的提交事务
            sqlSession.commit();
    
    
            //8.输出结果
            System.out.println("执行insert影响的行数:"+i);
            //9.关闭SqlSession对象
            sqlSession.close();
        }
    

    二、创建工具类

    1. 创建 MyBatisUtils类

    在com.md下新建一个包utils,里面创建MyBatisUtils

    至于为什么使用静态代码块,主要看SqlSessionFactory接口的特性

    package com.md.utils;
    
    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;
    
    /**
     * @author MD
     * @create 2020-08-05 10:59
     */
    public class MyBatisUtils {
    
        private static SqlSessionFactory factory = null;
    
    
    // 保证了SqlSessionFactory对象只创建一次
        static {
            // 和你项目的主配置文件名一致
            String config = "mybatis.xml";
            // 读取这个config表示的文件
            try {
                InputStream in = Resources.getResourceAsStream(config);
                // 创建了SqlSessionFactory对象,使用创建了SqlSessionFactoryBuilder对象
                factory = new SqlSessionFactoryBuilder().build(in);
            } catch (IOException e) {
                e.printStackTrace();
            }
    
        }
    
    
        // 获取SqlSession的方法
        public static SqlSession getSqlSession() {
    
            SqlSession sqlSession = null;
            if (factory != null){
                // 非自动提交事务
                sqlSession = factory.openSession();
            }
    
            return sqlSession;
        }
    
    }
    
    

    2. 使用MyBatisUtils

    public static void main(String[] args) {
    
            SqlSession sqlSession = MyBatisUtils.getSqlSession();
    
            String sqlId = "com.md.dao.StudentDao.selectStudents";
            List<Student> studentList = sqlSession.selectList(sqlId);
            studentList.forEach(stu -> System.out.println(stu));
    
            sqlSession.close();
        }
    

    这样就方便很多,只用专注于写sql就行了

  • 相关阅读:
    开源WebGIS实施方案(五):基于SLD实现图层符号化及其应用
    开源WebGIS实施方案(四):GeoServer发布PostGIS数据
    开源WebGIS实施方案(三):Shapefile数据导入到PostGIS
    jdbcType与javaType的对应关系
    关于fastjson的一个坑:输出json时,bean对象属性首字母默认被小写
    TortoiseSVN本地版本控制管理
    ArcGIS“一个或多个ActiveX控件无法显示...”问题的解决方案
    JavaWeb学习系列——第一个JavaWeb程序
    ArcGIS提取影像边界
    调皮的MySQL服务 请你不要再躲猫猫
  • 原文地址:https://www.cnblogs.com/mengd/p/13443314.html
Copyright © 2011-2022 走看看