引言
在开发Java应用程序时,我们经常需要使用到持久化框架来操作数据库。Spring和MyBatis都是非常受欢迎的Java开发框架,它们各自具有独特的优势。本篇博客将介绍如何通过Spring集成MyBatis,以及如何利用Spring集成PageHelper解决冗余代码问题。
首先,在pom.xml文件中添加MyBatis和Spring相关的依赖。这些依赖包括了MyBatis核心库、数据库驱动以及Spring所需的依赖。
<properties>
<project.build.sourceEncoding>UTF-8project.build.sourceEncoding>
<maven.compiler.source>1.8maven.compiler.source>
<maven.compiler.target>1.8maven.compiler.target>
<maven.compiler.plugin.version>3.7.0maven.compiler.plugin.version>
<spring.version>5.0.2.RELEASEspring.version>
<mybatis.version>3.4.5mybatis.version>
<mysql.version>5.1.44mysql.version>
<pagehelper.version>5.1.2pagehelper.version>
<mybatis.spring.version>1.3.1mybatis.spring.version>
<commons.dbcp2.version>2.1.1commons.dbcp2.version>
<commons.pool2.version>2.4.3commons.pool2.version>
<log4j2.version>2.9.1log4j2.version>
<junit.version>4.12junit.version>
<servlet.version>4.0.0servlet.version>
<lombok.version>1.18.2lombok.version>
properties>
<dependencies>
<dependency>
<groupId>org.springframeworkgroupId>
<artifactId>spring-contextartifactId>
<version>${spring.version}version>
dependency>
<dependency>
<groupId>org.springframeworkgroupId>
<artifactId>spring-ormartifactId>
<version>${spring.version}version>
dependency>
<dependency>
<groupId>org.springframeworkgroupId>
<artifactId>spring-txartifactId>
<version>${spring.version}version>
dependency>
<dependency>
<groupId>org.springframeworkgroupId>
<artifactId>spring-aspectsartifactId>
<version>${spring.version}version>
dependency>
<dependency>
<groupId>org.springframeworkgroupId>
<artifactId>spring-webartifactId>
<version>${spring.version}version>
dependency>
<dependency>
<groupId>org.springframeworkgroupId>
<artifactId>spring-testartifactId>
<version>${spring.version}version>
dependency>
<dependency>
<groupId>org.mybatisgroupId>
<artifactId>mybatisartifactId>
<version>${mybatis.version}version>
dependency>
<dependency>
<groupId>mysqlgroupId>
<artifactId>mysql-connector-javaartifactId>
<version>${mysql.version}version>
dependency>
<dependency>
<groupId>com.github.pagehelpergroupId>
<artifactId>pagehelperartifactId>
<version>${pagehelper.version}version>
dependency>
<dependency>
<groupId>org.mybatisgroupId>
<artifactId>mybatis-springartifactId>
<version>${mybatis.spring.version}version>
dependency>
<dependency>
<groupId>org.apache.commonsgroupId>
<artifactId>commons-dbcp2artifactId>
<version>${commons.dbcp2.version}version>
dependency>
<dependency>
<groupId>org.apache.commonsgroupId>
<artifactId>commons-pool2artifactId>
<version>${commons.pool2.version}version>
dependency>
<dependency>
<groupId>org.apache.logging.log4jgroupId>
<artifactId>log4j-coreartifactId>
<version>${log4j2.version}version>
dependency>
<dependency>
<groupId>org.apache.logging.log4jgroupId>
<artifactId>log4j-apiartifactId>
<version>${log4j2.version}version>
dependency>
<dependency>
<groupId>org.apache.logging.log4jgroupId>
<artifactId>log4j-webartifactId>
<version>${log4j2.version}version>
dependency>
<dependency>
<groupId>junitgroupId>
<artifactId>junitartifactId>
<version>${junit.version}version>
<scope>testscope>
dependency>
<dependency>
<groupId>javax.servletgroupId>
<artifactId>javax.servlet-apiartifactId>
<version>${servlet.version}version>
<scope>providedscope>
x dependency>
<dependency>
<groupId>org.projectlombokgroupId>
<artifactId>lombokartifactId>
<version>${lombok.version}version>
<scope>providedscope>
dependency>
dependencies>
小提示:
连接池的主要作用是减少数据库连接的创建和销毁次数,从而提高应用程序的性能。除此之外,连接池还有以下优点:1、简化的编程模式在使用连接池的时候,每一个单独的线程能够像创建了一个自己的 JDBC 连接一样操作,允许用户直接使用JDBC编程技术;2、受控的资源使用如果用户不使用连接池,而是每当线程需要时创建一个新的连接,那么用户的应用程序的资源使用会产生非常大的浪费并且可能会导致高负载下的异常发生;3、减少连接创建时间 。
除了dbcp2以外还有druid、c3p0都是连接池。
lombok介绍
Lombok是一个Java库,能自动插入编辑器并构建工具,简化Java开发。通过添加注解的方式,不需要为类编写getter或eques方法,同时可以自动化日志变量 。Lombok能以简单的注解形式来简化java代码,提高开发人员的开发效率 。
接下来,我们需要配置一些必要的文件。可以通过XML或注解的方式进行配置。在这里,我们将使用XML配置文件来完成Spring集成MyBatis的配置工作。
resource文件下
generatorConfig.xml
DOCTYPE generatorConfiguration PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN"
"http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd" >
<generatorConfiguration>
<properties resource="jdbc.properties"/>
<classPathEntry location="D:\\temp1\mvn_repository\\mysql\\mysql-connector-java\\5.1.44\\mysql-connector-java-5.1.44.jar"/>
<context id="infoGuardian">
<commentGenerator>
<property name="suppressAllComments" value="true"/>
<property name="suppressDate" value="true"/>
commentGenerator>
<jdbcConnection driverClass="${jdbc.driver}"
connectionURL="${jdbc.url}" userId="${jdbc.username}" password="${jdbc.password}"/>
<javaTypeResolver>
<property name="forceBigDecimals" value="false"/>
javaTypeResolver>
<javaModelGenerator targetPackage="com.niyin.model"
targetProject="src/main/java">
<property name="enableSubPackages" value="false"/>
<property name="constructorBased" value="true"/>
<property name="trimStrings" value="false"/>
<property name="immutable" value="false"/>
javaModelGenerator>
<sqlMapGenerator targetPackage="com.niyin.mapper"
targetProject="src/main/java">
<property name="enableSubPackages" value="false"/>
sqlMapGenerator>
<javaClientGenerator targetPackage="com.niyin.mapper"
targetProject="src/main/java" type="XMLMAPPER">
<property name="enableSubPackages" value="false"/>
javaClientGenerator>
<table schema="" tableName="t_mvc_Book" domainObjectName="Book"
enableCountByExample="false" enableDeleteByExample="false"
enableSelectByExample="false" enableUpdateByExample="false">
table>
context>
generatorConfiguration>
log4j2.xml
<Configuration status="WARN" monitorInterval="30">
<Properties>
<Property name="LOG_HOME">/root/workspace/lucenedemo/logsProperty>
<property name="ERROR_LOG_FILE_NAME">/root/workspace/lucenedemo/logs/errorproperty>
<property name="WARN_LOG_FILE_NAME">/root/workspace/lucenedemo/logs/warnproperty>
<property name="PATTERN">%d{yyyy-MM-dd HH:mm:ss.SSS} [%t-%L] %-5level %logger{36} - %msg%nproperty>
Properties>
<Appenders>
<Console name="Console" target="SYSTEM_OUT">
<ThresholdFilter level="trace" onMatch="ACCEPT"
onMismatch="DENY" />
<PatternLayout pattern="${PATTERN}" />
Console>
<File name="log" fileName="logs/test.log" append="false">
<PatternLayout
pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n" />
File>
<RollingFile name="RollingFileInfo" fileName="${LOG_HOME}/info.log"
filePattern="${LOG_HOME}/$${date:yyyy-MM}/info-%d{yyyy-MM-dd}-%i.log">
<ThresholdFilter level="info" onMatch="ACCEPT"
onMismatch="DENY" />
<PatternLayout
pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n" />
<Policies>
<TimeBasedTriggeringPolicy interval="1"
modulate="true" />
Policies>
RollingFile>
<RollingFile name="RollingFileWarn" fileName="${WARN_LOG_FILE_NAME}/warn.log"
filePattern="${WARN_LOG_FILE_NAME}/$${date:yyyy-MM}/warn-%d{yyyy-MM-dd}-%i.log">
<ThresholdFilter level="warn" onMatch="ACCEPT"
onMismatch="DENY" />
<PatternLayout
pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n" />
<Policies>
<TimeBasedTriggeringPolicy />
<SizeBasedTriggeringPolicy size="2 kB" />
Policies>
<DefaultRolloverStrategy max="20" />
RollingFile>
<RollingFile name="RollingFileError" fileName="${ERROR_LOG_FILE_NAME}/error.log"
filePattern="${ERROR_LOG_FILE_NAME}/$${date:yyyy-MM}/error-%d{yyyy-MM-dd-HH-mm}-%i.log">
<ThresholdFilter level="error" onMatch="ACCEPT"
onMismatch="DENY" />
<PatternLayout
pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n" />
<Policies>
<TimeBasedTriggeringPolicy interval="1"
modulate="true" />
Policies>
RollingFile>
Appenders>
<Loggers>
<logger name="org.springframework" level="INFO">logger>
<logger name="org.mybatis" level="INFO">logger>
<logger name="org.springframework" level="ERROR" />
<logger name="org.hibernate" level="ERROR" />
<logger name="org.apache.struts2" level="ERROR" />
<logger name="com.opensymphony.xwork2" level="ERROR" />
<logger name="org.jboss" level="ERROR" />
<root level="all">
<appender-ref ref="Console" />
<appender-ref ref="RollingFileInfo" />
<appender-ref ref="RollingFileWarn" />
<appender-ref ref="RollingFileError" />
root>
Loggers>
Configuration>
spring-context-spring
<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">
<import resource="classpath:spring-mybatis.xml">import>
beans>
spring-mybatis.xml
<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">
<context:annotation-config/>
<context:component-scan base-package="com.niyin"/>
<context:property-placeholder location="classpath:jdbc.properties"/>
<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"/>
<property name="maxWaitMillis" value="-1"/>
bean>
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource"/>
<property name="mapperLocations" value="classpath*:com/niyin/**/mapper/*.xml"/>
<property name="typeAliasesPackage" value="com/niyin/**/model"/>
<property name="plugins">
<array>
<bean class="com.github.pagehelper.PageInterceptor">
<property name="properties">
<value>
helperDialect=mysql
value>
property>
bean>
array>
property>
bean>
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="com/niyin/**/mapper"/>
<property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/>
bean>
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource" />
bean>
<tx:annotation-driven transaction-manager="transactionManager" />
<aop:aspectj-autoproxy/>
beans>
首先,我们需要告诉Spring要扫描哪些JavaBean。可以通过配置context:component-scan标签来实现自动扫描。
接下来,我们需要配置数据源信息,包括数据库的URL、用户名、密码等。可以使用Spring提供的标签来配置数据源。
然后,我们需要配置MyBatis的SqlSessionFactory,用于创建和管理数据库会话。可以使用Spring提供的标签来配置SqlSessionFactory。
接着,我们需要告诉MyBatis要扫描哪些mapper接口。可以使用Spring提供的标签来配置mapper扫描接口。
在操作数据库时,事务管理是非常重要的一部分。可以使用Spring提供的标签来配置事务管理器。
最后,我们可以通过配置AOP自动代理来简化代码。可以使用Spring提供的aop:config标签来配置AOP。
完成以上配置后,我们可以进行简单的测试来验证Spring集成MyBatis是否成功。可以编写一个简单的Java程序来查询数据库并输出结果,以确保整合工作正常。
package com.niyin.model;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Book {
private Integer bid;
private String bname;
private Float price;
}`
impl
public Book selectByPrimaryKey(Integer bid) {
return bookMapper.selectByPrimaryKey(bid);
}
测试类text
public void selectByPrimaryKey() {
System.out.println(this.bookbiz.selectByPrimaryKey(88));
}
可以看到一样可以查到数据到这里看到结果就说明我们已经将Spring与MyBatis进行整合了。
在项目开发中,经常需要处理分页查询的业务逻辑。PageHelper是一个强大的分页插件,可以帮助我们快速而方便地实现分页功能。
<select id="listPager" resultType="com.niyin.model.Book" parameterType="com.niyin.model.Book" >
select
<include refid="Base_Column_List" />
from t_mvc_book
<where>
<if test="bname !=null">
and bname like concat('%',#{bname},'%')
if>
where>
select>
bookmap
List<Book> listPager(Book book);
impl
public Book selectByPrimaryKey(Integer bid) {
return bookMapper.selectByPrimaryKey(bid);
}
PagerAspect
package com.niyin.aspect;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.niyin.utils.PageBean;
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;
@Aspect
@Component
public class PagerAspect {
@Around("execution(* *..*Service.*Pager(..))")
public Object invoke(ProceedingJoinPoint args) throws Throwable {
PageBean pageBean=null;
Object[] ags = args.getArgs();
for (Object param:ags){
if (param instanceof PageBean){
pageBean=(PageBean)param;
break;
}
}
if (pageBean!=null&& pageBean.isPagination()){
PageHelper.startPage(pageBean.getPage(),pageBean.getRows());
}
Object lst = args.proceed();
if(pageBean!=null && pageBean.isPagination()){
PageInfo pageInfo = new PageInfo((List) lst);
pageBean.setTotal((int) pageInfo.getTotal());
}
return lst;
}
}
测试一下
@Test
public void listPager() {
Book book =new Book();
PageBean pageBean=new PageBean();
pageBean.setPage(2);
pageBean.setRows(30);
book.setBname("圣墟");
this.bookbiz.listPager(book,pageBean).forEach(System.out::println);
}
本篇博客主要介绍了如何通过Spring集成MyBatis和PageHelper来简化Java项目中的数据库操作和分页查询。通过对配置文件和依赖的设置,以及对必要组件的配置和使用,我们可以高效地完成这些任务。希望本篇博客能够对大家在实际开发中有所帮助。
3.1. 注解解释
@Data: 这个注解是Lombok库提供的,它可以自动为类生成常用的方法,如getter、setter、equals、hashCode等,从而简化了代码编写过程。
@AllArgsConstructor: 这个注解是Lombok库提供的,它会自动生成一个包含所有成员变量的构造函数,方便创建对象时初始化所有字段。
@NoArgsConstructor: 这个注解也是Lombok库提供的,它会自动生成一个无参构造函数,方便创建对象时不进行初始化。
@Repository: 这个注解是Spring框架提供的,用于标记数据访问组件,即DAO(Data Access Object)层的接口。Spring会自动扫描带有该注解的接口,并将其作为Bean进行管理。
@Service: 这个注解也是Spring框架提供的,与@Repository类似,用于标记服务层的接口。同样,Spring会自动扫描带有该注解的接口,并将其作为Bean进行管理。
@Autowired: 这个注解是Spring框架提供的,用于自动注入依赖关系。当使用@Autowired注解在字段、构造函数或方法上时,Spring会自动将匹配的Bean注入到对应的位置。
@RunWith(SpringJUnit4ClassRunner.class): 这个注解是JUnit框架提供的,用于指定测试运行器。@RunWith注解可以与不同的测试运行器组合使用,这里使用的是SpringJUnit4ClassRunner,它会加载Spring的配置并执行测试。
@ContextConfiguration(locations={“classpath:spring-context.xml”}): 这个注解是JUnit框架提供的,用于指定测试运行器的上下文配置。通过指定locations属性,可以告诉测试运行器从指定的文件加载Spring的配置文件。
@Component: 这个注解是Spring框架提供的,用于标记一个类为Spring的组件。当一个类被标记为@Component时,Spring会自动扫描并将其作为Bean进行管理。