myBatis获取SqlSession连接对象的两种方式

1、spring配置文件applicationContext.xml,代码如下:

<?xml version="1.0" encoding="UTF-8"?>

<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:context="http://www.springframework.org/schema/context"
    xmlns:jee="http://www.springframework.org/schema/jee"
    xmlns:aop="http://www.springframework.org/schema/aop"
    xmlns:tx="http://www.springframework.org/schema/tx"
    xmlns:jaxws="http://cxf.apache.org/jaxws"
    xmlns:jaxrs="http://cxf.apache.org/jaxrs"
    xmlns:cxf="http://cxf.apache.org/core"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context.xsd
        http://www.springframework.org/schema/jee 
        http://www.springframework.org/schema/jee/spring-jee.xsd
        http://www.springframework.org/schema/tx
        http://www.springframework.org/schema/tx/spring-tx.xsd
        http://www.springframework.org/schema/aop
        http://www.springframework.org/schema/aop/spring-aop.xsd
        http://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsd  
      http://cxf.apache.org/core http://cxf.apache.org/schemas/core.xsd  
      http://cxf.apache.org/jaxrs http://cxf.apache.org/schemas/jaxrs.xsd"> 
    
    <!-- 引入jdbc配置文件 -->  
    <context:property-placeholder location="classpath:com/test/config/jdbc.properties"/>  
    
    <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close">  
<property name="driverClass">  
            <value>${jdbc.driverClassName}</value>  
        </property>  
        <property name="jdbcUrl">  
            <value>${jdbc.url}</value>  
        </property>  
        <property name="user">  
            <value>${jdbc.username}</value>  
        </property>  
        <property name="password">  
            <value>${jdbc.password}</value>  
        </property>  
        <!--当连接池中的连接耗尽的时候c3p0一次同时获取的连接数。Default: 3 -->   
        <property name="acquireIncrement">  
            <value>${jdbc.c3p0.acquireIncrement}</value>  
        </property>    
        <!--初始化时获取三个连接,取值应在minPoolSize与maxPoolSize之间。Default: 3 -->   
        <property name="initialPoolSize">  
            <value>${jdbc.c3p0.initialPoolSize}</value>  
        </property>  
        <property name="minPoolSize">  
            <value>${jdbc.c3p0.minPoolSize}</value>  
        </property>  
        <property name="maxPoolSize">  
            <value>${jdbc.c3p0.maxPoolSize}</value>  
        </property>  
        <!--最大空闲时间,60秒内未使用则连接被丢弃。若为0则永不丢弃。Default: 0 -->   
        <property name="maxIdleTime">  
            <value>${jdbc.c3p0.maxIdleTime}</value>  
        </property>  
        <!--每60秒检查所有连接池中的空闲连接。Default: 0 -->   
        <property name="idleConnectionTestPeriod">  
            <value>${jdbc.c3p0.idleConnectionTestPeriod}</value>  
        </property>  
        <!-- JDBC的标准参数,用以控制数据源内加载的PreparedStatements数量。但由于预缓存的statements   
                            属于单个connection而不是整个连接池。所以设置这个参数需要考虑到多方面的因素。   
                            如果maxStatements与maxStatementsPerConnection均为0,则缓存被关闭。Default: 0-->   
        <property name="maxStatements">  
            <value>${jdbc.c3p0.maxStatements}</value>  
        </property>  
    </bean>  
    
    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">  
        <property name="configLocation" value="classpath:com/test/config/myBatis-config.xml" />  
        <property name="dataSource" ref="dataSource"/>  
    </bean> 
    
    <bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate">  
      <constructor-arg index="0" ref="sqlSessionFactory" />  
    </bean> 
    
<!-- 自动扫描组件,这里要把controler下面的 controller去除,他们是在spring3-servlet.xml中配置的,如果不去除会影响事务管理的。  -->
  <context:component-scan base-package="com.test">
  <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller" /> 
  </context:component-scan>
 
    <!-- 事务配置 -->
