Parcourir la source

admin add mybatis test

reghao il y a 1 mois
Parent
commit
3b88044d12

+ 5 - 0
admin/pom.xml

@@ -60,6 +60,11 @@
             <artifactId>HikariCP</artifactId>
             <version>3.3.1</version>
         </dependency>
+        <dependency>
+            <groupId>org.mybatis.spring.boot</groupId>
+            <artifactId>mybatis-spring-boot-starter</artifactId>
+            <version>3.0.4</version>
+        </dependency>
 
         <dependency>
             <groupId>org.springframework.boot</groupId>

+ 68 - 0
admin/src/main/java/cn/reghao/tnb/admin/config/mysql/DataSourceConfig.java

@@ -0,0 +1,68 @@
+package cn.reghao.tnb.admin.config.mysql;
+
+import org.apache.ibatis.plugin.Interceptor;
+import org.apache.ibatis.session.SqlSessionFactory;
+import org.mybatis.spring.SqlSessionFactoryBean;
+import org.mybatis.spring.SqlSessionTemplate;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
+import org.springframework.jdbc.datasource.DataSourceTransactionManager;
+import org.springframework.transaction.PlatformTransactionManager;
+
+import javax.sql.DataSource;
+
+/**
+ * MyBatis 初始化配置
+ * 若配置了多数据源,则不启用此配置
+ *
+ * @author reghao
+ * @date 2021-04-26 17:48:29
+ */
+@Configuration
+public class DataSourceConfig {
+    private final DataSource dataSource;
+
+    public DataSourceConfig(DataSource dataSource) {
+        this.dataSource = dataSource;
+    }
+
+    @Bean
+    public SqlSessionFactory sqlSessionFactory() throws Exception {
+        SqlSessionFactoryBean factoryBean = new SqlSessionFactoryBean();
+        factoryBean.setDataSource(dataSource);
+        factoryBean.setPlugins(new Interceptor[]{pageListInterceptor()});
+
+        org.apache.ibatis.session.Configuration configuration = new org.apache.ibatis.session.Configuration();
+        configuration.setMapUnderscoreToCamelCase(true);
+        configuration.setDefaultFetchSize(100);
+        configuration.setDefaultStatementTimeout(600);
+        factoryBean.setConfiguration(configuration);
+
+        String location = "classpath*:mapper/**/**.xml";
+        factoryBean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources(location));
+        return factoryBean.getObject();
+    }
+
+    /**
+     * 配置 mybatis 的分页拦截器
+     *
+     * @param
+     * @return
+     * @date 2021-12-21 下午5:23
+     */
+    @Bean
+    public PageListInterceptor pageListInterceptor() {
+        return new PageListInterceptor();
+    }
+
+    @Bean(value = "sqlSession")
+    public SqlSessionTemplate sqlSessionTemplate(SqlSessionFactory sqlSessionFactory) {
+        return new SqlSessionTemplate(sqlSessionFactory);
+    }
+
+    @Bean(value = "transactionManager")
+    public PlatformTransactionManager annotationDrivenTransactionManager() {
+        return new DataSourceTransactionManager(dataSource);
+    }
+}

+ 83 - 0
admin/src/main/java/cn/reghao/tnb/admin/config/mysql/PageListInterceptor.java

@@ -0,0 +1,83 @@
+package cn.reghao.tnb.admin.config.mysql;
+
+import cn.reghao.jutil.jdk.web.db.Page;
+import org.apache.ibatis.binding.MapperMethod;
+import org.apache.ibatis.executor.parameter.ParameterHandler;
+import org.apache.ibatis.executor.statement.StatementHandler;
+import org.apache.ibatis.mapping.MappedStatement;
+import org.apache.ibatis.plugin.*;
+import org.apache.ibatis.reflection.MetaObject;
+import org.apache.ibatis.reflection.SystemMetaObject;
+
+import java.sql.Connection;
+import java.util.Properties;
+
+/**
+ * MyBatis 分页拦截器
+ *
+ * @author reghao
+ * @date 2021-04-26 17:40:32
+ */
+@Intercepts({@Signature(type=StatementHandler.class,method="prepare",args={Connection.class,Integer.class})})
+public class PageListInterceptor implements Interceptor {
+    private final String methodSuffix = "Page";
+    @Deprecated
+    private int page;
+    @Deprecated
+    private int size;
+    private String dbType;
+
+    @Override
+    public Object intercept(Invocation invocation) throws Throwable {
+        StatementHandler statementHandler = (StatementHandler)invocation.getTarget();
+        MetaObject metaObject = SystemMetaObject.forObject(statementHandler);
+        while(metaObject.hasGetter("h")){
+            Object object = metaObject.getValue("h");
+            metaObject = SystemMetaObject.forObject(object);
+        }
+
+        while(metaObject.hasGetter("target")){
+            Object object = metaObject.getValue("target");
+            metaObject = SystemMetaObject.forObject(object);
+        }
+
+        MappedStatement mappedStatement = (MappedStatement)metaObject.getValue("delegate.mappedStatement");
+        String mapId = mappedStatement.getId();
+        if (mapId.matches(String.format(".+%s$", methodSuffix))){
+            ParameterHandler parameterHandler = (ParameterHandler)metaObject.getValue("delegate.parameterHandler");
+            Object object = parameterHandler.getParameterObject();
+            Page page;
+            if (object instanceof Page) {
+                page = (Page) object;
+            } else if (object instanceof MapperMethod.ParamMap) {
+                MapperMethod.ParamMap paramMap = (MapperMethod.ParamMap) object;
+                Object param1 = paramMap.get("param1");
+                if (param1 instanceof Page) {
+                    page = (Page) param1;
+                } else {
+                    throw new Exception("ByPage 方法的第一个参数不是 Page 类型");
+                }
+            } else {
+                throw new Exception("没有 Page 类型的参数");
+            }
+
+            String sql = (String) metaObject.getValue("delegate.boundSql.sql");
+            // sql += " limit "+(page-1)*size +","+size;
+            sql += String.format(" limit %s,%s", (page.getPage()-1)*page.getSize(), page.getSize());
+            metaObject.setValue("delegate.boundSql.sql", sql);
+        }
+        return invocation.proceed();
+    }
+
+    @Override
+    public Object plugin(Object target) {
+        return Plugin.wrap(target, this);
+    }
+
+    @Override
+    public void setProperties(Properties properties) {
+        String limit = properties.getProperty("limit","10");
+        this.page = Integer.parseInt(limit);
+        this.dbType = properties.getProperty("dbType", "mysql");
+    }
+}

