欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

MyBatis的2个核心对象:SqlSessionFactory、SqlSession

程序员文章站 2022-03-21 17:12:07
SqlSessionFactory SqlSessionFactory是单个数据库映射关系经过编译后的内存镜像,主要作用是创建SqlSession。 InputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml ......

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条记录,若返回多条记录,会抛出异常。

 

 

  • <e>list<e>   selectlist(string statement)
  • <e>list<e>   selectlist(string statement, object param)
  • <e>list<e>   selectlist(string statement, object param, rowbounds  rowbounds)   //rowbounds用于分页

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

 

 

  • 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()的用法可参考:

 

 


 

 

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 sqlsession getsqlsession(){
        return sqlsessionfactory.opensession();
    }
}