# easy-access **Repository Path**: easy-framework/easy-access ## Basic Information - **Project Name**: easy-access - **Description**: 一个将Mybatis框架最简化后的基础框架,你可以在此基础上随意的二次开发。同时,在项目defaults目录下你可以看到内嵌一套默认实现方案,相当于集Mybatis,Mybatisplus,Easy-mybatis于一身。好不好用,试试你就知道了!,真金不怕火炼 - **Primary Language**: Java - **License**: Apache-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2019-01-15 - **Last Updated**: 2025-07-24 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README ## 查看最新源码请移步[源码地址](https://gitee.com/xiaoyudeguang/easy-develop/tree/master/easy-access) # easy-access ## 介绍 Easy-access是一个将Mybatis框架最简化后的基础框架,你可以在此基础上随意的二次开发(下拉到最后查看)。同时,在项目defaults目录下你可以看到内嵌一套默认实现方案,相当于集Mybatis,Mybatisplus,Easy-mybatis于一身了,同时,还可兼容它们!好不好用,试试你就知道了! ## 使用说明 ### Maven引用(点击 https://search.maven.org/search?q=g:io.github.xiaoyudeguang 查看最新版本) ``` io.github.xiaoyudeguang easy-access 3.1.8-RELEASE ``` ### 使用默认access框架实现 #### 实体类编写 考虑到很多项目已经基于Mybatisplus了,所以easy-accss的默认实现并没有自定义主键注解和表字段注解,而是沿用了mybatisplus的@TableId注解和@TableField注解,详情可参考easy-mybatis(项目地址:https://gitee.com/xiaoyudeguang/easy-mybatis ) ``` import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import com.zlyx.easycore.annotations.Desc; import com.zlyx.easymybatis.annotations.ForeignKey; import com.zlyx.easyweb.web.annotations.TableBean; @TableBean(todo = { "" }, value = "db_person", alias = "per") @TableName("db_person") public class Person { @Desc(value = { "用户id" }) @TableId("person_id") private Long id; @Desc(value = { "用户姓名" }) @TableField(value = "name") private String name; @Desc(value = { "部门名称" }) @ForeignKey(key = "name", table = Dept.class) @TableField(value = "dept_name") private String deptName; @Desc(value = "部门实体对象") private Dept dept; ... 其他部分略(get和set方法)... } ``` #### 数据交互接口编写(仿Mapper接口) ``` import com.zlyx.easyaccess.abstracts.AbstractAccesser; import com.zlyx.easyaccess.annotations.Accesser; import com.zlyx.easyaccess.defaults.annotations.Select; import com.zlyx.easytest.access.model.Person; @Accesser(todo = { "测试" }) public interface TestAccesser extends AbstractAccesser{ @Select("select * from db_person limit 0,1") public List select(); } ``` #### AbstractAccesser接口提供的原子方法(仿mybatisplus) ``` public interface AbstractAccesser { @Insert(value = SQL.PLACEHOLDER) public boolean insert(T t); @Insert(value = SQL.PLACEHOLDER) public boolean insertBatch(List ts); @Update(value = SQL.PLACEHOLDER) public boolean updateById(T t); @Update(value = SQL.PLACEHOLDER) public boolean updateBatchById(List ts); @Delete(value = SQL.PLACEHOLDER) public boolean deleteById(Object id); @Delete(value = SQL.PLACEHOLDER) public boolean deleteByIds(List ids); @Select(value = SQL.PLACEHOLDER) public T selectOne(Map params); @Select(value = SQL.PLACEHOLDER) public T selectOne(EasyMap params); @Select(value = SQL.PLACEHOLDER) public List selectList(Map params); @Select(value = SQL.PLACEHOLDER) public List selectList(EasyMap params); } ``` #### 多表联查(easy-mybatis的能力) ``` import com.zlyx.easymybatis.abstraccts.AbstractMapper; import com.zlyx.easymybatis.annotations.EasySelect; import com.zlyx.easymybatis.annotations.Condition; import com.zlyx.easymybatis.annotations.Table; import com.zlyx.easymybatis.utils.Page; @Mapper public interface PersonMapper extends AbstractMapper{ /** * 一个普通的mybatis方法 */ @Select(value = { "select * from swh_person" }) public List testMybatis(String name); /** * EasyMybatis多表联查方法 */ @EasySelect(tableName = "db_person", results = {Table.FILED_ALL}, tables = { @Table(tableName = "db_dept") }, conditions = { @Condition(fields = { "name" }, tableName = "person") } ) public List testSelect(String name); /** * EasyMybatis多表联查分页方法 */ @EasySelect(tableName = "db_person", results = {Table.FILED_ALL}, tables = { @Table(tableName = "db_dept") }, conditions = { @Condition(fields = { "name" }, tableName = "db_person") } page = true) public Page testPage(String name, int pageNum, int pageSize); } ``` > 因为和easy-mybatis一脉相承(都是easy-database的产品项目),所以同样的,你不需要编写任何XML文件。查询结果集默认支持JSON,实体类(包括多表联查,请参考easy-mybatis),Map集合。你也可以直接基于easy-database,模仿easy-mybatis或easy-access开发一个新的产品。 #### SQL拦截器 你可以定义一个Spring容器,实现SqlInterceptor接口的doInterceptor方法,然后就可以对sql进行一些执行前处理了。easy-access的拦截器是方法级别的。你也可以自定义一些别的注解,在SQL拦截器中获取该注解并对SQL做一些额外处理。 ``` package com.zlyx.easyaccess.interceptors; import java.lang.reflect.Method; /** * @Auth 赵光 * @Describle SQL执行前过滤器(方法级别) * @2019年1月11日 上午11:16:10 */ public interface SqlInterceptor { /** * SQL拦截器 * @param method * @param sql * @return */ public String doInterceptor(Method method, String sql); } ``` #### 结果集拦截器 ``` package com.zlyx.easyaccess.interceptors; import com.zlyx.easyaccess.abstracts.AbstractSqlAssembler; /** * @Auth 赵光 * @Describle * @2019年1月12日 上午11:53:05 */ public interface ResultInterceptor { /** * SQL拦截器 * @param assembler SQL打包器 * @param res 结果集对象 * @return */ public String doInterceptor(AbstractSqlAssembler assembler, Object res); } ``` ## 二级开发说明 #### 1. 实现数据交互层:继承AbstractDataAccesser抽象类并声明@DataAccesser注解,请参考DefaultDataAccesser的实现: ``` package com.zlyx.easyaccess.defaults; import java.lang.reflect.Method; import java.sql.Connection; import com.zlyx.easyaccess.abstracts.AbstractDataAccesser; import com.zlyx.easyaccess.abstracts.AbstractSqlAssembler; import com.zlyx.easyaccess.abstracts.AbstractSqlExcutor; import com.zlyx.easyaccess.annotations.DataAccesser; /** * @Auth 赵光 * @Describle * @2019年1月12日 上午8:57:46 */ @DataAccesser(value = "defaultAccesser", todo = { "默认数据交互层实现" }) public class DefaultDataAccesser extends AbstractDataAccesser{ @Override public AbstractSqlAssembler getAssembler(Class tClass, Method method, Object[] args) throws Exception { return new DefaultSqlAssembler(tClass, method, args); } @Override public AbstractSqlExcutor getSqlExcutor(Connection conn) { return new DefaultSqlExcutor(conn); } } ``` #### 2. 实现SQL打包器:继承AbstractSqlAssembler类并实现assemble()方法 ``` package com.zlyx.easyaccess.defaults; import java.lang.reflect.Method; import com.zlyx.easyaccess.abstracts.AbstractSqlAssembler; import com.zlyx.easycore.tool.EasyBuffer; import com.zlyx.easycore.tool.EasyMap; public class DefaultSqlAssembler extends AbstractSqlAssembler { public DefaultSqlAssembler(Class tClass, Method method, Object[] args) throws Exception { super(tClass, method, args); } @Override public String assemble(EasyMap paramsMap, String sql) { for (String key : paramsMap.getKeys()) { sql = sql.replace(EasyBuffer.wrapper("${", key, "}"), key); sql = sql.replace(EasyBuffer.wrapper("#{", key, "}"), key); } return sql; } } ``` #### 3.实现SQL执行器:继承AbstractSqlExcutor类并实现excute()方法(也可选择不实现) ``` public class DefaultSqlExcutor extends AbstractSqlExcutor { public DefaultSqlExcutor(Connection conn) { super(conn); } } ``` #### 4.调用自定义数据交互层 (1)将TestAccesser接口的@Accesser注解的value值修改为实现自定义数据交互层时声明的@DataAccesser注解的value值即可。 (2)如果系统中只有一个实现,也可不填写,将直接调用唯一的用户自定义数据交互层实现。 (3)如果系统中没有自定义数据交互层实现时,将调用默认实现。