jdbc-plus简介

jdbc-plus是一款基于JdbcTemplate加强工具包, 基于JdbcTemplate已实现分页、多租户等插件,可自定义扩大插件。我的项目地址: https://github.com/deeround/jdbc-plus

个性:

  • 应用简略,对代码入侵很小
  • 可自定义任意扩大插件
  • 多租户参考mybatis-plus多租户的实现原理,实践上与mybatis-plus多租户插件反对度一样
  • 分页参考PageHelper的实现原理,应用简略,对代码入侵较小,还能够注册不反对的数据库
  • 收费开源,可任意应用批改代码

疾速开始

  1. 引入jdbc-plus-spring-boot-starter
<dependency>    <groupId>com.github.deeround</groupId>    <artifactId>jdbc-plus-spring-boot-starter</artifactId>    <version>${version}</version></dependency>
  1. 注入须要应用的插件
@Configurationpublic class JdbcPlusConfig {    /**     * PaginationInterceptor是内置的分页插件(分页插件肯定要注入在TenantLineHandler之后,能够通过Order来管制程序)     */    @Bean    @Order(9)    public IInterceptor paginationInterceptor() {        return new PaginationInterceptor();    }    /**     * TenantLineHandler是内置的多租户插件插件     */    @Bean    @Order(1)    public IInterceptor tenantLineInterceptor() {        return new TenantLineInterceptor(new TenantLineHandler() {            /**             * 以后租户ID             */            @Override            public Expression getTenantId() {                String currentTenantId = "test_tenant_1";//能够从申请上下文中获取(cookie、session、header等)                return new StringValue(currentTenantId);            }            /**             * 租户字段名             */            @Override            public String getTenantIdColumn() {                return "tenant_id";            }            /**             * 依据表名判断是否疏忽拼接多租户条件             */            @Override            public boolean ignoreTable(String tableName) {                return TenantLineHandler.super.ignoreTable(tableName);            }        });    }}

多租户插件

  1. 注入多租户插件
    /**     * TenantLineHandler是内置的多租户插件插件     */    @Bean    @Order(1)    public IInterceptor tenantLineInterceptor() {        return new TenantLineInterceptor(new TenantLineHandler() {            /**             * 以后租户ID             */            @Override            public Expression getTenantId() {                String currentTenantId = "test_tenant_1";//能够从申请上下文中获取(cookie、session、header等)                return new StringValue(currentTenantId);            }            /**             * 租户字段名             */            @Override            public String getTenantIdColumn() {                return "tenant_id";            }            /**             * 依据表名判断是否疏忽拼接多租户条件             */            @Override            public boolean ignoreTable(String tableName) {                return TenantLineHandler.super.ignoreTable(tableName);            }        });    }
  1. service层执行SQL时主动增加租户字段
    @Autowired    JdbcTemplate jdbcTemplate;    public void insert() {        this.jdbcTemplate.update("insert into test_user(id,name) values('1','wangwu')");        //最终执行SQL:insert into test_user(id,name,tenant_id) values('1','wangwu','test_tenant_1')    }    public void delete() {        this.jdbcTemplate.update("delete from test_user");        //最终执行SQL:delete from test_user where tenant_id='test_tenant_1'    }    public void update() {        this.jdbcTemplate.update("update test_user set name='lisi' where id='1'");        //最终执行SQL:update test_user set name='lisi' where id='1' and tenant_id='test_tenant_1'    }    public List<Map<String, Object>> query() {        return this.jdbcTemplate.queryForList("select * from test_user");        //最终执行SQL:select * from test_user where tenant_id='test_tenant_1'    }

分页插件

  1. 注入分页插件
    /**     * PaginationInterceptor是内置的分页插件(分页插件肯定要注入在TenantLineHandler之后,能够通过Order来管制程序)     */    @Bean    @Order(9)    public IInterceptor paginationInterceptor() {        return new PaginationInterceptor();    }
  1. service层执行SQL时主动对SQL进行分页查问
    @Autowired    JdbcTemplate jdbcTemplate;    public PageInfo<Map<String, Object>> page1() {        PageHelper.startPage(1, 2);        List<Map<String, Object>> list = this.jdbcTemplate.queryForList("select * from test_user");//最终执行SQL:select * from test_user LIMIT 0,2        PageInfo<Map<String, Object>> page = new PageInfo<>(list);//PageInfo对象蕴含了分页信息(总行数等)        return page;    }    public PageInfo<Map<String, Object>> page2() {        PageHelper.startPage(2, 2);        List<Map<String, Object>> list = this.jdbcTemplate.queryForList("select * from test_user");//最终执行SQL:select * from test_user LIMIT 2,2        PageInfo<Map<String, Object>> page = new PageInfo<>(list);//PageInfo对象蕴含了分页信息(总行数等)        return page;    }
  1. 自定义分页

当插件不反对的数据库分页,能够通过PageHelper.registerDialectAlias(String alias, Class clazz) 注册一个本人分页实现类即可,也能够笼罩已反对的数据库分页。

自定义插件

示例:写一个打印SQL语句、执行参数、以及执行SQL耗时的监控插件。

  1. 编写MyStatInterceptor插件
/** * SQL监控插件 */@Slf4jpublic class MyStatInterceptor implements IInterceptor {    /**     * 自定义插件是否反对     */    @Override    public boolean supportMethod(final MethodInvocationInfo methodInfo) {        return IInterceptor.super.supportMethod(methodInfo);    }    /**     * SQL执行前办法(次要用于对SQL进行批改)     */    @Override    public void beforePrepare(final MethodInvocationInfo methodInfo, JdbcTemplate jdbcTemplate) {        log.info("原始SQL:{}", methodInfo.getSql());        log.info("入参:{}", Arrays.toString(methodInfo.getArgs()));        log.info("执行SQL开始工夫:{}", LocalDateTime.now());        methodInfo.getUserAttributes().put("startTime", LocalDateTime.now());    }    /**     * SQL执行实现后办法(次要用于对返回值批改)     *     * @param result 原始返回对象     * @return 解决后的返回对象     */    @Override    public Object beforeFinish(Object result, final MethodInvocationInfo methodInfo, JdbcTemplate jdbcTemplate) {        log.info("执行SQL完结工夫:{}", LocalDateTime.now());        LocalDateTime startTime = (LocalDateTime) methodInfo.getUserAttributes().get("startTime");        log.info("执行SQL耗时:{}毫秒", Duration.between(startTime, LocalDateTime.now()).toMillis());        return result;    }}
  1. 注入自定义插件
    /**     * 自定义插件注入,注入地位按理论状况     */    @Bean    @Order(0)    public IInterceptor myStatInterceptor() {        return new MyStatInterceptor();    }
  1. 查看成果(查看打印日志)
c.g.d.j.p.s.config.MyStatInterceptor     : 原始SQL:select * from test_userc.g.d.j.p.s.config.MyStatInterceptor     : 入参:[select * from test_user]c.g.d.j.p.s.config.MyStatInterceptor     : 执行SQL开始工夫:2023-04-23T16:35:58.151c.g.d.j.p.s.config.MyStatInterceptor     : 执行SQL完结工夫:2023-04-23T16:35:58.655c.g.d.j.p.s.config.MyStatInterceptor     : 执行SQL耗时:503毫秒

★ 鸣谢 ★

https://github.com/baomidou/mybatis-plus

https://github.com/pagehelper/Mybatis-PageHelper

https://github.com/deeround/jdbc-plus