zoukankan      html  css  js  c++  java
  • MyBatis的2个核心对象:SqlSessionFactory、SqlSession

    SqlSessionFactory

    SqlSessionFactory是单个数据库映射关系经过编译后的内存镜像,主要作用是创建SqlSession。

     InputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml");
     SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
    
     // Reader reader = Resources.getResourceAsReader("mybatis-config.xml");
     // SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);

    SqlSessionFactory是线程安全的,一旦被创建,在整个应用程序执行期间都会存在。

    创建SqlSessionFactory很消耗数据库资源,如果多次创建同一数据库的SqlSessionFactory,此数据库的资源很容易被耗尽。

    尽量使一个数据库只对应一个SqlSessionFactory,构建SqlSessionFactory时,通常使用单例模式


    SqlSession

    SqlSession底层封装了JDBC连接,包含了大量的执行sql操作的方法,主要作用是执行持久化操作。

    SqlSession是线程不安全的,每一个线程都应该有一个自己的SqlSession实例,并且该实例不能被共享。

    SqlSession的使用范围最好是一次请求或一个方法中,不要将SqlSession作为类的成员变量或者放到HttpSession等域中公用,使用完及时关闭。

     SqlSession sqlSession=sqlSessionFactory.openSession();
     try{
       //执行持久化操作
     }finally {
        sqlSession.close();
     }

    SqlSession常用的方法

    • <T>T   selectOne(String statement)
    • <T>T   selectOne(String statement, Object param)

    只能返回0条或1条记录,若返回多条记录,会抛出异常。

    • List<E>   selectList(String statement)
    • List<E>   selectList(String statement, Object param)
    • List<E>   selectList(String statement, Object param, RowBounds  rowBounds)   //rowBounds用于分页

    可以返回0条或多条记录(数量不受限制)。

    selectOne、selectList在没有匹配的记录时都是返回null。

    • void  select(String  statement, Object  param, ResultHandler  handler)    //handler指定结果集的处理方式

    注意返回值是void,使用handler指定的方式处理结果集,常用于比较复杂的结果集,比如多表查询。

    • int  insert | update | delete(String statement)
    • int  insert | update | delete(String statement, Object param)

    返回受影响的记录数。

    • void   commit()    //提交事务(本次session期间做的改动)
    • void   rollback()   //回滚事务
    • void   close()   //关闭SqlSession对象
    • <T>T   getMapper(Class<T>  type)    //返回Mapper接口的代理对象

    该对象关联了SqlSession对象,可通过该对象直接操作数据库,mybatis官方推荐使用Mapper对象操作数据库。参数type是Mapper接口的class对象。

    getMapper()的用法可参考:https://www.cnblogs.com/chy18883701161/p/12152695.html


    selectList()使用示例

    <select id="queryById" parameterType="Integer" resultType="com.chy.pojo.Student">
            SELECT * FROM student_tb WHERE id>#{id}
    </select>
    List<Student> list = sqlSession.selectList("queryById", 5);

     返回值类型是写POJO类,不是写List。

    mybatis会根据结果集中的记录数来判断,如果只有一条记录,映射为Student对象,如果有多条记录,映射为List<Student>。

    分页:只取结果集的一部分记录。

    //参数:结果集中的记录的下标,要取的记录数
    RowBounds rowBounds = new RowBounds(1, 3);
    List<Student> list = sqlSession.selectList("queryById", 5, rowBounds);

    只将结果集的第2、3、4条记录取出来,映射到list中。


    附   MyBatis常用的工具类

    public class MyBatisUtils {
        private static SqlSessionFactory sqlSessionFactory;
    
        static {
            try {
                InputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml");
                sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    
        public static SqlSession getSqlSession(){
            return sqlSessionFactory.openSession();
        }
    }

    方法声明为static,通过类名直接调用。

  • 相关阅读:
    表相关操作
    表的约束
    windows平台MySQL安装
    网络编程2
    Python元类
    并发编程这个只是占位使用而已
    并发编程2
    并发编程1
    Mac装机神器Homebrew
    基于Django框架开发BBS项目
  • 原文地址:https://www.cnblogs.com/chy18883701161/p/12150758.html
Copyright © 2011-2022 走看看