+ 30 - 2
admin/src/main/java/cn/reghao/tnb/admin/controller/AdminController.java

@@ -1,5 +1,7 @@
 package cn.reghao.tnb.admin.controller;
 
+import cn.reghao.tnb.admin.db.TnbUserMapper;
+import cn.reghao.tnb.admin.model.po.TnbUser;
 import cn.reghao.tnb.admin.service.AdminService;
 import cn.reghao.tnb.common.db.SelectOption;
 import cn.reghao.tnb.common.web.WebResult;
@@ -19,15 +21,41 @@ import java.util.List;
 @RequestMapping("/api/admin1")
 public class AdminController {
     private final AdminService adminService;
+    private TnbUserMapper tnbUserMapper;
 
-    public AdminController(AdminService adminService) {
+    public AdminController(AdminService adminService, TnbUserMapper tnbUserMapper) {
         this.adminService = adminService;
+        this.tnbUserMapper = tnbUserMapper;
     }
 
     @Operation(summary = "", description = "N")
     @GetMapping(value = "/stat", produces = MediaType.APPLICATION_JSON_VALUE)
     public String stat() {
         adminService.stat();
-        return WebResult.success("admin stat");
+        List<TnbUser> list = tnbUserMapper.findAll();
+        return WebResult.success(list);
+    }
+
+    @Operation(summary = "", description = "N")
+    @GetMapping(value = "/stat1", produces = MediaType.APPLICATION_JSON_VALUE)
+    public String stat1() {
+        tnbUserMapper.updateUsername(1, "gggg");
+        return WebResult.success("update");
+    }
+
+    @Operation(summary = "", description = "N")
+    @GetMapping(value = "/stat2", produces = MediaType.APPLICATION_JSON_VALUE)
+    public String stat2() {
+        tnbUserMapper.deleteById(1);
+        return WebResult.success("delete");
+    }
+
+    @Operation(summary = "", description = "N")
+    @GetMapping(value = "/stat3", produces = MediaType.APPLICATION_JSON_VALUE)
+    public String stat3() {
+        TnbUser tnbUser = new TnbUser();
+        tnbUser.setUsername("reghao");
+        tnbUserMapper.save(tnbUser);
+        return WebResult.success("add");
     }
 }

+ 16 - 0
admin/src/main/java/cn/reghao/tnb/admin/db/TnbUserMapper.java

@@ -0,0 +1,16 @@
+package cn.reghao.tnb.admin.db;
+
+import cn.reghao.jutil.jdk.web.db.BaseMapper;
+import cn.reghao.tnb.admin.model.po.TnbUser;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+
+/**
+ * @author reghao
+ * @date 2026-01-25 21:02:09
+ */
+@Mapper
+public interface TnbUserMapper extends BaseMapper<TnbUser> {
+    void updateUsername(@Param("id") int id, @Param("username") String username);
+    void deleteById(@Param("id") int id);
+}

+ 15 - 0
admin/src/main/java/cn/reghao/tnb/admin/model/po/TnbUser.java

@@ -0,0 +1,15 @@
+package cn.reghao.tnb.admin.model.po;
+
+import cn.reghao.jutil.jdk.web.db.BaseObject;
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * @author reghao
+ * @date 2026-01-25 21:01:58
+ */
+@Setter
+@Getter
+public class TnbUser extends BaseObject<Integer> {
+    private String username;
+}

+ 28 - 0
admin/src/main/resources/mapper/TnbUserMapper.xml

@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+
+<mapper namespace="cn.reghao.tnb.admin.db.TnbUserMapper">
+    <insert id="save">
+        insert into tnb_user
+        (`username`)
+        values
+        (#{username})
+    </insert>
+
+    <update id="updateUsername">
+        update tnb_user
+        set `username`=#{username}
+        where id=#{id}
+    </update>
+
+    <delete id="deleteById">
+        delete from tnb_user
+        where id=#{id}
+    </delete>
+
+    <select id="findAll" resultType="cn.reghao.tnb.admin.model.po.TnbUser">
+        select *
+        from tnb_user
+        limit 1000
+    </select>
+</mapper>