当前位置: 首页 > news >正文

网站首页布局设计原理佛山英文网建站

网站首页布局设计原理,佛山英文网建站,网络营销方法分析,企业形象设计的意义本文#xff0c;分享 MyBatis 各种常用操作#xff0c;不限于链表查询、分页查询等等。 1. 分页查询 在 下文的 的「3.4 selectPage」小节#xff0c;我们使用 MyBatis Plus 实现了分页查询。除了这种方式#xff0c;我们也可以使用 XML 实现分页查询。 这里#xff0c…本文分享 MyBatis 各种常用操作不限于链表查询、分页查询等等。 1. 分页查询 在 下文的 的「3.4 selectPage」小节我们使用 MyBatis Plus 实现了分页查询。除了这种方式我们也可以使用 XML 实现分页查询。 这里以查询 system_users 表为例讲解如何使用 XML 实现分页查询。 #1.1 方案一MyBatis XML 这个是 MyBatis 内置的使用方式步骤如下 ​ ① 创建 AdminUserMapper.xml 文件编写两个 SQL 查询语句 ?xml version1.0 encodingUTF-8? !DOCTYPE mapper PUBLIC -//mybatis.org//DTD Mapper 3.0//EN http://mybatis.org/dtd/mybatis-3-mapper.dtd mapper namespacecn.iocoder.yudao.module.system.dal.mysql.user.AdminUserMapperselect idselectPage01ListresultTypecn.iocoder.yudao.module.system.dal.dataobject.user.AdminUserDO SELECT * FROM system_userswhereif testreqVO.username ! null and reqVO.username !AND username LIKE CONCAT(%,#{reqVO.username},%)/ifif testreqVO.createTime ! nullAND create_time BETWEEN #{reqVO.createTime[0]}, #{reqVO.createTime[1]},/ifif testreqVO.status ! nullAND status #{reqVO.status}/if/whereORDER BY id DESCLIMIT #{reqVO.pageNo}, #{reqVO.pageSize}/selectselect idselectPage01Count resultTypeLong SELECT COUNT(1) FROM system_userswhereif testreqVO.username ! null and reqVO.username !AND username LIKE CONCAT(%,#{reqVO.username},%)/ifif testreqVO.createTime ! nullAND create_time BETWEEN #{reqVO.createTime[0]}, #{reqVO.createTime[1]},/ifif testreqVO.status ! nullAND status #{reqVO.status}/if/where/select/mapper② 在 AdminUserMapper 创建这两 SQL 对应的方法 Mapper public interface AdminUserMapper extends BaseMapperXAdminUserDO {/*** 查询分页的列表*/ListAdminUserDO selectPage01List(Param(reqVO) UserPageReqVO reqVO);/*** 查询分页的条数*/Long selectPage01Count(Param(reqVO) UserPageReqVO reqVO);}其中 UserPageReqVO.java (opens new window)是分页查询的请求 VO。 ③ 在 AdminUserServiceImplService 层调用这两个方法实现分页查询 Service Slf4j public class AdminUserServiceImpl implements AdminUserService {Overridepublic PageResultAdminUserDO getUserPage(UserPageReqVO reqVO) {return new PageResult(userMapper.selectPage01List(reqVO),userMapper.selectPage01Count(reqVO));} }④ 简单调用下可以在 IDEA 控制台看到 2 条 SQL ​ #1.2 方案二MyBatis Plus XML 这个是 MyBatis Plus 拓展的使用方式可以简化只需要写一条 SQL步骤如下 ​ ① 创建 AdminUserMapper.xml 文件只编写一个 SQL 查询语句 ?xml version1.0 encodingUTF-8? !DOCTYPE mapper PUBLIC -//mybatis.org//DTD Mapper 3.0//EN http://mybatis.org/dtd/mybatis-3-mapper.dtd mapper namespacecn.iocoder.yudao.module.system.dal.mysql.user.AdminUserMapperselect idselectPage02resultTypecn.iocoder.yudao.module.system.dal.dataobject.user.AdminUserDO SELECT * FROM system_userswhereif testreqVO.username ! null and reqVO.username !AND username LIKE CONCAT(%,#{reqVO.username},%)/ifif testreqVO.createTime ! nullAND create_time BETWEEN #{reqVO.createTime[0]}, #{reqVO.createTime[1]},/ifif testreqVO.status ! nullAND status #{reqVO.status}/if/whereORDER BY id DESC/select/mapper注意不需要写 LIMIT 分页语句噢。 ② 在 AdminUserMapper 创建这一 SQL 对应的方法 Mapper public interface AdminUserMapper extends BaseMapperXAdminUserDO {IPageAdminUserDO selectPage02(IPageAdminUserDO page, Param(reqVO) UserPageReqVO reqVO);}第一个参数、返回结果必须都是 IPage 类型第二个参数可以放查询条件。 ③ 在 AdminUserServiceImplService 层调用这一个方法实现分页查询 Service Slf4j public class AdminUserServiceImpl implements AdminUserService {Overridepublic PageResultAdminUserDO getUserPage(UserPageReqVO reqVO) {// 必须使用 MyBatis Plus 的分页对象IPageAdminUserDO page new Page(reqVO.getPageNo(), reqVO.getPageSize());userMapper.selectPage02(page, reqVO);return new PageResult(page.getRecords(), page.getTotal());} }因为项目使用 PageParam 和 PageResult 作为分页对象所以需要和 IPage 做下转换。 ④ 简单调用下可以在 IDEA 控制台看到 2 条 SQL ​ 本质上MyBatis Plus 是基于我们在 XML 编写的这条 SQL计算出获得分页数量的 SQL。 一般情况下建议采用方案二MyBatis Plus XML因为它开发效率更高并且在分页数量为 0 时就不多余查询分页的列表一定程度上可以提升性能。 #2. 联表查询 对于需要链表查询的场景建议也是写 MyBatis XML使用方法比较简单可以看下 《MyBatis学习总结三—— 多表关联查询与动态 SQL》 (opens new window)文章。 除了 XML 这种方式外项目也集成了 MyBatis Plus Join (opens new window)框架通过 Java 代码实现联表查询。 这里以查询 system_users 和 system_dept 联表查询部门名为  音娱乐行、用户状态为开启的用户列表。 #2.1 案例一字段平铺 ① 创建 AdminUserDetailDO 类继承 AdminUserDO 类并添加 deptName 平铺。代码如下 Data public class AdminUserDetailDO extends AdminUserDO {private String deptName;}② 在 AdminUserMapper 创建 selectListByStatusAndDeptName 方法代码如下 Mapper public interface AdminUserMapper extends BaseMapperXAdminUserDO {default ListAdminUserDetailDO selectList2ByStatusAndDeptName(Integer status, String deptName) {return selectJoinList(AdminUserDetailDO.class, new MPJLambdaWrapperAdminUserDO() // 查询 List.selectAll(AdminUserDO.class) // 查询 system_users 表的 all 所有字段.selectAs(DeptDO::getName, AdminUserDetailDO::getDeptName) // 查询 system_dept 表的 name 字段使用 deptName 字段“部分”返回.eq(AdminUserDO::getStatus, status) // WHERE system_users.status ? 【部门名为 芋道源码】.leftJoin(DeptDO.class, DeptDO::getId, AdminUserDO::getDeptId) // 联表 WHERE system_users.dept_id system_dept.id .eq(DeptDO::getName, deptName) // WHERE system_dept.name ? 【用户状态为开启】);}}#2.2 案例二字段内嵌 ① 创建 AdminUserDetailDO 类继承 AdminUserDO 类并添加 dept 部门。代码如下 Data public class AdminUserDetail2DO extends AdminUserDO {private DeptDO dept;}② 在 AdminUserMapper 创建 selectListByStatusAndDeptName 方法代码如下 Mapper public interface AdminUserMapper extends BaseMapperXAdminUserDO {default ListAdminUserDetail2DO selectListByStatusAndDeptName(Integer status, String deptName) {return selectJoinList(AdminUserDetail2DO.class, new MPJLambdaWrapperAdminUserDO().selectAll(AdminUserDO.class).selectAssociation(DeptDO.class, AdminUserDetail2DO::getDept) // 重点差异点查询 system_dept 表的 name 字段使用 dept 字段“整个”返回.eq(AdminUserDO::getStatus, status).leftJoin(DeptDO.class, DeptDO::getId, AdminUserDO::getDeptId).eq(DeptDO::getName, deptName));}}#2.3 总结 MyBatis Plus Join 相比 MyBatis XML 来说一开始肯定是需要多看看它的文档 (opens new window)。 但是熟悉后我还是更喜欢使用 MyBatis Plus Join 哈~ 《MyBatis 数据库》MyBatis 是最容易读懂的 Java 框架之一 1. 实体类 BaseDO (opens new window) 是所有数据库实体的父类代码如下 Data public abstract class BaseDO implements Serializable {/*** 创建时间*/TableField(fill FieldFill.INSERT)private Date createTime;/*** 最后更新时间*/TableField(fill FieldFill.INSERT_UPDATE)private Date updateTime;/*** 创建者目前使用 AdminUserDO / MemberUserDO 的 id 编号** 使用 String 类型的原因是未来可能会存在非数值的情况留好拓展性。*/TableField(fill FieldFill.INSERT)private String creator;/*** 更新者目前使用 AdminUserDO / MemberUserDO 的 id 编号** 使用 String 类型的原因是未来可能会存在非数值的情况留好拓展性。*/TableField(fill FieldFill.INSERT_UPDATE)private String updater;/*** 是否删除*/TableLogicprivate Boolean deleted;}createTime  creator 字段创建人相关信息。updater  updateTime 字段创建人相关信息。deleted 字段逻辑删除。 对应的 SQL 字段如下 creator varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT COMMENT 创建者, create_time datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 创建时间, updater varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT COMMENT 更新者, update_time datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT 更新时间, deleted bit(1) NOT NULL DEFAULT b0 COMMENT 是否删除,#1.1 主键编号 id 主键编号推荐使用 Long 型自增原因是 自增保证数据库是按顺序写入性能更加优秀。Long 型避免未来业务增长超过 Int 范围。 对应的 SQL 字段如下 id bigint NOT NULL AUTO_INCREMENT COMMENT 编号,项目的 id 默认采用数据库自增的策略如果希望使用 Snowflake 雪花算法可以修改 application.yaml 配置文件将配置项 mybatis-plus.global-config.db-config.id-type 修改为 ASSIGN_ID。如下图所示 ​ #1.2 逻辑删除 所有表通过 deleted 字段来实现逻辑删除值为 0 表示未删除值为 1 表示已删除可见 application.yaml 配置文件的 logic-delete-value 和 logic-not-delete-value 配置项。如下图所示 ​ ① 所有 SELECT 查询都会自动拼接 WHERE deleted 0 查询条件过滤已经删除的记录。如果被删除的记录只能通过在 XML 或者 SELECT 来手写 SQL 语句。例如说 ​ ② 建立唯一索引时需要额外增加 delete_time 字段添加到唯一索引字段中避免唯一索引冲突。例如说system_users 使用 username 作为唯一索引 未添加前先逻辑删除了一条 username yudao 的记录然后又插入了一条 username yudao 的记录时会报索引冲突的异常。已添加后先逻辑删除了一条 username yudao 的记录并更新 delete_time 为当前时间然后又插入一条 username yudao 并且 delete_time 为 0 的记录不会导致唯一索引冲突。 #1.3 自动填充 DefaultDBFieldHandler (opens new window) 基于 MyBatis 自动填充机制实现 BaseDO 通用字段的自动设置。代码如下如 ​ #1.4 “复杂”字段类型 MyBatis Plus 提供 TypeHandler 字段类型处理器用于 JavaType 与 JdbcType 之间的转换。示例如下 ​ 常用的字段类型处理器有 JacksonTypeHandler (opens new window)通用的 Jackson 实现 JSON 字段类型处理器。JsonLongSetTypeHandler (opens new window)针对 SetLong 的 Jackson 实现 JSON 字段类型处理器。 另外如果你后续要拓展自定义的 TypeHandler 实现可以添加到 cn.iocoder.yudao.framework.mybatis.core.type (opens new window)包下。 注意事项 使用 TypeHandler 时需要设置实体的 TableName 注解的 autoResultMap true。 #2. 编码规范 ① 数据库实体类放在 dal.dataobject 包下以 DO 结尾数据库访问类放在 dal.mysql 包下以 Mapper 结尾。如下图所示 ​ ② 数据库实体类的注释要完整特别是哪些字段是关联外键、枚举、冗余等等。例如说 ​ ③ 禁止在 Controller、Service 中直接进行 MyBatis Plus 操作。原因是大量 MyBatis 操作散落在 Service 中会导致 Service 的代码越来乱无法聚焦业务逻辑。 示例错误 ​ 正确 ​ 并且通过只允许将 MyBatis Plus 操作编写 Mapper 层更好的实现 SELECT 查询的复用而不是 Service 会存在很多相同且重复的 SELECT 查询的逻辑。 ④ Mapper 的 SELECT 查询方法的命名采用 Spring Data 的 Query methods (opens new window)策略方法名使用 selectBy查询条件 规则。例如说 ​ ⑤ 优先使用 LambdaQueryWrapper 条件构造器使用方法获得字段名避免手写 字段 可能写错的情况。例如说 ​ ⑥ 简单的单表查询优先在 Mapper 中通过 default 方法实现。例如说 ​ #3. CRUD 接口 BaseMapperX (opens new window)接口继承 MyBatis Plus 的 BaseMapper 接口提供更强的 CRUD 操作能力。 #3.1 selectOne #selectOne(...) (opens new window)方法使用指定条件查询单条记录。示例如下 ​ #3.2 selectCount #selectCount(...) (opens new window)方法使用指定条件查询记录的数量。示例如下 ​ #3.3 selectList #selectList(...) (opens new window)方法使用指定条件查询多条记录。示例如下 ​ #3.4 selectPage 针对 MyBatis Plus 分页查询的二次分装在 BaseMapperX (opens new window)中实现目的是使用项目自己的分页封装 【入参】查询前将项目的分页参数 PageParam (opens new window)转换成 MyBatis Plus 的 IPage 对象。【出参】查询后将 MyBatis Plus 的分页结果 IPage转换成项目的分页结果 ​​​​​​​PageResult (opens new window)。代码如下图 ​ 具体的使用示例可见 ​​​​​​​TenantMapper (opens new window)类中定义 selectPage 查询方法。代码如下 Mapper public interface TenantMapper extends BaseMapperXTenantDO {default PageResultTenantDO selectPage(TenantPageReqVO reqVO) {return selectPage(reqVO, new LambdaQueryWrapperXTenantDO().likeIfPresent(TenantDO::getName, reqVO.getName()) // 如果 name 不为空则进行 like 查询.likeIfPresent(TenantDO::getContactName, reqVO.getContactName()).likeIfPresent(TenantDO::getContactMobile, reqVO.getContactMobile()).eqIfPresent(TenantDO::getStatus, reqVO.getStatus()) // 如果 status 不为空则进行 查询.betweenIfPresent(TenantDO::getCreateTime, reqVO.getBeginCreateTime(), reqVO.getEndCreateTime()) // 如果 create 不为空则进行 between 查询.orderByDesc(TenantDO::getId)); // 按照 id 倒序}}完整实战可见 《开发指南 —— 分页实现》 文档。 #3.5 insertBatch #insertBatch(...) (opens new window)方法遍历数组逐条插入数据库中适合少量数据插入或者对性能要求不高的场景。 示例如下 ​ 为什么不使用 insertBatchSomeColumn 批量插入 只支持 MySQL 数据库。其它 Oracle 等数据库使用会报错可见 InsertBatchSomeColumn (opens new window)说明。未支持多租户。插入数据库时多租户字段不会进行自动赋值。 #4. 批量插入 绝大多数场景下推荐使用 MyBatis Plus 提供的 IService 的 #saveBatch() (opens new window)​​​​​​​方法。示例 PermissionServiceImpl (opens new window)如下 ​ #5. 条件构造器 继承 MyBatis Plus 的条件构造器拓展了 LambdaQueryWrapperX (opens new window)和 QueryWrapperX (opens new window)类主要是增加 xxxIfPresent 方法用于判断值不存在的时候不要拼接到条件中。例如说 ​ 具体的使用示例如下 ​ #6. Mapper XML 默认配置下MyBatis Mapper XML 需要写在各 yudao-module-xxx-biz 模块的 resources/mapper 目录下。示例 TestDemoMapper.xml (opens new window)如下 ​ 尽量避免数据库的连表多表查询而是采用多次查询Java 内存拼接的方式替代。例如说 ​ #7. 字段加密 EncryptTypeHandler (opens new window)基于 Hutool AES (opens new window)实现字段的解密与解密。 例如说数据源配置 (opens new window)的 password 密码需要实现加密存储则只需要在该字段上添加 EncryptTypeHandler 处理器。示例代码如下 TableName(value infra_data_source_config, autoResultMap true) // ① 添加 autoResultMap true public class DataSourceConfigDO extends BaseDO {// ... 省略其它字段/*** 密码*/TableField(typeHandler EncryptTypeHandler.class) // ② 添加 EncryptTypeHandler 处理器private String password;}另外在 application.yaml 配置文件中可使用 mybatis-plus.encryptor.password 设置加密密钥。 字段加密后只允许使用精准匹配无法使用模糊匹配。示例代码如下 Test // 测试使用 password 查询可以查询到数据 public void testSelectPassword() {// mock 数据DataSourceConfigDO dbDataSourceConfig randomPojo(DataSourceConfigDO.class);dataSourceConfigMapper.insert(dbDataSourceConfig);// Sql: 先插入出一条存在的数据// 调用DataSourceConfigDO result dataSourceConfigMapper.selectOne(DataSourceConfigDO::getPassword,EncryptTypeHandler.encrypt(dbDataSourceConfig.getPassword())); // 重点需要使用 EncryptTypeHandler 去加密查询字段 }
http://www.w-s-a.com/news/760615/

