博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Mybatis+pageHelper实现兼容多数据库
阅读量:3933 次
发布时间:2019-05-23

本文共 7773 字,大约阅读时间需要 25 分钟。

@PostConstruct:

Java中该注解的说明:@PostConstruct该注解被用来修饰一个非静态的void()方法。被@PostConstruct修饰的方法会在服务器加载Servlet的时候运行,并且只会被服务器执行一次。PostConstruct在构造函数之后执行,init()方法之前执行。

1. Mybatis

MyBatis分页提供的是逻辑分页,每次将所有数据查询出来,存储到内存中,然后根据请求的页码,进行逐页返回。

1.1 PageHelper

2. Mybatis-Plus

官方介绍:

集成mybatisplus后,简单的CRUD就不用写了,如果没有特别的sql,就可以不用mapper的xml文件的。

com.baomidou
mybatis-plus-boot-starter
3.1.1

2.1 dao

  1. dao层接口(UserMapper)继承BaseMapper接口
    继承BaseMapper接口之后,就可以使用mybatisPlus封装的一系列增删改查方法。

UserMapper.java

package com.example.mapper.auto;import com.baomidou.mybatisplus.core.mapper.BaseMapper;import com.example.model.auto.User;import java.util.List;/** * 

* Mapper 接口 *

* * @author astupidcoder * @since 2020-05-13 */public interface UserMapper extends BaseMapper
{
public List
findAllUser();}

测试:

@RunWith(SpringRunner.class)@SpringBootTestpublic class SampleTest {
@Autowired private UserMapper userMapper; @Test public void testSelect() {
System.out.println(("----- selectAll method test ------")); // UserMapper 中的 selectList() 方法的参数为 MP 内置的条件封装器 Wrapper,所以不填写就是无任何条件 List
userList = userMapper.selectList(null); Assert.assertEquals(5, userList.size()); userList.forEach(System.out::println); }}

2.2 Service接口

  1. service接口(IUserService)继承IService接口
package com.example.service;import com.baomidou.mybatisplus.extension.service.IService;import com.example.model.auto.User;import java.util.List;/** * 

* 服务类 *

* * @author astupidcoder * @since 2020-05-13 */public interface IUserService extends IService
{
public List
findAllUser();}

2.3 Service实现类

  1. service实现类(UserServiceImpl)继承ServiceImpl,并实现相应的service接口(IUserService)
package com.example.service.impl;import com.example.model.auto.User;import com.example.mapper.auto.UserMapper;import com.example.service.IUserService;import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.stereotype.Service;import java.util.List;/** * 

* 服务实现类 *

* * @author astupidcoder * @since 2020-05-13 */@Servicepublic class UserServiceImpl extends ServiceImpl
implements IUserService {
@Autowired private UserMapper userMapper; @Override public List
findAllUser() {
return userMapper.findAllUser(); }}

2.4 实体类

实体类用到的注解:

  1. 表名注解@TableName(value = …)
  2. 字段注解@TableField(value = …)
// 当数据库名与实体类名不一致或不符合驼峰命名时,需要在此注解指定表名@TableName(value = "sys_user")public class sysUser {
// 用来解决数据库中的字段和实体类的字段不匹配问题 @TableField(value = "create_time") private Integet createTime; // 用来解决实体类中有的属性但是数据表中没有的字段 @TableField(exist = false) // 默认为true private Integet createTimeCn;}

2.5 自定义sql

MP自带的条件构造器虽然很强大,有时候也避免不了写稍微复杂一点业务的sql,自定义的sql当然是写在XML文件中的啦,那么首先来定义xml文件的位置,在yml配置文件如下:

mybatis-plus:  # 如果是放在src/main/java目录下 classpath:/com/*/*/mapper/*Mapper.xml  # 如果是放在resource目录 classpath:/mapper/**.xml  mapper-locations: classpath:/mapper/**.xml

使用注解实现

/** * @Auther: IT贱男 * @Date: 2019/6/10 14:40 * @Description: User对象持久层 */public interface UserMapper extends BaseMapper
{
/** * * 如果自定义的方法还希望能够使用MP提供的Wrapper条件构造器,则需要如下写法 * * @param userWrapper * @return */ @Select("SELECT * FROM user ${ew.customSqlSegment}") List
selectByMyWrapper(@Param(Constants.WRAPPER) Wrapper
userWrapper); /** * 和Mybatis使用方法一致 * @param name * @return */ @Select("SELECT * FROM user where name = #{name}") List
selectByName(@Param("name") String name); }

使用xml实现

/** * @Auther: IT贱男 * @Date: 2019/6/10 14:40 * @Description: User对象持久层 */public interface UserMapper extends BaseMapper
{
/** * 和Mybatis使用方法一致 * @param name * @return */ List
selectByName(@Param("name") String name); }

在xml文件中,namespace对应的是user模块的dao,id对应dao下面UserMapper接口的函数名,resultType定义返回的类型。

2.6 MyBatisPlus物理分页

官方介绍:

分页SQL:

