1. ↖回到主目录

2. 快速使用

2.1. 必备源码

  1. 必备源码文件(/src目录下):
  2. com.AppSample.java
  3. com.config.DataSourceConfig.java
  4. com.config.MyBatisConfig.java
  5. com.sys.RestSesson.java
  6. com.sys.RestSessionConfig.java
  7. 必备资源文件(/resources目录下):
  8. application.properties
  9. logback-spring.xml

2.2. 新建 RestSession 对象

  • 项目中必须有且只能有一个 AbstractRestSession 的实现类, 我们命名为 RestSession.java
  • 代替 Web Session对象, 这是一个线程安全的容器
  • 用户登录信息, Token信息放入到这个对象中

其源码如下:

  1. package com.sys;
  2. import com.topfox.annotation.Table;
  3. import com.topfox.common.AbstractRestSession;
  4. import lombok.Getter;
  5. import lombok.Setter;
  6. import lombok.experimental.Accessors;
  7. /**
  8. * 代替 web session
  9. * 是一个简单的POJO对象, 禁止放入连接数据库等无法序列化的对象
  10. */
  11. @Getter
  12. @Setter
  13. @Accessors(chain = true)
  14. public class RestSession extends AbstractRestSession {
  15. private String userId;
  16. private String userName;
  17. private Boolean isAdmin=false; //是否管理员
  18. //根据项目需要自定
  19. }

2.3. 实现 RestSessionHandler超类

  • 项目中必须有且只能有一个RestSessionHandler的实现类, 我们命名为 RestSessionConfig.java, 其源码如下:
  • 详见源码: com.sys.RestSessionConfig
  1. package com.sys;
  2. import com.topfox.util.RestSessionHandler;
  3. import org.springframework.stereotype.Component;
  4. import java.lang.reflect.Method;
  5. @Component
  6. public class RestSessionConfig extends RestSessionHandler<com.sys.RestSession> {
  7. @Override
  8. public void initRestSession(com.sys.RestSession restSession, Method method) {
  9. //每次请求都会调用这个方法
  10. //初始化 RestSession 对象的数据
  11. //调用方每次请求传入 sessionId, 这里可以从Redis读取出来, 把数据复制到 restSession中
  12. }
  13. @Override
  14. public void save(RestSession restSession) {
  15. //例: 登陆成功调用, 保存RestSession 到Redis
  16. }
  17. }

2.4. 数据源配置 DataSourceConfig

  • 数据库的账号 密码等配置必须的配置信息
  • 详见源码 com.config..DataSourceConfig.java

2.5. MyBatisConfig 配置

  • 设置使用TopFox的拦截器插件MyBatisInterceptor, 目的是打印SQL,TopFox对输出的SQL做了美化处理;
  • 注意,需要把springboot dao层打印sq的功能关闭, 不然sql打印会重复. demo项目的dao接口在com.user.dao下,因此资源文件 logback-spring.xml 的dev 增加以下配置:
  1. <logger name="com.user.dao" level="OFF" />

MyBatisConfig.java源码如下:

  • MyBatisConfig.java源码, 请注意 @MapperScan(“com.*.dao”) 这个是自己项目 dao接口的路径,
  1. package com.config;
  2. @Configuration
  3. @MapperScan("com.*.dao")
  4. @EnableTransactionManagement
  5. public class MyBatisConfig {
  6. @Autowired private Environment env;
  7. @Autowired DataSource dataSource;
  8. @Bean
  9. public SqlSessionFactory sqlSessionFactory() throws Exception {
  10. SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
  11. bean.setDataSource(dataSource);
  12. bean.setTypeAliasesPackage(env.getProperty("mybatis.type-aliases-package"));
  13. bean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources(env.getProperty("mybatis.mapper-locations")));
  14. //增加 MyBatis SQL拦截器
  15. bean.setPlugins(new Interceptor[] {new MyBatisInterceptor()});
  16. /**
  17. * 配置驼峰命名转换 true 开启
  18. */
  19. bean.getObject().getConfiguration().setMapUnderscoreToCamelCase(true);
  20. return bean.getObject();
  21. }
  22. ...略
  23. }

3. 简单的例子

  • 以部门表为例, 实现简单的例子.

