学科分类
目录
SSM框架

SqlSession

SqlSession是MyBatis框架中另一个重要的对象,它是应用程序与持久层之间执行交互操作的一个单线程对象,其主要作用是执行持久化操作。SqlSession对象包含了数据库中所有执行SQL操作的方法,由于其底层封装了JDBC连接,所以可以直接使用其实例来执行已映射的SQL语句。

每一个线程都应该有一个自己的SqlSession实例,并且该实例是不能被共享的。同时,SqlSession实例也是线程不安全的,因此其使用范围最好在一次请求或一个方法中,绝不能将其放在一个类的静态字段、实例字段或任何类型的管理范围(如Servlet的HttpSession)中使用。使用完SqlSession对象之后,要及时的关闭它,通常可以将其放在finally块中关闭,代码如下所示。

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

SqlSession对象中包含了很多方法,其常用方法如下所示:

<T> T selectOne(String statement);

查询方法。参数statement是在配置文件中定义的<select>元素的id。使用该方法后,会返回执行SQL语句查询结果的一条泛型对象。

<T> T selectOne(String statement, Object parameter);

查询方法。参数statement是在配置文件中定义的<select>元素的id,parameter是查询所需的参数。使用该方法后,会返回执行SQL语句查询结果的一条泛型对象。

<E> List<E> selectList(String statement);

查询方法。参数statement是在配置文件中定义的<select>元素的id。使用该方法后,会返回执行SQL语句查询结果的泛型对象的集合。

<E> List<E> selectList(String statement, Object parameter);

查询方法。参数statement是在配置文件中定义的<select>元素的id,parameter是查询所需的参数。使用该方法后,会返回执行SQL语句查询结果的泛型对象的集合。

<E> List<E> selectList(String statement, Object parameter, RowBounds rowBounds);

查询方法。参数statement是在配置文件中定义的<select>元素的id,parameter是查询所需的参数,rowBounds是用于分页的参数对象。使用该方法后,会返回执行SQL语句查询结果的泛型对象的集合。

void select(String statement, Object parameter, ResultHandler handler);

查询方法。参数statement是在配置文件中定义的<select>元素的id,parameter是查询所需的参数,ResultHandler对象用于处理查询返回的复杂结果集,通常用于多表查询。

int insert(String statement);

插入方法。参数statement是在配置文件中定义的<insert>元素的id。使用该方法后,会返回执行SQL语句所影响的行数。

int insert(String statement, Object parameter);

插入方法。参数statement是在配置文件中定义的<insert>元素的id,parameter是插入所需的参数。使用该方法后,会返回执行SQL语句所影响的行数。

int update(String statement);

更新方法。参数statement是在配置文件中定义的<update>元素的id。使用该方法后,会返回执行SQL语句所影响的行数。

int update(String statement, Object parameter);

更新方法。参数statement是在配置文件中定义的<update>元素的id,parameter是更新所需的参数。使用该方法后,会返回执行SQL语句所影响的行数。

int delete(String statement);

删除方法。参数statement是在配置文件中定义的<delete>元素的id。使用该方法后,会返回执行SQL语句所影响的行数。

int delete(String statement, Object parameter);

删除方法。参数statement是在配置文件中定义的<delete>元素的id,parameter是删除所需的参数。使用该方法后,会返回执行SQL语句所影响的行数。

void commit();

提交事务的方法。

void rollback();

回滚事务的方法。

void close();

关闭SqlSession对象。

<T> T getMapper(Class<T> type);

该方法会返回Mapper接口的代理对象,该对象关联了SqlSession对象,开发人员可以使用该对象直接调用方法操作数据库。参数type是Mapper的接口类型。MyBatis官方推荐通过Mapper对象访问MyBatis。

Connection getConnection();

获取JDBC数据库连接对象的方法。

image-20200622144948433多学一招:使用工具类创建SqlSession

在上一章的入门案例中,每个方法执行时都需要读取配置文件,并根据配置文件的信息构建SqlSessionFactory对象,然后创建SqlSession对象,这导致了大量的重复代码。为了简化开发,我们可以将上述重复代码封装到一个工具类中,然后通过工具类来创建SqlSession,如文件1所示。

文件1 MybatisUtils.java

 1    package com.itheima.utils;
 2    import java.io.Reader;
 3    import org.apache.ibatis.io.Resources;
 4    import org.apache.ibatis.session.SqlSession;
 5    import org.apache.ibatis.session.SqlSessionFactory;
 6    import org.apache.ibatis.session.SqlSessionFactoryBuilder;
 7    /**
 8     * 工具类
 9     */
 10    public class MybatisUtils {
 11        private static SqlSessionFactory sqlSessionFactory = null;
 12        // 初始化SqlSessionFactory对象
 13        static {
 14            try {
 15                // 使用MyBatis提供的Resources类加载MyBatis的配置文件
 16                Reader reader = 
 17                        Resources.getResourceAsReader("mybatis-config.xml");
 18                // 构建SqlSessionFactory工厂
 19                sqlSessionFactory = 
 20                        new SqlSessionFactoryBuilder().build(reader);
 21            } catch (Exception e) {
 22                e.printStackTrace();
 23            }
 24        }
 25        // 获取SqlSession对象的静态方法
 26        public static SqlSession getSession() {
 27            return sqlSessionFactory.openSession();
 28        }
 29    }

这样,我们在使用时就只创建了一个SqlSessionFactory对象,并且可以通过工具类的getSession()方法,来获取SqlSession对象。

点击此处
隐藏目录