相关文章:

  • 哪有app制作公司上海seo排名
  • 长沙建站seo公司北京招聘信息
  • 建设网站情况说明范文四川个人证书查询网官网
  • 推广学校网站怎么做公司可以做多个网站吗
  • 游戏网站后台建设郑州定制网站
  • 商务公司网站建设网站建设如何自学
  • 现在建网站可以拖拉式的吗中国国内最新新闻
  • phpstorm网站开发产品logo设计
  • 电子商务网站建设与运营什么是单页面网站
  • 西安优化网站公司南阳微信网站
  • 购物网站线下推广方案佛山快速建站哪家服务专业
  • 临沂网站排名外贸网站推广方法之一
  • 手机网站百度关键词排名查询吕梁网站制作吕梁安全
  • 做网站媒体wordpress管理员账号数据库添加
  • php如何自己做网站wordpress怎么修改编辑代码
  • 网站建网站建设公司WordPress互联
  • 泊头市网站建设价格wordpress导航菜单位置
  • 怎么设立网站赚广告费网页制作素材模板图片
  • 做班级网站的目的网站设计制作公司需要什么资质
  • 济南做网站哪家好财政网站平台建设不足
  • php网站建设招聘网站开发与设计论文
  • 上海 网站建设平台 补贴网站开发招标文件范本
  • 延安网站建设公司电话手机上那个网站做农产品推广比较好
  • 增城哪家网站建设好如何做网站实名认证
  • 常州地区做网站个人购物网站需要备案吗
  • 网站建设公司 跨界鱼科技专业做服务器的网站都有哪些
  • 欧洲网站服务器网站建设费用计入什么科目
  • 网站的色调苏州策划网站模板建站公司
  • 怎么看网站用的什么后台公路建设项目可行性研究报告编制办法哪个网站查最新版
  • 可以看的网站的浏览器有哪些专业APP客户端做网站