mybatis之mybatis与spring集成

it2023-08-15  67

mybatis与spring集成

mybatis与spring集成,其实就是将SqlSessionFactory的创建交给spring管理分页辅助类附录

mybatis与spring集成,其实就是将SqlSessionFactory的创建交给spring管理

添加相关依赖 添加spring相关依赖 详情见资料“spring.pom.txt” <!--5.0.1.RELEASE有冲突--> <spring.version>5.0.2.RELEASE</spring.version> <!-- ********************** spring依赖 ********************** --> <!--1)spring核心依赖--> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-core</artifactId> <version>${spring.version}</version> </dependency> <!--spring ioc依赖 --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-beans</artifactId> <version>${spring.version}</version> </dependency> <!--spring 扩展依赖 --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>${spring.version}</version> </dependency> <!--2)spring dao层依赖--> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-orm</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-tx</artifactId> <version>${spring.version}</version> </dependency> <!--3)aop相关依赖 --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-aspects</artifactId> <version>${spring.version}</version> </dependency> <!--4)spring web相关依赖 --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-web</artifactId> <version>${spring.version}</version> </dependency> <!--5) spring test相关依赖 --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-test</artifactId> <version>${spring.version}</version> </dependency> <!--6)springMVC框架目前用不着,下门课程--> <!--<dependency>--> <!--<groupId>org.springframework</groupId>--> <!--<artifactId>spring-webmvc</artifactId>--> <!--<version>${spring.version}</version>--> <!--</dependency>--> spring整合mybatis <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis-spring</artifactId> <version>1.3.1</version> </dependency> 添加dbcp2连接池依赖 <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-dbcp2</artifactId> <version>2.1.1</version> </dependency> <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-pool2</artifactId> <version>2.4.3</version> </dependency> 创建spring配置文件spring.xml,并进行相关配置

spring.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" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> <!--1. 引入外部properties文件 --> <bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> <property name="systemPropertiesModeName" value="SYSTEM_PROPERTIES_MODE_OVERRIDE" /> <property name="ignoreResourceNotFound" value="true" /> <property name="locations"> <list> <value>classpath:jdbc.properties</value> <!--<value>classpath:config.properties</value>--> <!--<value>classpath:shiro-config.properties</value>--> </list> </property> </bean> <import resource="spring-mybatis.xml"/> <!--<import resource="spring-shiro.xml"/>--> </beans>

spring-mybatis.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:tx="http://www.springframework.org/schema/tx" xmlns:aop="http://www.springframework.org/schema/aop" 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/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"> <!--1. 注解式开发 --> <!--1) 注解驱动 --> <context:annotation-config/> <!--2) 用注解方式注入bean,并指定查找范围:com.zking.oa及子子孙孙包--> <context:component-scan base-package="com.tang"/> <!-- 已在spring.xml中配置,只能引入一次 --> <!--2. 引入外置jdbc配置文件 --> <!--<bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">--> <!--<property name="location" value="classpath:jdbc.properties"/>--> <!--</bean>--> <!--3. dbcp2数据库连接池配置--> <bean id="dataSource" class="org.apache.commons.dbcp2.BasicDataSource" destroy-method="close"> <property name="driverClassName" value="${jdbc.driver}"/> <property name="url" value="${jdbc.url}"/> <property name="username" value="${jdbc.username}"/> <property name="password" value="${jdbc.password}"/> <!--初始连接数--> <property name="initialSize" value="10"/> <!--最大活动连接数--> <property name="maxTotal" value="100"/> <!--最大空闲连接数--> <property name="maxIdle" value="50"/> <!--最小空闲连接数--> <property name="minIdle" value="10"/> <!--设置为-1时,如果没有可用连接,连接池会一直无限期等待,直到获取到连接为止。--> <!--如果设置为N(毫秒),则连接池会等待N毫秒,等待不到,则抛出异常--> <property name="maxWaitMillis" value="-1"/> </bean> <!--4. spring和MyBatis整合 --> <!--1) 创建sqlSessionFactory--> <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> <!-- 指定数据源 --> <property name="dataSource" ref="dataSource"/> <!-- 指定mybatis核心配置文件 --> <!--<property name="configLocation" value="classpath:mybatis.cfg.xml"/>--> <!-- 自动扫描XxxMapping.xml文件,**任意路径 --> <property name="mapperLocations" value="classpath:mapper/*.xml"/> <!-- 指定别名 --> <property name="typeAliasesPackage" value="com.tang.model"/> <!--setting设置:日志、二级缓存--> <property name="configuration"> <bean class="org.apache.ibatis.session.Configuration"> <property name="logImpl"> <value>org.apache.ibatis.logging.slf4j.Slf4jImpl</value> </property> <property name="cacheEnabled"> <value>true</value> </property> </bean> </property> <!--插件配置--> <property name="plugins"> <list> <!--分页插件--> <bean class="com.github.pagehelper.PageInterceptor"> <property name="properties"> <props> <!--分页合理化--> <prop key="reasonable">true</prop> <!--当设置为true的时候,如果pagesize设置为0--> <prop key="pageSizeZero">true</prop> <!--是否支持接口参数来传递分页参数,默认false--> <prop key="supportMethodsArguments">true</prop> <!--指定数据库--> <prop key="helperDialect">mysql</prop> </props> </property> </bean> </list> </property> </bean> <!--2) 自动扫描com/zking/oa/**/mapper下的所有XxxMapper接口(其实就是DAO接口),并实现这些接口,--> <!-- 即可直接在程序中使用dao接口,不用再获取sqlsession对象--> <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"> <!--basePackage 属性是映射器接口文件的包路径。--> <!--你可以使用分号或逗号 作为分隔符设置多于一个的包路径--> <property name="basePackage" value="com/tang/**/mapper"/> <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/> </bean> <!--5. 注解式事务配置开始 --> <!--1) 事务管理器 --> <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dataSource"/> </bean> <!--2) 开启事务注解 --> <tx:annotation-driven transaction-manager="transactionManager"/> <!-- 注解式事务配置结束 --> <!--6) 开启自动代理 --> <aop:aspectj-autoproxy/> </beans> 注解式开发引入外置jdbc配置文件dbcp2数据库连接池配置spring和MyBatis整合注解式事务配置开始

