长沙旅游商贸职业技术学院,商丘市网络优化公司地址,全球知名设计公司,如何做婚庆公司的网站使用 SqlSession
在 MyBatis 中#xff0c;你可以使用 SqlSessionFactory 来创建 SqlSession。 一旦你获得一个 session 之后#xff0c;你可以使用它来执行映射了的语句#xff0c;提交或回滚连接#xff0c;最后#xff0c;当不再需要它的时候#xff0c;你可以关闭 s…
使用 SqlSession
在 MyBatis 中你可以使用 SqlSessionFactory 来创建 SqlSession。 一旦你获得一个 session 之后你可以使用它来执行映射了的语句提交或回滚连接最后当不再需要它的时候你可以关闭 session。 使用 MyBatis-Spring 之后你不再需要直接使用 SqlSessionFactory 了因为你的 bean 可以被注入一个线程安全的 SqlSession它能基于 Spring 的事务配置来自动提交、回滚、关闭 session。
SqlSessionTemplate
SqlSessionTemplate 是 MyBatis-Spring 的核心。作为 SqlSession 的一个实现这意味着可以使用它无缝代替你代码中已经在使用的 SqlSession。 SqlSessionTemplate 是线程安全的可以被多个 DAO 或映射器所共享使用。
当调用 SQL 方法时包括由 getMapper() 方法返回的映射器中的方法SqlSessionTemplate 将会保证使用的 SqlSession 与当前 Spring 的事务相关。 此外它管理 session 的生命周期包含必要的关闭、提交或回滚操作。另外它也负责将 MyBatis 的异常翻译成 Spring 中的 DataAccessExceptions。
由于模板可以参与到 Spring 的事务管理中并且由于其是线程安全的可以供多个映射器类使用你应该总是用 SqlSessionTemplate 来替换 MyBatis 默认的 DefaultSqlSession 实现。在同一应用程序中的不同类之间混杂使用可能会引起数据一致性的问题。
可以使用 SqlSessionFactory 作为构造方法的参数来创建 SqlSessionTemplate 对象。
bean idsqlSession classorg.mybatis.spring.SqlSessionTemplateconstructor-arg index0 refsqlSessionFactory /
/beanConfiguration
public class MyBatisConfig {Beanpublic SqlSessionTemplate sqlSession() throws Exception {return new SqlSessionTemplate(sqlSessionFactory());}
}现在这个 bean 就可以直接注入到你的 DAO bean 中了。你需要在你的 bean 中添加一个 SqlSession 属性就像下面这样
public class UserDaoImpl implements UserDao {private SqlSession sqlSession;public void setSqlSession(SqlSession sqlSession) {this.sqlSession sqlSession;}public User getUser(String userId) {return sqlSession.selectOne(org.mybatis.spring.sample.mapper.UserMapper.getUser, userId);}
}按下面这样注入 SqlSessionTemplate
bean iduserDao classorg.mybatis.spring.sample.dao.UserDaoImplproperty namesqlSession refsqlSession /
/beanSqlSessionTemplate 还有一个接收 ExecutorType 参数的构造方法。这允许你使用如下 Spring 配置来批量创建对象例如批量创建一些 SqlSession
bean idsqlSession classorg.mybatis.spring.SqlSessionTemplateconstructor-arg index0 refsqlSessionFactory /constructor-arg index1 valueBATCH /
/beanConfiguration
public class MyBatisConfig {Beanpublic SqlSessionTemplate sqlSession() throws Exception {return new SqlSessionTemplate(sqlSessionFactory(), ExecutorType.BATCH);}
}现在所有的映射语句可以进行批量操作了可以在 DAO 中编写如下的代码
public class UserService {private final SqlSession sqlSession;public UserService(SqlSession sqlSession) {this.sqlSession sqlSession;}public void insertUsers(ListUser users) {for (User user : users) {sqlSession.insert(org.mybatis.spring.sample.mapper.UserMapper.insertUser, user);}}
}注意只需要在希望语句执行的方法与 SqlSessionTemplate 中的默认设置不同时使用这种配置。
这种配置的弊端在于当调用这个方法时不能存在使用不同 ExecutorType 的进行中的事务。要么确保对不同 ExecutorType 的 SqlSessionTemplate 的调用处在不同的事务中要么完全不使用事务。
SqlSessionDaoSupport
SqlSessionDaoSupport 是一个抽象的支持类用来为你提供 SqlSession。调用 getSqlSession() 方法你会得到一个 SqlSessionTemplate之后可以用于执行 SQL 方法就像下面这样:
public class UserDaoImpl extends SqlSessionDaoSupport implements UserDao {public User getUser(String userId) {return getSqlSession().selectOne(org.mybatis.spring.sample.mapper.UserMapper.getUser, userId);}
}在这个类里面通常更倾向于使用 MapperFactoryBean因为它不需要额外的代码。但是如果你需要在 DAO 中做其它非 MyBatis 的工作或需要一个非抽象的实现类那么这个类就很有用了。
SqlSessionDaoSupport 需要通过属性设置一个 sqlSessionFactory 或 SqlSessionTemplate。如果两个属性都被设置了那么 SqlSessionFactory 将被忽略。
假设类 UserMapperImpl 是 SqlSessionDaoSupport 的子类可以编写如下的 Spring 配置来执行设置
bean iduserDao classorg.mybatis.spring.sample.dao.UserDaoImplproperty namesqlSessionFactory refsqlSessionFactory /
/bean