<bean id="transactionManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager"
abstract="false" lazy-init="default" autowire="default">
  <property name="dataSource" ref="dataSource"></property>
</bean>

<tx:advice id="txAdvice" transaction-manager="transactionManager">
<tx:attributes>
<tx:method name="get*" read-only="true"/>
<tx:method name="search*" read-only="true"/>
<tx:method name="query*" read-only="true"/>
<tx:method name="create*" rollback-for="Throwable" />
<tx:method name="save*" rollback-for="Throwable" />
<tx:method name="update*" rollback-for="Throwable" />
<tx:method name="delete*" rollback-for="Throwable" />
<tx:method name="tx*" rollback-for="Throwable" />
<tx:method name="rnew*" rollback-for="Throwable" propagation="REQUIRES_NEW"/><!-- 独立事务 -->
<tx:method name="*" read-only="true"/>
</tx:attributes>
</tx:advice>

<aop:config>
<aop:pointcut id="serviceOperation" expression="execution(* com.test.service.*Service.*(..))"/>
<aop:advisor advice-ref="txAdvice" pointcut-ref="serviceOperation"/>
</aop:config><!--
   
     自动扫描mapper    
    --><bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">  
         <property name="basePackage"  value="com.test.dao"/>  
    </bean> 

</beans>


2、jdbc.properties配置文件代码如下:

jdbc.driverClassName=oracle.jdbc.driver.OracleDriver
jdbc.url=jdbc:oracle:thin:@172.20.41.214:1521:ifims
jdbc.username=IFIMS
jdbc.password=IFIMSDEV

#c3p0
jdbc.c3p0.minPoolSize=50
jdbc.c3p0.maxPoolSize=300
jdbc.c3p0.initialPoolSize=100
jdbc.c3p0.maxIdleTime=10
jdbc.c3p0.acquireIncrement=3
jdbc.c3p0.maxStatements=0
jdbc.c3p0.maxStatementsPerConnection=100
jdbc.c3p0.idleConnectionTestPeriod=60
jdbc.c3p0.acquireRetryAttempts=30
jdbc.c3p0.breakAfterAcquireFailure=false
jdbc.c3p0.testConnectionOnCheckout=false


3、myBatis映射文件myBatis-config.xml,代码如下:

<?xml version="1.0" encoding="UTF-8" ?>  
<!DOCTYPE configuration PUBLIC  "-//mybatis.org//DTD Config 3.0//EN"       
    "http://mybatis.org/dtd/mybatis-3-config.dtd">    
<configuration>   
    <typeAliases>  
       <typeAlias type="com.test.model.TSysUsers" alias="TSysUsers"></typeAlias>  
    </typeAliases>  
   <mappers>  
       <mapper resource="com/test/dao/mapper/TSysUsers.xml"></mapper>   
   </mappers>   
</configuration>


4、实体类TSysUsers.java,代码如下:

public class TSysUsers implements java.io.Serializable {
// Fields
private Long userid;
private TSysDepart TSysDepart;
private String loginname;
private String loginpwd;
private String username;
private String cellphone;
private String deptPort;

// Property accessors
public Long getUserid() {
return this.userid;
}
public void setUserid(Long userid) {
this.userid = userid;
}
public TSysDepart getTSysDepart() {
return this.TSysDepart;
}
public void setTSysDepart(TSysDepart TSysDepart) {
this.TSysDepart = TSysDepart;
}
public String getLoginname() {
return this.loginname;
}
public void setLoginname(String loginname) {
this.loginname = loginname;
}
public String getLoginpwd() {
return this.loginpwd;
}
public void setLoginpwd(String loginpwd) {
this.loginpwd = loginpwd;
}
public String getUsername() {
return this.username;
}
public void setUsername(String username) {
this.username = username;
}
public String getCellphone() {
return this.cellphone;
}
public void setCellphone(String cellphone) {
this.cellphone = cellphone;
}
public String getDeptPort() {
return deptPort;
}
public void setDeptPort(String deptPort) {
this.deptPort = deptPort;
}

}


