目录
一.Spring整合Mybatis
1.什么是Spring整合Mybatis
新建一个ssm
编辑
导入pom依赖
导入generatorConfig.xml
导入Spring-context.xml文件
导入Spring-mybatis.xml文件
自动生成Bookmapper.xml和Bookmapper文件
编写接口类:Bookbiz
编写接口实现类
编写实体类
编辑
编写接口测试类
测试结果
二.aop整合pageHelper分页插件
1.什么是aop整合pageHelper分页插件
编写分页查询
编辑
编写PageBean
编写PagerAspect类
测试结果
Spring整合MyBatis是一种常用的Java后端开发技术,用于将Spring框架与MyBatis框架进行集成,实现更方便和高效地操作数据库。
Spring框架是一个功能强大的轻量级应用程序开发框架,它提供了依赖注入(DI)和面向切面编程(AOP)等特性,可以帮助开发者更好地管理和组织应用程序的组件。
MyBatis是一个优秀的持久层框架,它通过XML或注解的方式,将SQL语句与Java对象之间的映射关系定义起来,提供了灵活的数据访问和数据库操作功能。
Spring整合MyBatis的主要目的是通过Spring的依赖注入和事务管理等特性,简化MyBatis的配置和代码编写。通过集成,可以将MyBatis作为Spring的一个Bean来管理,通过注入的方式获取MyBatis的SqlSessionFactory,从而简化数据库操作的配置和调用。
具体来说,Spring整合MyBatis的步骤包括以下几个方面:
- 引入相关的依赖,包括Spring框架和MyBatis框架的依赖;
- 配置Spring的配置文件,包括定义数据源、事务管理器等Bean,并引入MyBatis的配置文件;
- 配置MyBatis的配置文件,定义数据库连接信息、映射文件等;
- 编写DAO接口和Mapper文件,定义数据库操作的接口和SQL语句;
- 在Spring的配置文件中配置MyBatis的Mapper扫描和注入。
通过Spring整合MyBatis,开发者可以充分利用两个框架的优势,实现数据库操作的便捷和高效。
4.0.0
com.zking
yxssm
1.0-SNAPSHOT
war
yxssm Maven Webapp
http://www.example.com
UTF-8
1.8
1.8
3.7.0
5.0.2.RELEASE
3.4.5
5.1.44
5.1.2
1.3.1
2.1.1
2.4.3
2.9.1
4.12
4.0.0
1.18.2
org.springframework
spring-context
${spring.version}
org.springframework
spring-orm
${spring.version}
org.springframework
spring-tx
${spring.version}
org.springframework
spring-aspects
${spring.version}
org.springframework
spring-web
${spring.version}
org.springframework
spring-test
${spring.version}
org.mybatis
mybatis
${mybatis.version}
mysql
mysql-connector-java
${mysql.version}
com.github.pagehelper
pagehelper
${pagehelper.version}
org.mybatis
mybatis-spring
${mybatis.spring.version}
org.apache.commons
commons-dbcp2
${commons.dbcp2.version}
org.apache.commons
commons-pool2
${commons.pool2.version}
org.apache.logging.log4j
log4j-core
${log4j2.version}
org.apache.logging.log4j
log4j-api
${log4j2.version}
org.apache.logging.log4j
log4j-web
${log4j2.version}
junit
junit
${junit.version}
javax.servlet
javax.servlet-api
${servlet.version}
provided
org.projectlombok
lombok
${lombok.version}
provided
yxssm
src/main/java
**/*.xml
src/main/resources
jdbc.properties
*.xml
org.apache.maven.plugins
maven-compiler-plugin
${maven.compiler.plugin.version}
${maven.compiler.target}
${project.build.sourceEncoding}
org.mybatis.generator
mybatis-generator-maven-plugin
1.3.2
mysql
mysql-connector-java
${mysql.version}
true
maven-clean-plugin
3.1.0
maven-resources-plugin
3.0.2
maven-compiler-plugin
3.8.0
maven-surefire-plugin
2.22.1
maven-war-plugin
3.2.2
maven-install-plugin
2.5.2
maven-deploy-plugin
2.8.2
helperDialect=mysql
注意:右边的mybatis-generator:generate,点一次就OK了,点了两次他就会生成两个Bookmapper.xml文件
package com.zking.biz;
import com.zking.model.Book;
/**
* @author bing人
* @site
* @company xy集团
* @create 2023-08-25 14:57
*/
public interface BookBiz {
int deleteByPrimaryKey(Integer bid);
int insert(Book record);
int insertSelective(Book record);
Book selectByPrimaryKey(Integer bid);
int updateByPrimaryKeySelective(Book record);
int updateByPrimaryKey(Book record);
}
package com.zking.biz.impl;
import com.zking.biz.BookBiz;
import com.zking.mapper.BookMapper;
import com.zking.model.Book;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
/**
* @author bing人
* @site
* @company xy集团
* @create 2023-08-25 15:00
*/
@Service
public class BookBizImpl implements BookBiz {
@Autowired
private BookMapper bookMapper;
@Override
public int deleteByPrimaryKey(Integer bid) {
return bookMapper.deleteByPrimaryKey(bid);
}
@Override
public int insert(Book record) {
return bookMapper.insert(record);
}
@Override
public int insertSelective(Book record) {
return bookMapper.insertSelective(record);
}
@Override
public Book selectByPrimaryKey(Integer bid) {
return bookMapper.selectByPrimaryKey(bid);
}
@Override
public int updateByPrimaryKeySelective(Book record) {
return updateByPrimaryKeySelective(record);
}
@Override
public int updateByPrimaryKey(Book record) {
return bookMapper.updateByPrimaryKey(record);
}
}
package com.zking.biz.impl;
import com.zking.biz.BookBiz;
import com.zking.model.Book;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import static org.junit.Assert.*;
/**
* @author bing人
* @site
* @company xy集团
* @create 2023-08-25 15:06
*/
//自动加载上下文
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations={"classpath:spring-context.xml"})
public class BookBizImplTest {
@Autowired
private BookBiz bookBiz;
@Before
public void setUp() throws Exception {
}
@After
public void tearDown() throws Exception {
}
@Test
public void deleteByPrimaryKey() {
this.bookBiz.deleteByPrimaryKey(41);
}
@Test
public void insert() {
}
@Test
public void insertSelective() {
}
@Test
public void selectByPrimaryKey() {
System.out.println(this.bookBiz.selectByPrimaryKey(41));
}
@Test
public void updateByPrimaryKeySelective() {
}
@Test
public void updateByPrimaryKey() {
}
}
AOP整合PageHelper分页插件的目的是为了在应用程序中实现自动分页的功能,减少代码的重复编写和维护工作。通过AOP的方式,可以在方法执行前拦截方法调用,并在拦截器中加入PageHelper的分页逻辑。
具体来说,AOP整合PageHelper分页插件的步骤如下:
- 引入相关依赖,包括Spring框架、MyBatis框架、PageHelper插件等;
- 配置PageHelper的属性,如数据库类型、分页参数等;
- 编写AOP切面类,使用AOP的注解或者XML配置定义切面逻辑;
- 在切面中拦截需要分页的方法,并使用PageHelper.startPage()方法来进行分页设置;
- 在DAO层的方法上添加分页查询相关的注解,如@Select、@SelectProvider等。
通过AOP整合PageHelper分页插件,可以简化分页查询的代码编写,使得业务逻辑更加清晰和可维护。同时,该方式也可以方便地对分页参数进行统一管理和配置。
package com.zking.utils;
import javax.servlet.http.HttpServletRequest;
import java.io.Serializable;
import java.util.Map;
public class PageBean implements Serializable {
private static final long serialVersionUID = 2422581023658455731L;
//页码
private int page=1;
//每页显示记录数
private int rows=10;
//总记录数
private int total=0;
//是否分页
private boolean isPagination=true;
//上一次的请求路径
private String url;
//获取所有的请求参数
private Map map;
public PageBean() {
super();
}
//设置请求参数
public void setRequest(HttpServletRequest req) {
String page=req.getParameter("page");
String rows=req.getParameter("rows");
String pagination=req.getParameter("pagination");
this.setPage(page);
this.setRows(rows);
this.setPagination(pagination);
this.url=req.getContextPath()+req.getServletPath();
this.map=req.getParameterMap();
}
public String getUrl() {
return url;
}
public void setUrl(String url) {
this.url = url;
}
public Map getMap() {
return map;
}
public void setMap(Map map) {
this.map = map;
}
public int getPage() {
return page;
}
public void setPage(int page) {
this.page = page;
}
public void setPage(String page) {
if(null!=page&&!"".equals(page.trim()))
this.page = Integer.parseInt(page);
}
public int getRows() {
return rows;
}
public void setRows(int rows) {
this.rows = rows;
}
public void setRows(String rows) {
if(null!=rows&&!"".equals(rows.trim()))
this.rows = Integer.parseInt(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 isPagination;
}
public void setPagination(boolean isPagination) {
this.isPagination = isPagination;
}
public void setPagination(String isPagination) {
if(null!=isPagination&&!"".equals(isPagination.trim()))
this.isPagination = Boolean.parseBoolean(isPagination);
}
/**
* 获取分页起始标记位置
* @return
*/
public int getStartIndex() {
//(当前页码-1)*显示记录数
return (this.getPage()-1)*this.rows;
}
/**
* 末页
* @return
*/
public int getMaxPage() {
int totalpage=this.total/this.rows;
if(this.total%this.rows!=0)
totalpage++;
return totalpage;
}
/**
* 下一页
* @return
*/
public int getNextPage() {
int nextPage=this.page+1;
if(this.page>=this.getMaxPage())
nextPage=this.getMaxPage();
return nextPage;
}
/**
* 上一页
* @return
*/
public int getPreivousPage() {
int previousPage=this.page-1;
if(previousPage<1)
previousPage=1;
return previousPage;
}
@Override
public String toString() {
return "PageBean [page=" + page + ", rows=" + rows + ", total=" + total + ", isPagination=" + isPagination
+ "]";
}
}
package com.zking.aspect;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.zking.model.Book;
import com.zking.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;
/**
* @author bing人
* @site
* @company xy集团
* @create 2023-08-25 16:33
*/
@Aspect //代表当前类为切面类
@Component //代表当前类交给spring进行管理
public class PagerAspect {
@Around("execution(* *..*Biz.*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 info = new PageInfo((List) lst);
pageBean.setTotal((int)info.getTotal());
}
return lst;
}
}