3.1. 部门建表语句

  1. DROP TABLE IF EXISTS `depts`;
  2. CREATE TABLE "depts" (
  3. "deptId" bigint(26) NOT NULL AUTO_INCREMENT COMMENT '主键Id',
  4. "deptName" varchar(26) NOT NULL,
  5. "deptManager" varchar(26) DEFAULT NULL,
  6. PRIMARY KEY ("deptId")
  7. ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_german2_ci;
  8. BEGIN;
  9. INSERT INTO `depts` VALUES (1, 'IT部门', '罗平');
  10. INSERT INTO `depts` VALUES (2, '财务部', '张三');
  11. INSERT INTO `depts` VALUES (3, '行政部', '李四');
  12. COMMIT;

3.2. 新建 DeptDTO.java

  1. package com.user.entity;
  2. import com.topfox.annotation.Id;
  3. import com.topfox.annotation.Table;
  4. import com.topfox.common.DataDTO;
  5. import lombok.Getter;
  6. import lombok.Setter;
  7. import lombok.experimental.Accessors;
  8. @Setter
  9. @Getter
  10. @Accessors(chain = true)
  11. @Table(name = "depts")
  12. public class DeptDTO extends DataDTO {
  13. /**
  14. * 部门Id
  15. */
  16. @Id private Long deptId;
  17. /**
  18. * 部门名称
  19. */
  20. private String deptName;
  21. /**
  22. * 部门经理/经理姓名
  23. */
  24. private String deptManager;
  25. }

3.3. 新建 DeptQTO.java

  1. package com.user.entity;
  2. import com.topfox.annotation.Id;
  3. import com.topfox.annotation.Table;
  4. import com.topfox.common.DataQTO;
  5. import lombok.Getter;
  6. import lombok.Setter;
  7. import lombok.experimental.Accessors;
  8. @Setter
  9. @Getter
  10. @Accessors(chain = true)
  11. @Table(name = "depts")
  12. public class DeptQTO extends DataQTO {
  13. @Id private Integer deptId;
  14. private String deptName;
  15. private String deptManager;
  16. }

3.4. 新建 DeptDao.java层 和 DeptMapper.xml

DeptDao.java:

  1. package com.user.dao;
  2. import com.topfox.mapper.BaseMapper;
  3. import com.user.entity.DeptDTO;
  4. import org.springframework.stereotype.Component;
  5. @Component
  6. public interface DeptDao extends BaseMapper<DeptDTO> {
  7. }
  • 需要说明的是, 单表查询时, DeptMapper.xml 文件是不需要, 没有该文件不会报错. 一般存在多表联合查询时才会有 Mapper.xml 文件
  • Topfox针对单表的所有复杂查询, 新增/修改和删除, 都可以自动生成SQL, 所以一般情况下, xxxMapper.xml 可以没有, 有的话也是很干净的.
  • DeptMapper.xml 源码如下:
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
  3. <mapper namespace="com.user.dao.DeptDao">
  4. <resultMap id="list" type="com.user.entity.DeptDTO">
  5. </resultMap>
  6. <sql id="whereClause" >
  7. <where>
  8. <if test = "deptId != null"> AND a.deptId = #{deptId}</if>
  9. <if test = "deptName != null"> AND a.deptName = #{deptName}</if>
  10. <if test = "deptManager != null">AND a.deptManager = #{deptManager}</if>
  11. </where>
  12. </sql>
  13. <select id="list" resultMap="list">
  14. SELECT a.deptId, a.deptName, a.deptManager
  15. FROM depts a
  16. <include refid="whereClause"/>
  17. <if test="limit != null">${limit}</if>
  18. </select>
  19. <select id="listCount" resultType="int">
  20. SELECT count(*)
  21. FROM depts a
  22. <include refid="whereClause"/>
  23. </select>
  24. </mapper>

3.5. 新建服务层 DeptService.java

  • 虽然以下代码很简单, 但<<核心使用>>章节里面的所有功能方法都已自动具备. 如 getObject listObjects selectMaps selctCount selectMax等若干. 这也是TopFox的优势所在
  1. package com.user.service;
  2. import com.topfox.common.DataQTO;
  3. import com.topfox.common.Response;
  4. import com.topfox.service.AdvancedService;
  5. import com.user.dao.DeptDao;
  6. import com.user.entity.DeptDTO;
  7. import org.springframework.stereotype.Service;
  8. import java.util.List;
  9. @Service
  10. public class DeptService extends AdvancedService<DeptDao, DeptDTO> {
  11. @Override
  12. public int insert(DeptDTO dto) {
  13. return super.insert(dto);
  14. }
  15. @Override
  16. public int update(DeptDTO dto) {
  17. return super.update(dto);
  18. }
  19. @Override
  20. public int deleteByIds(Number... ids) {
  21. return super.deleteByIds(ids);
  22. }
  23. @Override
  24. public Response<List<DeptDTO>> list(DataQTO qto) {
  25. return super.list(qto);
  26. }
  27. }

3.6. 新建控制层 DeptController.java

  1. package com.user.controller;
  2. import com.topfox.annotation.TokenOff;
  3. import com.topfox.common.Response;
  4. import com.topfox.misc.Misc;
  5. import com.user.entity.DeptDTO;
  6. import com.user.entity.DeptQTO;
  7. import com.user.service.DeptService;
  8. import org.springframework.beans.factory.annotation.Autowired;
  9. import org.springframework.web.bind.annotation.*;
  10. import java.util.List;
  11. public class DeptController {
  12. @Autowired
  13. DeptService deptService;
  14. @PostMapping
  15. public Response<DeptDTO> insert(@RequestBody DeptDTO dto) {
  16. deptService.insertGetKey(dto);
  17. return new Response<>(dto, 1);
  18. }
  19. @PutMapping
  20. public Response<DeptDTO> update(@RequestBody DeptDTO dto) {
  21. Misc.checkObjNotNull(dto, "id");
  22. int count = deptService.update(dto);
  23. return new Response<>(dto, count);
  24. }
  25. @DeleteMapping("/{ids}")
  26. public Response<Integer> delete(@PathVariable("ids") Long ids) {
  27. Misc.checkObjNotNull(ids, "ids");
  28. int count = deptService.deleteByIds(ids);
  29. return new Response<>(count);
  30. }
  31. @GetMapping
  32. public Response<List<DeptDTO>> list(DeptQTO qto) {
  33. return deptService.list(qto);
  34. }
  35. @GetMapping("/{id}")
  36. public Response<DeptDTO> get(@PathVariable("id") Long id) {
  37. Misc.checkObjNotNull(id, "id");
  38. DeptDTO detp = deptService.getObject(id);
  39. return new Response(detp);
  40. }
  41. }