Mybatis(拦截器实现)通用mapper及全ORM实现(一)
发布日期:2022-02-22 18:04:24
浏览次数:11
分类:技术文章
本文共 6469 字,大约阅读时间需要 21 分钟。
网上关于mybatis的拦截器文章有不少,但都大同小异,如果想做一个通用mapper和关系映射的查询都不太能够解决问题,所以自己就花了些时间写了一个mybatis的扩展(目前只实现了mysql数据库),具体项目可以在上下载。
先简单介绍一下扩展使用,后面在陆续展开说明实现
- 实体类定义 假定数据三张表:公司、部门、员工,定义如下:
public abstract class BaseEntity extends BaseExtEntity { public enum CommonStatus implements BaseExtEnum { Enable(1, "正常"), Disable(0, "关闭"); private int value; private String name; private CommonStatus(int value, String name){ this.value = value; this.name = name; } @Override public Object getValue() { return value; } @Override public String getName() { return name; } }}
@Table("Company")public class CompanyEntity extends BaseEntity { @Column(primaryKey = true) private int id; @Column private String comName; @Column private Date registerDate; @Column("ComAddress") private String address; @Column private CommonStatus status; @OneMany(type = DepartmentEntity.class, foreignKey = "comId", propertyKey = "id") private List
departments; private int countValue; public int getId() { return id; } public Date getRegisterDate() { return registerDate; } public String getAddress() { return address; } public String getComName() { return comName; } public CommonStatus getStatus() { return status; } public int getCountValue() { return countValue; } public List getDepartments() { return departments; } public void setId(int id) { this.id = id; } public void setAddress(String address) { this.address = address; } public void setComName(String comName) { this.comName = comName; } public void setRegisterDate(Date registerDate) { this.registerDate = registerDate; } public void setStatus(CommonStatus status) { this.status = status; } public void setCountValue(int countValue) { this.countValue = countValue; } public void setDepartments(List departments) { this.departments = departments; }} @Table("Department")public class DepartmentEntity extends BaseEntity { @Column(primaryKey = true) private int id; @Column private int comId; @Column private String departmentName; @OneOne(type = CompanyEntity.class, foreignKey = "id", propertyKey = "comId") private CompanyEntity company; @OneMany(type = EmployeeEntity.class, foreignKey = "departmentId", propertyKey = "id") private List
employees;} @Table("Employee")public class EmployeeEntity extends BaseEntity { @Column(primaryKey = true, generatedKey = false) private String id; @Column private String name; @Column private Gender gender; @Column private int level; @Column private String title; @Column private int departmentId; @OneOne(type = DepartmentEntity.class, foreignKey = "id", propertyKey = "departmentId") private DepartmentEntity department; public enum Gender implements BaseExtEnum { Male(1, "男"), Female(2, "女"); private int value; private String name; private Gender(int value, String name){ this.value = value; this.name = name; } @Override public Object getValue() { return value; } @Override public String getName() { return name; } }}
- mapper
public interface BaseMapper
extends BaseExtMapper {} public interface CompanyMapper extends BaseMapper
{} public interface DepartmentMapper extends BaseMapper
{} public interface EmployeeMapper extends BaseMapper
{} - 基础增删改查操作
@Autowiredprivate CompanyMapper companyMapper;companyMapper.addOne(entity);companyMapper.addMany(entities);companyMapper.removeById(id);companyMapper.removeByIds(ids);companyMapper.updateById(entity);companyMapper.getById(id);companyMapper.getByIds(ids);
- 特定条件及表连接操作
//更新MySqlStatement mySqlStatement = MySqlStatement.createUpdateStatement(YourEntity.class);mySqlStatement .set("propertyName", "propertyValue") .where("propertyName", ConditionType.EQUAL, "propertyValue");int result = mapper.update(mySqlStatement);//删除MySqlStatement mySqlStatement = MySqlStatement.createDeleteStatement(YourEntity.class);mySqlStatement .where("propertyName", ConditionType.EQUAL, "propertyValue");int result = mapper.remove(mySqlStatement);//单表查询MySqlStatement mySqlStatement = MySqlStatement.createSelectStatement(YourEntity.class);mySqlStatement.select("id", "name");mySqlStatement.select("id", "name");YourEntity entity = mapper.getOne(mySqlStatement);mySqlStatement.orderBy("id", OrderType.DESCENDING).limit(10);List
entities = mapper.getMany(mySqlStatement);MySqlStatement mySqlStatement = MySqlStatement.createSelectStatement(YourEntity.class);mySqlStatement.select("max(#{id})");YourEntity entity = mapper.getOne(mySqlStatement);int maxId = entity.getId();MySqlStatement mySqlStatement = MySqlStatement.createSelectStatement(YourEntity.class);mySqlStatement.selectAs("count(#{id})", "propertyName");YourEntity entity = mapper.getOne(mySqlStatement);int countNum = entity.getPropertyName();//表连接查询MySqlStatement mySqlStatement = MySqlStatement.createSelectStatement(YourEntity1.class);MySqlStatement mySqlStatement1 = mySqlStatement.createSubQuery("relationshipProperty");MySqlStatement mySqlStatement2 = mySqlStatement.createSubQuery(YourEntity2.class);mySqlStatement.join(mySqlStatement2, JoinType.LEFT_JOIN, "fromPropertyName", "toPropertyName", false, "resultPropertyName");mySqlStatement1.select("id", "name");mySqlStatement2.select("id", "name");//子查询MySqlStatement mySqlStatement = MySqlStatement.createSelectStatement(YourEntity1.class);MySqlStatement mySqlStatement2 = mySqlStatement.createSubQuery(YourEntity2.class);mySqlStatement.join(mySqlStatement2, JoinType.LEFT_JOIN, "fromPropertyName", "toPropertyName", true, "resultPropertyName");//分页查询Pager pager = new Pager();pager.setPageSize(10);pager.setCurrentPage(1); List entities = getPage(mySqlStatement, pager);pager.getRowCount();pager.getCurrentPage();//获取查询sql及参数FormatSqlWrapper formatSqlWrapper = mySqlStatement.getFormatSqlWrapper();formatSqlWrapper.getSql();formatSqlWrapper.getParameters();
暂时先介绍这么多,下一篇开始阐述具体实现,源代码。
转载地址:https://blog.csdn.net/erct/article/details/82697585 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!
发表评论
最新留言
很好
[***.229.124.182]2024年04月04日 00时35分34秒
关于作者
喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
VMWare笔记-解决虚拟机能ping通主机能上网,但主机ping不通虚拟机(含思路)
2019-04-27
Spring Boot笔记-banner.txt的使用
2019-04-27
Spring Boot笔记-自定义配置项默认值设置
2019-04-27
Spring Boot文档阅读笔记-EhCache的使用
2019-04-27
Qt文档阅读笔记-DTLS server解析
2019-04-27
SQL笔记-检索出ID为Int或Long中不连续的第一个点
2019-04-27
Qt文档阅读笔记-DTLS client解析
2019-04-27
Android逆向笔记-某水果大作战内购破解思路
2019-04-27
汇编基础(一)
2019-04-27
汇编基础(二)
2019-04-27
C++工作笔记-3种方法对数据类型进行拆分(可用于各种协议)
2019-04-27
C++工作笔记-对二级指针的进一步理解(函数的参数使用二级指针,从而操作原数据)
2019-04-27
C++工作笔记-作用域的巧妙使用,释放堆区创建的资源
2019-04-27
软件设计师学习笔记-计算机网络
2019-04-27
软件设计师学习笔记-系统安全分析与设计
2019-04-27
软件设计师学习笔记-数据结构与算法基础
2019-04-27
Qt文档阅读笔记-Qt工作笔记-QThread解析与实例(主线程发送信号给子线程)
2019-04-27
Qt文档阅读笔记-Qt工作笔记QProcess::finished的解析与实例
2019-04-27