MyBatis学习笔记-Spring集成DAO层实现方式记录
来源:互联网 发布:开淘宝保证金怎么退 编辑:程序博客网 时间:2024/05/16 17:13
Spring MyBatis 版本如下:
spring 4.2.6.RELEASE
mybatis 3.4.0
mybatis-spring 1.3.0
Spring集成MyBatis的DAO层两种实现方式如下
第一种基于传统DAO层接口实现类方式:
public interface IUserDAO extends IGenericDAO<User, Long> {}
@Repository("userDAO")public class UserDAOImpl extends GenericDAOImpl<User, Long> implements IUserDAO {}
@Repository("genericDAO")public class GenericDAOImpl<Entity extends Serializable, PK extends Serializable>extends SqlSessionDaoSupport implements IGenericDAO<Entity, PK> {@Resource(name = "sqlSessionTemplate")protected SqlSessionTemplate sqlSessionTemplate = null;public static final String INSERT = "insert";public static final String INSERT_BATCH = "insertBatch"; public static final String UPDATE = "update"; public static final String UPDATE_BATCH = "updateBatch"; public static final String DELETE_BY_PK = "deleteByPK"; public static final String READ_DATA_BY_PK = "readDataByPK"; public static final String READ_DATA_BY_CONDITION = "readDataByCondition"; public static final String READ_DATA_LIST_BY_CONDITION = "readDataListByCondition"; public static final String READ_DATA_PAGINATION_BY_CONDITION = "readDataPaginationByCondition"; public static final String READ_COUNT_BY_CONDITION = "readCountByCondition";private Class<Entity> entityClass = null;@SuppressWarnings("unchecked")public GenericDAOImpl() { Type type = getClass().getGenericSuperclass(); if (type instanceof ParameterizedType) { entityClass = (Class<Entity>) ((ParameterizedType) type).getActualTypeArguments()[0]; }}@Override@Resource(name = "sqlSessionTemplate")public void setSqlSessionTemplate(SqlSessionTemplate sqlSessionTemplate) {super.setSqlSessionTemplate(sqlSessionTemplate);}protected SqlSession sqlSession() {return sqlSessionTemplate.getSqlSessionFactory().openSession();}protected void closeSession(SqlSession sqlSession) {if (null != sqlSession) sqlSession.close();}protected SqlSession batchSqlSession() {return sqlSessionTemplate.getSqlSessionFactory().openSession(ExecutorType.BATCH);}protected String obtainSQLID(String sqlId) {Configuration configuration = sqlSessionTemplate.getConfiguration();String dialect = "mysql";if (null != configuration.getVariables()) {dialect = configuration.getVariables().getProperty("dialect");}StringBuffer sb = new StringBuffer();sb.append(dialect).append(".").append(entityClass.getName()).append(".").append(sqlId);return sb.toString();}@Overridepublic void insert(Entity entity) {sqlSessionTemplate.insert(obtainSQLID(INSERT), entity);}@Overridepublic void insert(List<Entity> entities) throws DataException {SqlSession sqlSession = batchSqlSession();for (int i = 0, len = entities.size(); i < len; i++) {sqlSession.insert(obtainSQLID(INSERT), entities.get(i));}sqlSession.flushStatements();closeSession(sqlSession);}@Overridepublic void update(Entity entity) {sqlSessionTemplate.update(obtainSQLID(UPDATE), entity);}@Overridepublic void update(List<Entity> entities) throws DataException {SqlSession sqlSession = batchSqlSession();for (int i = 0, len = entities.size(); i < len; i++) {sqlSession.update(obtainSQLID(UPDATE), entities.get(i));}sqlSession.flushStatements();closeSession(sqlSession);}@Overridepublic void delete(Entity entity) throws DataException {}@Overridepublic void deleteByPK(PK primaryKey) {sqlSessionTemplate.delete(obtainSQLID(DELETE_BY_PK), primaryKey);}@SuppressWarnings("unchecked")@Overridepublic Entity readDataByPK(PK pk) {return (Entity) sqlSessionTemplate.selectOne(obtainSQLID(READ_DATA_BY_PK), pk);}@SuppressWarnings("unchecked")@Overridepublic Entity readDataByCondition(Query query) {Map<String, Object> map = query.getCondition();return (Entity) sqlSessionTemplate.selectOne(obtainSQLID(READ_DATA_BY_CONDITION), map);}@SuppressWarnings("unchecked")@Overridepublic List<Entity> readDataListByCondition(Query query) throws DataException {Map<String, Object> map = query.getCondition();List<Object> resultList = (List<Object>) sqlSessionTemplate.selectList(obtainSQLID(READ_DATA_LIST_BY_CONDITION), map);List<Entity> entities = new ArrayList<Entity>();for (int i = 0, len = resultList.size(); i < len; i++) {entities.add((Entity) resultList.get(i));}return entities;}@SuppressWarnings("unchecked")@Overridepublic QueryResult<Entity> readDataPaginationByCondition(Query query) throws DataException {Map<String, Object> map = query.getCondition();List<Object> resultList = (List<Object>) sqlSessionTemplate.selectList(obtainSQLID(READ_DATA_PAGINATION_BY_CONDITION), map);List<Entity> entities = new ArrayList<Entity>();for (int i = 0, len = resultList.size(); i < len; i++) {entities.add((Entity) resultList.get(i));}int totalRowNum = (Integer) map.get(Query.TOTAL_ROW_NUM);return new QueryResult<Entity>(totalRowNum, entities);}@Overridepublic Long readCountByCondition(Query query) throws DataException {Map<String, Object> map = query.getCondition();return (Long) sqlSessionTemplate.selectOne(obtainSQLID(READ_COUNT_BY_CONDITION), map);}@Overridepublic void flush() throws DataException {sqlSessionTemplate.clearCache();}}
这里需要注意的是mybatis-spring 1.1.0或是之前版本,可以不用以下代码
@Override@Resource(name = "sqlSessionTemplate")public void setSqlSessionTemplate(SqlSessionTemplate sqlSessionTemplate) {super.setSqlSessionTemplate(sqlSessionTemplate);}
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"><property name="driverClassName" value="${driverClassName}"></property> <property name="url" value="${url}"></property> <property name="username" value="${username}"></property> <property name="password" value="${password}"></property> <property name="initialSize" value="${dbcp.initialSize}"></property> <property name="maxActive" value="${dbcp.maxActive}"></property> <property name="maxIdle" value="${dbcp.maxIdle}"></property> <property name="minIdle" value="${dbcp.minIdle}"></property> <property name="maxWait" value="${dbcp.maxWait}"></property> <property name="removeAbandoned" value="${dbcp.removeAbandoned}"></property> <property name="defaultAutoCommit" value="${dbcp.defaultAutoCommit}"></property> <property name="removeAbandonedTimeout" value="${dbcp.removeAbandonedTimeout}"></property> </bean> <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"><property name="dataSource" ref="dataSource" /><property name="typeAliasesPackage" value="org.plat.modules.user.entity" /><property name="configLocation" value="classpath:mybatis/mybatis-config.xml" /><property name="mapperLocations" value="classpath*:org/plat/modules/*/mapper/**/*.xml" /></bean><bean id="sqlSessionTemplate" class="org.mybatis.spring.SqlSessionTemplate"> <constructor-arg index="0" ref="sqlSessionFactory" /></bean>
typeAliasesPackage的多个选项可以用逗号分隔
<mapper namespace="mysql.org.plat.modules.user.entity.User">
传统DAO层的这种实现方式需要指定对应的SQLID。
第二种基于Mapper接口的动态代理方式:
@Repository("userMapper")public interface UserMapper extends GenericMapper<User, Long> {}
public interface GenericMapper <Entity extends Serializable, PK extends Serializable> {public void insert(Entity entity) throws DataException;public void insert(List<Entity> entities) throws DataException;public void update(Entity entity) throws DataException;public void update(List<Entity> entities) throws DataException;public void delete(Entity entity) throws DataException;public void deleteByPK(PK pk) throws DataException;public Entity readDataByPK(PK pk) throws DataException;public Entity readDataByCondition(Query query) throws DataException;public List<Entity> readDataListByCondition(Query query) throws DataException;public QueryResult<Entity> readDataPaginationByCondition(Query query) throws DataException;public Long readCountByCondition(Query query) throws DataException;public void flush() throws DataException;}
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"> <property name="basePackage" value="org.plat.modules.*.mapper" /> <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory" /></bean>
<mapper namespace="org.plat.modules.user.mapper.UserMapper">
Mappper代理的这种实现方式不需要指定对应的SQLID,接口类里面的方法名字即对应的SQLID,namespace需要指定到对应的Mapper接口。这里需要注意的是MapperScannerConfigurer的配置,可能会遇到无法加载DataSource相关属性的异常,这时候需要配置MapperScannerConfigurer的sqlSessionFactoryBeanName属性,并且检查下有没有配置default-autowire="byName",有的话去掉。
0 0
- MyBatis学习笔记-Spring集成DAO层实现方式记录
- mybatis源码学习--spring+mybatis注解方式为什么mybatis的dao接口不需要实现类
- mybatis源码学习--spring+mybatis注解方式为什么mybatis的dao接口不需要实现类
- mybatis源码学习--spring+mybatis注解方式为什么mybatis的dao接口不需要实现类
- Mybatis学习记录(二)--Mybatis开发DAO方式
- Mybatis学习记录(二)--Mybatis开发DAO方式
- Mybatis学习记录(二)--Mybatis开发DAO方式
- Mybatis学习笔记-Spring集成Mybatis
- 电商平台学习笔记(四)——Spring配置Mybatis简化DAO层省略Mybatis核心配置文件
- MyBatis学习记录(3):Mapper动态代理方式开发DAO
- Mybatis学习记录(五)--整合spring开发Dao
- Mybatis学习记录(五)--整合spring开发Dao
- mybatis学习笔记03--与spring集成
- Mybatis学习笔记五:集成Spring
- BBS项目笔记之一:Spring+Hibernate实现Dao层
- spring+mybatis通用dao层、service层的一些个人理解与实现
- spring+mybatis通用dao层、service层的一些个人理解与实现
- JAVA学习笔记(五十二)- 开发DAO层的经典实现
- Codeforces-Round-#363-Launch of Collider
- c++ this 指针的理解
- HDU 5724 Chess (博弈)
- 【js】检测CSS JS 文件是否被引入。
- hd 2098 分拆素数和
- MyBatis学习笔记-Spring集成DAO层实现方式记录
- 7. Reverse Integer
- Laravel在model类里关闭timestamps
- poj-1742 COINS(多重背包问题)
- 【杭电】[5053]the Sum of Cube
- linux中如何运行shell脚本
- 自己在学习Mybits的时候理解的一点sql注入的知识,以及处理的方法!
- postgres 升级8.4 -9.5 数据迁移
- Android中贼好用的网络框架----OkHttp