5、sql映射配置文件TSysUsers.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="TSysUsers">
    <select id="queryByLoginName" parameterType="TSysUsers" resultType="TSysUsers">  
        select USERID as userId, LOGINNAME as LOGINNAME, LOGINPWD as LOGINPWD,
        USERNAME as USERNAME, CELLPHONE as CELLPHONE, DEPTPORT as DEPTPORT 
        from USERS t where 1 = 1
        <if test="loginname!=null"> 
        and t.LOGINNAME = #{loginname}
        </if>
    </select> 
 </mapper> 


6、public interface UserDao {
/**
* 登录
* @param loginName 用户名
* @return 用户
*/
public TSysUsers findByAccount(String loginName);
}


7、@Repository("userDaoImpl")
public class UserDaoImpl extends BaseDaoImpl<TSysUsers> implements UserDao {
@Override
public TSysUsers findByAccount(String loginName) {
TSysUsers tSysUsers = new TSysUsers();
tSysUsers.setLoginname(loginName);
List<TSysUsers> users= null;
try {
users = this.sqlSession.selectList("TSysUsers.queryByLoginName", tSysUsers);
} catch (Exception e) {
e.printStackTrace();
}
return users.size() == 0 ? null : users.get(users.size()-1);
}

}


8、public abstract class BaseDaoImpl<T> {
      @Autowired
protected SqlSessionTemplate sqlSession;
    
    public DataGrid queryBase(String sqlId, String countSqlId, Map<String, Object> params, Pager pager) {
        DataGrid result = new DataGrid();
        if (countSqlId != null) {
            result.setTotal(queryCount(countSqlId, params));
        }
        result.setRows(this.sqlSession.selectList(sqlId, params));
        return result;
    }
    
    public Long queryCount(String countSqlId, Map<String, Object> params) {
    Long count =  this.sqlSession.selectOne(countSqlId, params);
    eturn count;
    }
}


其中8中获取SqlSession连接对象也可以这样写:

public abstract class BaseDaoImpl<T> {
       @Autowired
protected SqlSessionFactory sqlSessionFactory;

public getSqlSession() {

return sqlSessionFactory.openSession();

}

}

这样写之后,7中的UserDaoImpl就要变成下面的写法:

@Repository("userDaoImpl")
public class UserDaoImpl extends BaseDaoImpl<TSysUsers> implements UserDao {

@Override
public TSysUsers findByAccount(String loginName) {
TSysUsers tSysUsers = new TSysUsers();
tSysUsers.setLoginname(loginName);
List<TSysUsers> users = null;

SqlSession sqlSession = null;
try {

sqlSession = this.getSqlSession();

users = sqlSession .selectList("TSysUsers.queryByLoginName", tSysUsers);
} catch (Exception e) {
e.printStackTrace();
} finally {

sqlSession.close();

}

return users.size() == 0 ? null : users.get(users.size()-1);
}

}