注:还可以在idea中添加对spring开发的支持:Project Structure --> Facets --> Spring

点击进行了解注解式开发 @Component@Scope@Repository@Service@Constroller@Autowired@Resource@Transactional Spring Test+JUnit完美组合 在工程的pom文件中增加spring-test的依赖 <dependency> <groupId>org.springframework</groupId> <artifactId>spring-test</artifactId> <version>${spring.version}</version> </dependency> 创建BaseTestCase,并在该类上加上两个注解: @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(locations={"classpath:spring.xml"}) 修改分页代码: 使用AOP编程解决分页代码重复的问题 注1:AOP分页实现“PageBeanAspect.java” package com.zking.ssm.util; import com.github.pagehelper.PageHelper; import com.github.pagehelper.PageInfo; import org.aspectj.lang.ProceedingJoinPoint; import org.aspectj.lang.annotation.Around; import org.aspectj.lang.annotation.Aspect; import org.springframework.stereotype.Component; import java.util.List; /** * aop环绕通知,在*Biz.list*()方法前后执行,与mybatis的PageHelper插件一起完成PageBean的初始化 * * @author Administrator */ @Component @Aspect public class PageBeanAspect { @Around(value = "execution(* *..*Service.list*(..))") public Object invoke(ProceedingJoinPoint joinPoint) throws Throwable { // 取出PageBean Object[] args = joinPoint.getArgs(); PageBean pageBean = null; for (Object obj : args) { if (obj instanceof PageBean) { pageBean = (PageBean) obj; break; } } // 如果分页,指定分页参数 if (null != pageBean && pageBean.isPagination()) { PageHelper.startPage(pageBean.getPage(), pageBean.getRows()); } Object returnValue = joinPoint.proceed(args); // 如果分页,获得总记录数 if (null != pageBean && pageBean.isPagination() && null != returnValue && returnValue instanceof List) { List list = (List) returnValue; PageInfo pageInfo = new PageInfo(list); Long total = pageInfo.getTotal(); pageBean.setTotal(total.intValue()); } return returnValue; } }

分页辅助类

PageBean.java

package com.tang.util; /** * 分页工具类 * */ public class PageBean { private int page = 1;// 页码 private int rows = 10;// 页大小 private int total = 0;// 总记录数 private boolean pagination = true;// 是否分页 public PageBean() { super(); } public int getPage() { return page; } public void setPage(int page) { this.page = page; } public int getRows() { return rows; } public void setRows(int rows) { this.rows = rows; } public int getTotal() { return total; } public void setTotal(int total) { this.total = total; } public void setTotal(String total) { this.total = Integer.parseInt(total); } public boolean isPagination() { return pagination; } public void setPagination(boolean pagination) { this.pagination = pagination; } /** * 获得起始记录的下标 * * @return */ public int getStartIndex() { return (this.page - 1) * this.rows; } @Override public String toString() { return "PageBean [page=" + page + ", rows=" + rows + ", total=" + total + ", pagination=" + pagination + "]"; } }

附录

DBCP 注:dbcp是apache上的一个java 连接池项目 现在分成了3个大版本,不同的版本要求的JDK不同: DBCP 2 compiles and runs under Java 7 only (JDBC 4.1) DBCP 1.4 compiles and runs under Java 6 only (JDBC 4) DBCP 1.3 compiles and runs under Java 1.4-5 only (JDBC 3)
最新回复(0)