示例 start=10,end=20 查第11-20的数据public String searchByPage(String sql, int start, int end, List valueList) {
String ret = ""; String dbType = ConfigUtil.getInstance().getDbType(); switch (dbType) {
case "oracle": ret = "SELECT * FROM (SELECT A.*, ROWNUM RN FROM (" + sql + ") A WHERE ROWNUM <= ? ) TEMP WHERE RN > ?"; valueList.add(end); valueList.add(start); break; case "dm": ret = "SELECT * FROM (SELECT A.*, ROWNUM RN FROM (" + sql + ") A WHERE ROWNUM <= ? ) TEMP WHERE RN > ?"; valueList.add(end); valueList.add(start); break; case "db2": ret = "SELECT * FROM (SELECT TEMP.*, ROW_NUMBER() OVER() AS NUM FROM (" + sql + ") TEMP ) WHERE NUM <= ? AND NUM > ?"; valueList.add(end); valueList.add(start); break; case "sqlserver": sql = sql.replaceFirst("select", ""); sql = sql.substring(0,sql.lastIndexOf("order by")); String str = sql.substring(0,sql.indexOf(",")); ret = "SELECT * FROM (SELECT row_number() OVER (ORDER BY " + str + " DESC ) AS row," + sql + " ) tt WHERE tt.row BETWEEN ? AND ?"; byte bytes[] = {
(byte) 0xC2,(byte) 0xA0}; String UTFSpace; try {
UTFSpace = new String(bytes,"utf-8"); ret = ret.replaceAll(UTFSpace, " "); } catch (UnsupportedEncodingException e) {
e.printStackTrace(); } valueList.add(start+1); valueList.add(end); break; case "mysql": ret = sql + " LIMIT ?, ?"; valueList.add(start); valueList.add(end - start); break; // GBase 8s 中分页支持两种 // 1.使用SKIP m FIRST/LIMIT n // 2.TOP m,n case "gbase8s": ret = sql + " skip " + start + " first " + (end - start); break; case "gbase8t": ret = sql + " LIMIT ?, ?"; valueList.add(start); valueList.add(end - start); break; default: ret = "not support db type, is " + dbType; break; } return ret; }

3. 公共字段自动写入

例如创建时间、更新时间等字段。

package cn.com.infosec.netseal.webserver.config.mybatisPlus;import cn.com.infosec.netseal.common.entity.po.BasePo;import cn.com.infosec.netseal.common.util.DateUtil;import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;import org.apache.ibatis.reflection.MetaObject;import org.springframework.stereotype.Component;/** * @Description mybatisPlus 公共字段自动写入 * @Date 2020/11/17 11:21 */@Componentpublic class CommonFieldAutoSetHandler implements MetaObjectHandler {
@Override public void insertFill(MetaObject metaObject) {
if (metaObject.getOriginalObject() instanceof BasePo) {
long currentTime = DateUtil.getCurrentTime(); this.setFieldValByName("createTime", currentTime, metaObject); this.setFieldValByName("updateTime", currentTime, metaObject); } } @Override public void updateFill(MetaObject metaObject) {
if (metaObject.getOriginalObject() instanceof BasePo) {
long currentTime = DateUtil.getCurrentTime(); this.setFieldValByName("updateTime", currentTime, metaObject); } }}

4. 禁止全表更新或删除

package cn.com.infosec.netseal.webserver.config.mybatisPlus;import com.baomidou.mybatisplus.extension.plugins.OptimisticLockerInterceptor;import com.baomidou.mybatisplus.extension.plugins.SqlExplainInterceptor;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;import org.springframework.transaction.annotation.EnableTransactionManagement;@EnableTransactionManagement(proxyTargetClass = true)@Configurationpublic class MybatisPlusConfig {
/** * 乐观锁插件 */ @Bean public OptimisticLockerInterceptor optimisticLockerInterceptor() {
return new OptimisticLockerInterceptor(); } /** * 如果是对全表的删除或更新操作,就会终止该操作 */ @Bean public SqlExplainInterceptor sqlExplainInterceptor() {
return new SqlExplainInterceptor(); }}

转载地址:http://kzqgn.baihongyu.com/

你可能感兴趣的文章
[统计学笔记] (十三)指数分析(2)
查看>>
Data Science 到底是什么?
查看>>
机器学习(Machine Learning)和传统的数据统计分析(Data Statistics)有什么区别?
查看>>
统计学、统计学习和统计推断之间的关系
查看>>
PMP笔记:质量管理的七个工具
查看>>
悦读:重新定义公司-谷歌是如何运营的
查看>>
研发主管的烦恼:周一早晨延迟的项目会议
查看>>
研发主管的烦恼:难以执行的绩效考核
查看>>
精益Scrum(五)
查看>>
精益Scrum(六)
查看>>
精益Scrum(七)
查看>>
软件测试管理—如何写好软件测试计划书
查看>>
解读一名软件测试经理所需要具备的能力
查看>>
有效的软件测试度量
查看>>
软件评测和测试国家现行标准
查看>>
理解测试策略
查看>>
机器学习界大牛林达华推荐的书籍
查看>>
path变量备份
查看>>
Lesson2.2 & 2.3 Maya command reference & quick help
查看>>
lesson 2.4 - Converting MEL Commands to Python
查看>>