比较两种写法,第一种更好,因为SqlSessionTemplate你不必手动关闭,SqlSessionTemplate是一个代理类,内部他会为每次请求创建线程安全的sqlsession,并与Spring进行集成.在你的方法调用完毕以后他会自动关闭的,而第二种写法就要手动关闭连接,而且通过SqlSessionFactory获取Sqlsession对象不如SqlSessionTemplate速度快、效率高。











  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Mybatis SqlSession的生命周期包括以下几个阶段: 1. 创建SqlSession对象:通过SqlSessionFactory工厂类的openSession()方法创建SqlSession对象。 2. 执行SQL语句:通过SqlSession对象的selectOne()、selectList()、insert()、update()、delete()等方法执行SQL语句。 3. 提交事务:通过SqlSession对象的commit()方法提交事务。 4. 回滚事务:通过SqlSession对象的rollback()方法回滚事务。 5. 关闭SqlSession对象:通过SqlSession对象的close()方法关闭SqlSession对象。 ### 回答2: Mybatis是一种优秀的ORM(对象关系映射)框架,它采用XML或注解的方式SQL语句与Java对象进行映射,从而实现Java对象与数据库表之间的操作。而在Mybatis中,SqlSession是一个重要的组成部分,它用于管理数据库会话和操作数据库。 SqlSession的生命周期可以分为以下三个阶段: 1.创建阶段:SqlSession的创建是由SqlSessionFactory进行管理的,SqlSessionFactory通过读取Mybatis配置文件和mapper文件,加载数据库驱动和数据库连接等信息,创建SqlSession实例。在创建SqlSession时,需要传入两个参数,一个是ExecutorType,表示SqlSession所使用的执行器类型,另一个是boolean类型的autoCommit参数,表示是否自动提交事务。 2.使用阶段:SqlSession的主要作用是操作数据库,包括对数据库的增删改查等操作。在使用SqlSession过程中,需要调用相应的方法,如selectOne、selectList、insert、update、delete等。在执行这些方法时,SqlSession会创建一个statement对象,通过statement对象与数据库进行交互,执行对应的SQL语句,并将结果封装为Java对象返回给调用方。 3.关闭阶段:当SqlSession不再需要使用时,应该及时关闭,避免占用连接资源。在SqlSession关闭时,会自动提交未提交的事务,并释放连接资源。SqlSession关闭的方式两种,一种是手动关闭,调用SqlSession的close方法,另一种是通过try-with-resources语句自动关闭,如下所示: try (SqlSession sqlSession = sqlSessionFactory.openSession()) { // 调用SqlSession的方法进行数据库操作 } // 在try块结束时,SqlSession会自动关闭。 总之,在使用Mybatis进行数据库操作时,SqlSession的生命周期十分重要,需要合理管理SqlSession实例的创建、使用和关闭,避免因连接资源不足或未关闭导致的性能问题和内存泄漏等问题。 ### 回答3: Mybatis是一款流行的开源持久层框架,它通过SqlSession来提供对数据库的访问。SqlSessionMybatis中扮演着重要的角色,可以理解为Mybatis框架的工作单元。 SqlSession的生命周期从创建到关闭,经历了三个阶段:初始化阶段、操作阶段和关闭阶段。 初始化阶段: SqlSession是通过SqlSessionFactory工厂类创建的,当我们获取SqlSession对象时,就会经过初始化阶段,这时会执行一些初始化工作,包括加载Mybatis的配置文件、创建数据库连接池等操作。 操作阶段: SqlSession对象创建完成后,在使用过程中,我们可以对数据库进行增、删、改、查等操作。每个操作都需要重新获取一个SqlSession对象。在操作阶段,SqlSession对数据库进行的操作都是在同一个数据库连接上实现的,因此操作的数据都是在同一个事务中的。如果在操作时发生了异常,SqlSession将会回滚之前的操作。在操作完成后,如果没有调用commit或rollback方法来结束事务,则 SqlSession会对错误进行回滚操作。 关闭阶段: 当SqlSession使用完后,需要调用close()方法来关闭它,同时释放它所占用的资源。SqlSession的关闭操作也会导致其所占用的数据库连接被关闭。如果在操作阶段中,事务没有结束,那么关闭SqlSession时,Mybatis会自动执行rollback操作。建议在访问数据库的操作结束后,尽早地关闭SqlSession对象,以释放资源。 总之,SqlSessionMybatis框架的重要组成部分,它负责对数据库的访问操作。SqlSession有三个阶段:初始化、操作、关闭。用户需要在合适的时候关闭SqlSession,以释放资源、避免内存溢出等问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值