首 页 | 代码演示 | 在线试用 | validtor生成 | ssmCode基础版 | ssmCode高级版 | Join Sql 生成 Mapper | 登录|注册 |
数据层实现方式: 基于mybatis-plus【示例代码】 | ||||
CityDO.java
package com.ssmcode.domain;
import java.util.Date;
import io.swagger.annotations.ApiModelProperty;
import io.swagger.annotations.ApiModel;
import lombok.Data;
import lombok.EqualsAndHashCode;
import com.ssmcode.domain.BaseDO;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableLogic;
import com.baomidou.mybatisplus.annotation.TableName;
/**
* 城市
* @author ssmcode.com 2024-07-12 10:35:25
*/
@Data
@EqualsAndHashCode(callSuper = true)
@ApiModel(value="城市",parent=BaseDO.class)
@TableName("t_city")
public class CityDO extends BaseDO {
@TableId(value = "id")
@ApiModelProperty(value="主键",required=true)
/** 主键 */
private Integer id;
@ApiModelProperty(value="名称",required=true)
/** 名称 */
private String name;
@ApiModelProperty(value="编码",required=true)
/** 编码 */
private String code;
@ApiModelProperty(value="父ID",required=true)
/** 父ID */
private Integer parentId;
@TableLogic
@ApiModelProperty(value="是否删除 0否1是",required=true)
/** 是否删除 0否1是 */
private Boolean isDelete;
@ApiModelProperty(value="创建人ID",required=true)
/** 创建人ID */
private Integer createId;
@ApiModelProperty(value="修改人ID",required=true)
/** 修改人ID */
private Integer updateId;
@ApiModelProperty(value="发布时间",required=false)
/** 发布时间 */
private Date publishTime;
@ApiModelProperty(value="创建时间",required=false)
/** 创建时间 */
private Date createTime;
@ApiModelProperty(value="修改时间",required=false)
/** 修改时间 */
private Date updateTime;
}
|
CityQuery.java
package com.ssmcode.query;
import com.ssmcode.domain.CityDO;
import java.util.Date;
import java.util.List;
import lombok.Data;
import lombok.EqualsAndHashCode;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
/**
* query对象直接从 domain层继承(DO|PO|Entity)继承
*
* 城市查询对象
* @author ssmcode.com 2024-07-12 10:35:25
*
*/
@Data
@EqualsAndHashCode(callSuper = true)
@ApiModel(value="城市查询对象",parent=CityDO.class)
public class CityQuery extends CityDO {
@ApiModelProperty(value="发布时间 start",required=false)
/** 发布时间 start */
private Date startPublishTime;
@ApiModelProperty(value="发布时间 end",required=false)
/** 发布时间 end */
private Date endPublishTime;
@ApiModelProperty(value="创建时间 start",required=false)
/** 创建时间 start */
private Date startCreateTime;
@ApiModelProperty(value="创建时间 end",required=false)
/** 创建时间 end */
private Date endCreateTime;
@ApiModelProperty(value="修改时间 start",required=false)
/** 修改时间 start */
private Date startUpdateTime;
@ApiModelProperty(value="修改时间 end",required=false)
/** 修改时间 end */
private Date endUpdateTime;
@ApiModelProperty(value="搜索关键字",required=false)
/** 搜索关键字 */
private String searchStr;
@ApiModelProperty(value="主键ID列表",required=false)
/** 主键ID列表 */
private List<Integer> ids;
}
|
CityMapper.java
package com.ssmcode.mapper;
import java.util.List;
import org.apache.commons.lang.StringUtils;
import org.apache.commons.collections.CollectionUtils;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.ssmcode.domain.CityDO;
import com.ssmcode.query.CityQuery;
/**
* 城市 Mapper
* @author ssmcode.com 2024-07-12 10:35:25
*/
public interface CityMapper extends BaseMapper<CityDO> {
default LambdaQueryWrapper<CityDO> buildQueryWrapper(CityQuery cityQuery) {
LambdaQueryWrapper<CityDO> queryWrapper = Wrappers.lambdaQuery();
queryWrapper.eq(cityQuery.getId() != null, CityDO::getId, cityQuery.getId());
queryWrapper.eq(StringUtils.isNotBlank(cityQuery.getName()), CityDO::getName, cityQuery.getName());
queryWrapper.eq(StringUtils.isNotBlank(cityQuery.getCode()), CityDO::getCode, cityQuery.getCode());
queryWrapper.eq(cityQuery.getParentId() != null, CityDO::getParentId, cityQuery.getParentId());
queryWrapper.eq(cityQuery.getIsDelete() != null, CityDO::getIsDelete, cityQuery.getIsDelete());
queryWrapper.eq(cityQuery.getCreateId() != null, CityDO::getCreateId, cityQuery.getCreateId());
queryWrapper.eq(cityQuery.getUpdateId() != null, CityDO::getUpdateId, cityQuery.getUpdateId());
queryWrapper.ge(cityQuery.getStartPublishTime() != null, CityDO::getPublishTime, cityQuery.getStartPublishTime());
queryWrapper.le(cityQuery.getEndPublishTime() != null, CityDO::getPublishTime, cityQuery.getEndPublishTime());
queryWrapper.ge(cityQuery.getStartCreateTime() != null, CityDO::getCreateTime, cityQuery.getStartCreateTime());
queryWrapper.le(cityQuery.getEndCreateTime() != null, CityDO::getCreateTime, cityQuery.getEndCreateTime());
queryWrapper.ge(cityQuery.getStartUpdateTime() != null, CityDO::getUpdateTime, cityQuery.getStartUpdateTime());
queryWrapper.le(cityQuery.getEndUpdateTime() != null, CityDO::getUpdateTime, cityQuery.getEndUpdateTime());
queryWrapper.in(CollectionUtils.isNotEmpty(cityQuery.getIds()),CityDO::getId, cityQuery.getIds());
queryWrapper.like(StringUtils.isNotBlank(cityQuery.getSearchStr()), CityDO::getName, cityQuery.getSearchStr());
return queryWrapper;
}
default CityDO dynamicSelectOne(CityQuery cityQuery){
return this.selectOne(buildQueryWrapper(cityQuery));
}
default Integer dynamicSelectCount(CityQuery cityQuery){
return this.selectCount(buildQueryWrapper(cityQuery)).intValue();
}
default List<CityDO> dynamicSelectList(CityQuery cityQuery){
return this.selectList(buildQueryWrapper(cityQuery));
}
}
|
city-mybatis-sqlmap.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.ssmcode.mapper.CityMapper">
</mapper>
|
CityDTO.java
package com.ssmcode.dto;
import com.ssmcode.domain.CityDO;
/**
* dto对象一般直接从 domain层继承(DO|PO|Entity) 也可以包含其他domain对象 继承的属性不满足业务需求时,可以根据业务手动添加其他属性
* DTO一般用于feign层调用的API
*
* 城市数据转换对象
* @author ssmcode.com 2024-07-12 10:35:25
*
*/
public class CityDTO extends CityDO {
// dto对象一般直接从 domain层继承(DO|PO|Entity)
// 也可以包含其他domain对象
// 继承的属性不足时,可以根据业务手动添加期他属性
// DTO一般用于feign层调用的API
}
|
BaseDO.java
package com.ssmcode.domain;
import io.swagger.annotations.ApiModelProperty;
import java.io.Serializable;
import com.alibaba.excel.annotation.ExcelIgnore;
import com.baomidou.mybatisplus.annotation.TableField;
public class BaseDO implements Serializable {
public static final int MAX_PAGE_SIZE = 2000;
public static final int DEFAULT_START_PAGE = 1;
public static final int PAGE_SIZE = 20;
/** SQL语句limit默认限制数 */
@ApiModelProperty(value="limit分页size,前端无须关心此字段",required=false,hidden=true)
@ExcelIgnore
@TableField(exist = false)
private Integer limitSize = MAX_PAGE_SIZE;
/** 当前页码 */
@ApiModelProperty(value="当前页码,分页查询时使用",required=false,hidden=false)
@ExcelIgnore
@TableField(exist = false)
private Integer currentPage;
/** 每页记录数 */
@ApiModelProperty(value="每页记录条数,分页查询时使用",required=false,hidden=false)
@ExcelIgnore
@TableField(exist = false)
private Integer pageSize;
/** 开始记录数 */
@ApiModelProperty(value="开始记录数,分页查询时使用",required=false,hidden=true)
@ExcelIgnore
@TableField(exist = false)
private Integer start;
@ApiModelProperty(value="结束记录数,分页查询时使用",required=false,hidden=true)
@ExcelIgnore
@TableField(exist = false)
private Integer end;
public Integer getLimitSize() {
return limitSize;
}
public void setLimitSize(Integer limitSize) {
this.limitSize = limitSize;
}
public Integer getCurrentPage() {
return currentPage;
}
public void setCurrentPage(Integer currentPage) {
this.currentPage = currentPage;
}
public Integer getPageNumber() {//bootstrap-table分页使用
return this.getCurrentPage();
}
public void setPageNumber(Integer pageNumber) {//bootstrap-table分页使用
this.setCurrentPage(pageNumber);
}
public Integer getPageSize() {
return pageSize;
}
public void setPageSize(Integer pageSize) {
this.pageSize = pageSize;
}
public Integer getStart() {
if (currentPage ==null || pageSize ==null) {
return null;
}
if (currentPage < 0 || pageSize < 0) {
return 0;
} else {
return ((currentPage - 1) * pageSize);
}
}
public Integer getEnd() {
if (this.getStart() != null) {
return this.getStart() + this.getPageSize();
}
return null;
}
}
|
数据层实现方式: 基于tkmybatis【示例代码】 | ||||
BaseDO.java
package com.ssmcode.domain;
import io.swagger.annotations.ApiModelProperty;
import java.io.Serializable;
import com.alibaba.excel.annotation.ExcelIgnore;
import javax.persistence.Transient;
public class BaseDO implements Serializable {
public static final int MAX_PAGE_SIZE = 2000;
public static final int DEFAULT_START_PAGE = 1;
public static final int PAGE_SIZE = 20;
/** SQL语句limit默认限制数 */
@ApiModelProperty(value="limit分页size,前端无须关心此字段",required=false,hidden=true)
@ExcelIgnore
@Transient
private Integer limitSize = MAX_PAGE_SIZE;
/** 当前页码 */
@ApiModelProperty(value="当前页码,分页查询时使用",required=false,hidden=false)
@ExcelIgnore
@Transient
private Integer currentPage;
/** 每页记录数 */
@ApiModelProperty(value="每页记录条数,分页查询时使用",required=false,hidden=false)
@ExcelIgnore
@Transient
private Integer pageSize;
/** 开始记录数 */
@ApiModelProperty(value="开始记录数,分页查询时使用",required=false,hidden=true)
@ExcelIgnore
@Transient
private Integer start;
@ApiModelProperty(value="结束记录数,分页查询时使用",required=false,hidden=true)
@ExcelIgnore
@Transient
private Integer end;
public Integer getLimitSize() {
return limitSize;
}
public void setLimitSize(Integer limitSize) {
this.limitSize = limitSize;
}
public Integer getCurrentPage() {
return currentPage;
}
public void setCurrentPage(Integer currentPage) {
this.currentPage = currentPage;
}
public Integer getPageNumber() {//bootstrap-table分页使用
return this.getCurrentPage();
}
public void setPageNumber(Integer pageNumber) {//bootstrap-table分页使用
this.setCurrentPage(pageNumber);
}
public Integer getPageSize() {
return pageSize;
}
public void setPageSize(Integer pageSize) {
this.pageSize = pageSize;
}
public Integer getStart() {
if (currentPage ==null || pageSize ==null) {
return null;
}
if (currentPage < 0 || pageSize < 0) {
return 0;
} else {
return ((currentPage - 1) * pageSize);
}
}
public Integer getEnd() {
if (this.getStart() != null) {
return this.getStart() + this.getPageSize();
}
return null;
}
}
|
CityDO.java
package com.ssmcode.domain;
import java.util.Date;
import io.swagger.annotations.ApiModelProperty;
import io.swagger.annotations.ApiModel;
import lombok.Data;
import lombok.EqualsAndHashCode;
import com.ssmcode.domain.BaseDO;
import javax.persistence.Column;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;
/**
* 城市
* @author ssmcode.com 2024-07-12 10:35:52
*/
@Data
@EqualsAndHashCode(callSuper = true)
@ApiModel(value="城市",parent=BaseDO.class)
@Table(name = "t_city")
public class CityDO extends BaseDO {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@ApiModelProperty(value="主键",required=true)
/** 主键 */
private Integer id;
@Column(name = "name")
@ApiModelProperty(value="名称",required=true)
/** 名称 */
private String name;
@Column(name = "code")
@ApiModelProperty(value="编码",required=true)
/** 编码 */
private String code;
@Column(name = "parent_id")
@ApiModelProperty(value="父ID",required=true)
/** 父ID */
private Integer parentId;
@Column(name = "is_delete")
@ApiModelProperty(value="是否删除 0否1是",required=true)
/** 是否删除 0否1是 */
private Boolean isDelete;
@Column(name = "create_id")
@ApiModelProperty(value="创建人ID",required=true)
/** 创建人ID */
private Integer createId;
@Column(name = "update_id")
@ApiModelProperty(value="修改人ID",required=true)
/** 修改人ID */
private Integer updateId;
@Column(name = "publish_time")
@ApiModelProperty(value="发布时间",required=false)
/** 发布时间 */
private Date publishTime;
@Column(name = "create_time")
@ApiModelProperty(value="创建时间",required=false)
/** 创建时间 */
private Date createTime;
@Column(name = "update_time")
@ApiModelProperty(value="修改时间",required=false)
/** 修改时间 */
private Date updateTime;
}
|
CityQuery.java
package com.ssmcode.query;
import com.ssmcode.domain.CityDO;
import java.util.Date;
import java.util.List;
import lombok.Data;
import lombok.EqualsAndHashCode;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
/**
* query对象直接从 domain层继承(DO|PO|Entity)继承
*
* 城市查询对象
* @author ssmcode.com 2024-07-12 10:35:52
*
*/
@Data
@EqualsAndHashCode(callSuper = true)
@ApiModel(value="城市查询对象",parent=CityDO.class)
public class CityQuery extends CityDO {
@ApiModelProperty(value="发布时间 start",required=false)
/** 发布时间 start */
private Date startPublishTime;
@ApiModelProperty(value="发布时间 end",required=false)
/** 发布时间 end */
private Date endPublishTime;
@ApiModelProperty(value="创建时间 start",required=false)
/** 创建时间 start */
private Date startCreateTime;
@ApiModelProperty(value="创建时间 end",required=false)
/** 创建时间 end */
private Date endCreateTime;
@ApiModelProperty(value="修改时间 start",required=false)
/** 修改时间 start */
private Date startUpdateTime;
@ApiModelProperty(value="修改时间 end",required=false)
/** 修改时间 end */
private Date endUpdateTime;
@ApiModelProperty(value="搜索关键字",required=false)
/** 搜索关键字 */
private String searchStr;
@ApiModelProperty(value="主键ID列表",required=false)
/** 主键ID列表 */
private List<Integer> ids;
}
|
CityMapper.java
package com.ssmcode.mapper;
import java.util.List;
import org.apache.commons.lang.StringUtils;
import org.apache.commons.collections.CollectionUtils;
import org.apache.ibatis.annotations.Param;
import tk.mybatis.mapper.common.BaseMapper;
import com.ssmcode.domain.CityDO;
import com.ssmcode.query.CityQuery;
/**
* 城市 Mapper
* @author ssmcode.com 2024-07-12 10:35:52
*/
public interface CityMapper extends BaseMapper<CityDO> {
/**
* 根据IDS批量逻辑删除 城市
* @param ids
* @return 更新行数
*/
int logicDeleteByIds(@Param("ids") List<Integer> ids,@Param("updateId") Integer updateId);
/**
* 批量插入 城市
* @param cityList
* @return 插入条数
*/
int batchInsert(List<CityDO> cityList);
/**
* 根据 城市主键列表 动态返回 城市 列表
* @param ids 主键列表,最多传递2000个,建议传递200个以内
* @return List<CityDO>
*/
List<CityDO> selectByIds(List<Integer> ids);
/**
* 根据 城市 动态返回 城市 对象
* @param cityQuery
* @return CityDO
*/
CityDO dynamicSelectOne(CityQuery cityQuery);
/**
* 根据 城市 动态返回 城市 列表
* @param cityQuery
* @return List<CityDO>
*/
List<CityDO> dynamicSelectList(CityQuery cityQuery);
/**
* 根据 城市 动态返回记录数
* @param cityQuery
* @return 记录条数
*/
Integer dynamicSelectCount(CityQuery cityQuery);
/**
* 根据 城市 动态返回 城市 Limit 列表
* @param cityQuery start,pageSize属性必须指定
* @return List<CityDO>
*/
List<CityDO> dynamicSelectPageQuery(CityQuery cityQuery);
}
|
CityDTO.java
package com.ssmcode.dto;
import com.ssmcode.domain.CityDO;
/**
* dto对象一般直接从 domain层继承(DO|PO|Entity) 也可以包含其他domain对象 继承的属性不满足业务需求时,可以根据业务手动添加其他属性
* DTO一般用于feign层调用的API
*
* 城市数据转换对象
* @author ssmcode.com 2024-07-12 10:35:52
*
*/
public class CityDTO extends CityDO {
// dto对象一般直接从 domain层继承(DO|PO|Entity)
// 也可以包含其他domain对象
// 继承的属性不足时,可以根据业务手动添加期他属性
// DTO一般用于feign层调用的API
}
|
city-mybatis-sqlmap.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.ssmcode.mapper.CityMapper">
<resultMap type="com.ssmcode.domain.CityDO" id="CityDOResultMap">
<id column="id" property="id" jdbcType="INTEGER"/>
<result column="name" property="name" jdbcType="VARCHAR" />
<result column="code" property="code" jdbcType="VARCHAR" />
<result column="parent_id" property="parentId" jdbcType="INTEGER" />
<result column="is_delete" property="isDelete" jdbcType="BIT" />
<result column="create_id" property="createId" jdbcType="INTEGER" />
<result column="update_id" property="updateId" jdbcType="INTEGER" />
<result column="publish_time" property="publishTime" jdbcType="TIMESTAMP" />
<result column="create_time" property="createTime" jdbcType="TIMESTAMP" />
<result column="update_time" property="updateTime" jdbcType="TIMESTAMP" />
</resultMap>
<sql id="allColumnFields">
id,name,code,parent_id,is_delete,create_id,update_id,publish_time,create_time,update_time
</sql>
<!-- 只有varchar char text类型 做 !='' 判断,其他类型时只做!=null 判断 0或fasle与空''是相同的【老版本】,在mybatis中的动态语句中-->
<!-- xml转义字符需要 <![CDATA[ ]]> 标签-->
<sql id="dynamicWhereFieldsUseQuery">
<where>
<trim prefixOverrides="AND |OR">
<if test="id != null "> AND id=#{id,jdbcType=INTEGER} </if>
<if test="name != null and name != '' "> AND name=#{name,jdbcType=VARCHAR} </if>
<if test="code != null and code != '' "> AND code=#{code,jdbcType=VARCHAR} </if>
<if test="parentId != null "> AND parent_id=#{parentId,jdbcType=INTEGER} </if>
<if test="isDelete != null "> AND is_delete=#{isDelete,jdbcType=BIT} </if>
<if test="createId != null "> AND create_id=#{createId,jdbcType=INTEGER} </if>
<if test="updateId != null "> AND update_id=#{updateId,jdbcType=INTEGER} </if>
<if test="startPublishTime != null"><![CDATA[ AND publish_time>=#{startPublishTime} ]]></if>
<if test="endPublishTime != null"><![CDATA[ AND publish_time<=#{endPublishTime} ]]></if>
<if test="startCreateTime != null"><![CDATA[ AND create_time>=#{startCreateTime} ]]></if>
<if test="endCreateTime != null"><![CDATA[ AND create_time<=#{endCreateTime} ]]></if>
<if test="startUpdateTime != null"><![CDATA[ AND update_time>=#{startUpdateTime} ]]></if>
<if test="endUpdateTime != null"><![CDATA[ AND update_time<=#{endUpdateTime} ]]></if>
<if test="ids != null and ids.size()>0"> AND id in
<foreach item="id" index="index" collection="ids"
open="(" separator="," close=")">
#{id}
</foreach>
</if>
<if test="searchStr != null and searchStr != '' "> AND name LIKE CONCAT(CONCAT('%', #{searchStr}),'%') </if>
AND is_delete=0
</trim>
</where>
</sql>
<insert id="batchInsert" parameterType="java.util.List" statementType="PREPARED" useGeneratedKeys="false">
INSERT INTO t_city(
name,
code,
parent_id,
is_delete,
create_id,
update_id,
publish_time,
create_time,
update_time
)values
<foreach collection="list" item="item" index="index" separator=",">
(
#{item.name,jdbcType=VARCHAR},
#{item.code,jdbcType=VARCHAR},
#{item.parentId,jdbcType=INTEGER},
#{item.isDelete,jdbcType=BIT},
#{item.createId,jdbcType=INTEGER},
#{item.updateId,jdbcType=INTEGER},
#{item.publishTime,jdbcType=TIMESTAMP},
#{item.createTime,jdbcType=TIMESTAMP},
#{item.updateTime,jdbcType=TIMESTAMP}
)
</foreach>
</insert>
<update id="logicDeleteByIds" parameterType="java.util.Map">
update t_city set is_delete=1,update_id= #{updateId,jdbcType=INTEGER},update_time=now() WHERE id in
<foreach item="item" index="index" collection="ids" open="(" separator="," close=")">
#{item}
</foreach>
AND is_delete=0
</update>
<select id="selectByIds" resultMap="CityDOResultMap" parameterType="java.util.List">
SELECT
<include refid="allColumnFields" />
FROM
t_city
WHERE id in
<foreach item="item" index="index" collection="list" open="(" separator="," close=")">
#{item}
</foreach>
AND is_delete=0
</select>
<select id="dynamicSelectOne" resultMap="CityDOResultMap" parameterType="com.ssmcode.query.CityQuery">
SELECT
<include refid="allColumnFields" />
FROM
t_city
<include refid="dynamicWhereFieldsUseQuery" />
limit #{limitSize}
</select>
<select id="dynamicSelectList" resultMap="CityDOResultMap" parameterType="com.ssmcode.query.CityQuery">
SELECT
<include refid="allColumnFields" />
FROM
t_city
<include refid="dynamicWhereFieldsUseQuery" />
ORDER BY update_time DESC
limit #{limitSize}
</select>
<select id="dynamicSelectCount" resultType="int" parameterType="com.ssmcode.query.CityQuery">
SELECT
count(id)
FROM
t_city
<include refid="dynamicWhereFieldsUseQuery" />
</select>
<select id="dynamicSelectPageQuery" resultMap="CityDOResultMap" parameterType="com.ssmcode.query.CityQuery">
SELECT
<include refid="allColumnFields" />
FROM
t_city
<include refid="dynamicWhereFieldsUseQuery" />
ORDER BY update_time DESC
<if test="start != null and pageSize!=null">
LIMIT #{start},#{pageSize}
</if>
</select>
<!--
如果生成完代码后,表有所改动,则可以按以下步骤可以减少手动修改效率问题
1.提交代码到代码仓库
2.在www.ssmcode.com上选择上次的生成记录,重新加载配置,再生成代码
3.把标签ID为updateDynamic【含】以上的代码覆盖
4.标签updateDynamic以下的代码如果字段名【逻辑删除、状态、表中父ID、创建时间、修改时间、创建人ID、修改人ID、表中外键】无变化不需要覆盖,有变化需要覆盖
5.修改实体com.ssmcode.domain.CityDO类
6.修改com.ssmcode.domain.CityMapper类
7.对比git|svn记录,检查代码修改提交即可
-->
<!--#########################自定义方法、resultMap、sql片段 请写在此行下面,方便接口重新生成作代码对比##################################### -->
</mapper>
|
数据层实现方式: 继承BaseMapper接口【示例代码】 | ||||
CityMapper.java
package com.ssmcode.mapper;
import java.util.List;
import com.ssmcode.domain.CityDO;
import com.ssmcode.query.CityQuery;
import org.apache.ibatis.annotations.Param;
import com.ssmcode.plus.BaseMapper;
import com.ssmcode.plus.LogicDeleteMapper;
/**
* 城市 Mapper
* @author ssmcode.com 2024-07-04 11:47:33
*/
public interface CityMapper extends BaseMapper<CityDO>,LogicDeleteMapper<CityDO>{
/**
* 根据 城市 动态返回 城市 对象
* @param cityQuery
* @return CityDO
*/
CityDO dynamicSelectOne(CityQuery cityQuery);
/**
* 根据 城市 动态返回 城市 列表
* @param cityQuery
* @return List<CityDO>
*/
List<CityDO> dynamicSelectList(CityQuery cityQuery);
/**
* 根据 城市 动态返回记录数
* @param cityQuery
* @return 记录条数
*/
Integer dynamicSelectCount(CityQuery cityQuery);
/**
* 根据 城市 动态返回 城市 Limit 列表
* @param cityQuery start,pageSize属性必须指定
* @return List<CityDO>
*/
List<CityDO> dynamicSelectPageQuery(CityQuery cityQuery);
/*#########################自定义方法请写在此行下面,方便接口重新生成作代码对比#####################################*/
}
|
city-mybatis-sqlmap.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.ssmcode.mapper.CityMapper">
<resultMap type="com.ssmcode.domain.CityDO" id="CityDOResultMap">
<id column="id" property="id" jdbcType="INTEGER"/>
<result column="name" property="name" jdbcType="VARCHAR" />
<result column="code" property="code" jdbcType="VARCHAR" />
<result column="parent_id" property="parentId" jdbcType="INTEGER" />
<result column="is_delete" property="isDelete" jdbcType="BIT" />
<result column="create_id" property="createId" jdbcType="INTEGER" />
<result column="update_id" property="updateId" jdbcType="INTEGER" />
<result column="publish_time" property="publishTime" jdbcType="TIMESTAMP" />
<result column="create_time" property="createTime" jdbcType="TIMESTAMP" />
<result column="update_time" property="updateTime" jdbcType="TIMESTAMP" />
</resultMap>
<sql id="allColumnFields">
id,name,code,parent_id,is_delete,create_id,update_id,publish_time,create_time,update_time
</sql>
<!-- 只有varchar char text类型 做 !='' 判断,其他类型时只做!=null 判断 0或fasle与空''是相同的【老版本】,在mybatis中的动态语句中-->
<!-- xml转义字符需要 <![CDATA[ ]]> 标签-->
<sql id="dynamicWhereFieldsUseQuery">
<where>
<trim prefixOverrides="AND |OR">
<if test="id != null "> AND id=#{id,jdbcType=INTEGER} </if>
<if test="name != null and name != '' "> AND name=#{name,jdbcType=VARCHAR} </if>
<if test="code != null and code != '' "> AND code=#{code,jdbcType=VARCHAR} </if>
<if test="parentId != null "> AND parent_id=#{parentId,jdbcType=INTEGER} </if>
<if test="isDelete != null "> AND is_delete=#{isDelete,jdbcType=BIT} </if>
<if test="createId != null "> AND create_id=#{createId,jdbcType=INTEGER} </if>
<if test="updateId != null "> AND update_id=#{updateId,jdbcType=INTEGER} </if>
<if test="startPublishTime != null"><![CDATA[ AND publish_time>=#{startPublishTime} ]]></if>
<if test="endPublishTime != null"><![CDATA[ AND publish_time<=#{endPublishTime} ]]></if>
<if test="startCreateTime != null"><![CDATA[ AND create_time>=#{startCreateTime} ]]></if>
<if test="endCreateTime != null"><![CDATA[ AND create_time<=#{endCreateTime} ]]></if>
<if test="startUpdateTime != null"><![CDATA[ AND update_time>=#{startUpdateTime} ]]></if>
<if test="endUpdateTime != null"><![CDATA[ AND update_time<=#{endUpdateTime} ]]></if>
<if test="ids != null and ids.size()>0"> AND id in
<foreach item="id" index="index" collection="ids"
open="(" separator="," close=")">
#{id}
</foreach>
</if>
<if test="searchStr != null and searchStr != '' "> AND name LIKE CONCAT(CONCAT('%', #{searchStr}),'%') </if>
AND is_delete=0
</trim>
</where>
</sql>
<select id="dynamicSelectOne" resultMap="CityDOResultMap" parameterType="com.ssmcode.query.CityQuery">
SELECT
<include refid="allColumnFields" />
FROM
t_city
<include refid="dynamicWhereFieldsUseQuery" />
limit #{limitSize}
</select>
<select id="dynamicSelectList" resultMap="CityDOResultMap" parameterType="com.ssmcode.query.CityQuery">
SELECT
<include refid="allColumnFields" />
FROM
t_city
<include refid="dynamicWhereFieldsUseQuery" />
ORDER BY update_time DESC
limit #{limitSize}
</select>
<select id="dynamicSelectCount" resultType="int" parameterType="com.ssmcode.query.CityQuery">
SELECT
count(id)
FROM
t_city
<include refid="dynamicWhereFieldsUseQuery" />
</select>
<select id="dynamicSelectPageQuery" resultMap="CityDOResultMap" parameterType="com.ssmcode.query.CityQuery">
SELECT
<include refid="allColumnFields" />
FROM
t_city
<include refid="dynamicWhereFieldsUseQuery" />
ORDER BY update_time DESC
<if test="start != null and pageSize!=null">
LIMIT #{start},#{pageSize}
</if>
</select>
<!--
如果生成完代码后,表有所改动,则可以按以下步骤可以减少手动修改效率问题
1.提交代码到代码仓库
2.在www.ssmcode.com上选择上次的生成记录,重新加载配置,再生成代码
3.覆盖此注释以上部分
4.修改实体com.ssmcode.domain.CityDO类
5.修改com.ssmcode.domain.CityMapper类
6.对比git|svn记录,检查代码修改提交即可
-->
<!--#########################自定义方法、resultMap、sql片段 请写在此行下面,方便接口重新生成作代码对比##################################### -->
</mapper>
|
Table.java
package com.ssmcode.plus;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
* 列名注解,优先从此注解中取 列名称
*
* @author www.ssmcode.com 2024-07-04 11:47:33
*
*/
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
public @interface Table {
String value() default "";
}
|
PrimaryKey.java
package com.ssmcode.plus;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
* 列名注解,优先从此注解中取 列名称
*
* @author www.ssmcode.com 2024-07-04 11:47:33
*
*/
@Target({ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
public @interface PrimaryKey {
String value() default "";
}
|
Column.java
package com.ssmcode.plus;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
* 列名注解,优先从此注解中取 列名称
*
* @author www.ssmcode.com 2024-07-04 11:47:33
*
*/
@Target({ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
public @interface Column {
String value() default "";
}
|
ExcludeField.java
package com.ssmcode.plus;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
* 排除属性与表字段映射
*
* @author www.ssmcode.com 2024-07-04 11:47:33
*
*/
@Target({ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
public @interface ExcludeField {
}
|
LogicDelete.java
package com.ssmcode.plus;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
* 列名注解,优先从此注解中取 列名称
*
* @author www.ssmcode.com 2024-07-04 11:47:33
*
*/
@Target({ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
public @interface LogicDelete {
/**
* 逻辑删除字段名
* @return
*/
String value() default "";
/**
* 正常值|未删除值
* @return
*/
String defaultValue() default "0";
/**
* 逻辑已删除值
* @return
*/
String delValue() default "1";
}
|
BaseMapper.java
package com.ssmcode.plus;
import java.io.Serializable;
import java.lang.reflect.Field;
import java.util.List;
import java.util.Objects;
import org.apache.commons.collections.CollectionUtils;
import org.apache.ibatis.annotations.InsertProvider;
import org.apache.ibatis.annotations.Options;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.SelectProvider;
import org.apache.ibatis.annotations.UpdateProvider;
import org.springframework.core.GenericTypeResolver;
/**
* Mybatis Mapper操作基类,表格必须有唯一主键且自增长 如果主键名称不为 id,则需要在子类mapper中 重写
* 【insert、insertSelective】方法上的注解 @Option【keyColumn和keyProperty】属性
* 此类中的所有查询、逻辑删除、更新方法都自动包含逻辑删除条件,只针对未删除数据【DataObject类中如有逻辑删除字段映射】
*
* @param <T>
* @author www.ssmcode.com 2024-07-04 11:47:33
*
*/
public interface BaseMapper<T> extends RootMapper<T>{
/**
* 插入单个对象【所有字段】主键名称不为 id,则需要在子类mapper中 重写此方法,注意@Options
*
* @param entity DataObject实体对象
* @return 插入记录数
*/
@InsertProvider(method = "insert", type = BaseSqlProvider.class)
@Options(useGeneratedKeys = true, keyColumn = "id", keyProperty = "id")
public int insert(T entity);
/**
* 动态插入单个对象【非null值字段】主键名称不为 id,则需要在子类mapper中 重写
*
* @param entity DataObject实体对象
* @return 插入记录数
*/
@InsertProvider(method = "insertSelective", type = BaseSqlProvider.class)
@Options(useGeneratedKeys = true, keyColumn = "id", keyProperty = "id")
public int insertSelective(T entity);
/**
* 批量插入对象【所有字段】
*
* @param list DataObject实体对象列表
* @return 插入成功记录数
*/
@InsertProvider(method = "batchInsert", type = BaseSqlProvider.class)
public int batchInsert(@Param("list") List<T> list);
/**
* 根据主键ID更新整个对象属性【除主键外其他属性都可更新为null】,表中 创建人及创建时间字段 不更新
*
* @param entity DataObject实体对象
* @return 更新记录数
*/
@UpdateProvider(method = "updateById", type = BaseSqlProvider.class)
public int updateById(T entity);
/**
* 根据参数对象的主键ID更新 部分 对象属性【属性值必须 非null,字符串非'' 才会更新 】,表中 创建人及创建时间字段 不更新
*
* @param entity DataObject实体对象
* @return 更新记录数
*/
@UpdateProvider(method = "updateDynamic", type = BaseSqlProvider.class)
public int updateDynamic(T entity);
/**
* 根据主键id查询返回单条DataObject对象
*
* @param id 主键ID 支持 Integer|Long
* @return DataObject对象
*/
default T selectById(Serializable id) {
T obj = this.selectById(id, this.coverDomainClass());
if (Objects.nonNull(obj)) {
return obj;
}
return Objects.nonNull(obj) ? obj : null;
}
/**
* 根据主键id和DataObject Class查询DataObject对象列表
*
* @param ids 主键ID列表 范型支持 Integer|Long
* @return DataObject对象列表
*/
default List<T> selectByIds(List<? extends Serializable> ids) {
List<T> list = this.selectByIds(ids, this.coverDomainClass());
if (Objects.nonNull(list)) {
return list;
}
return null;
}
/**
* 根据主键id、limitSize查询返回DataObject对象列表,一般用于小表,加载本地缓存时使用
*
* @param id 主键ID列表 范型支持 Integer|Long
* @return DataObject对象列表
*/
default List<T> queryRecordForCache(@Param("id") Serializable id, @Param("limitSize") Integer limitSize) {
List<T> list = this.queryRecordForCache(id, limitSize, this.coverDomainClass());
if (Objects.nonNull(list)) {
return list;
}
return null;
}
/**
* 根据主键ID在DataObject列表中查询返回一个实体对象
*
* @param list DataObject列表
* @param id 主键ID[Long|Integer|String]值与对应的DataObject的主键类型保持一致
* @return DataObject实体
*/
default T getDomainByListAndId(List<T> list, Serializable id) {
if (Objects.isNull(id)) {
return null;
}
if (CollectionUtils.isNotEmpty(list)) {
TableVO tableVO = BaseSqlProvider.getClassTableFromCache(this.coverDomainClass());
final Field primaryField = tableVO.getPrimaryField();
primaryField.setAccessible(true);
for (T t : list) {
Object object = null;
try {
object = primaryField.get(t);
if (object != null) {
if ((object instanceof Long && id instanceof Long) || (object instanceof Integer && id instanceof Integer)
|| (object instanceof String && id instanceof String)) {
if (object.equals(id)) {// 入参自动装配类型包装类型,使用equals判断
return t;
}
} else {
throw new RuntimeException("列表中对象的主键类型与参数ID的类型不一致,请传递正确的类型");
}
}
} catch (IllegalArgumentException e) {
// ingore
} catch (IllegalAccessException e) {
// ingore
}
}
}
return null;
}
/*
* @@@@@@@@@@@@@@@@@@@@@@ 以下带有Class参数的方法不建议直接调用 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
*/
/**
* 根据主键id和DataObject Class查询返回单条dataObject对象
*
* @param id 主键ID 支持 Integer|Long
* @param clazz dataObject类名
* @return DataObject对象
*/
@Deprecated
@SelectProvider(method = "selectById", type = BaseSqlProvider.class)
T selectById(@Param("id") Serializable id, @Param("clazz") Class<T> clazz);
/**
* 根据主键id和DataObject Class查询返回DataObject对象列表
*
* @param ids 主键ID列表 范型支持 Integer|Long
* @param clazz dataObject类名
* @return DataObject对象列表
*/
@Deprecated
@SelectProvider(method = "selectByIds", type = BaseSqlProvider.class)
List<T> selectByIds(@Param("ids") List<? extends Serializable> ids, @Param("clazz") Class<T> clazz);
/**
* 根据主键id、limitSize及DataObject Class 查询返回DataObject对象列表
*
* @param id 主键ID列表 范型支持 Integer|Long
* @param limitSize 每次查询记录条数
* @return List<T>
*/
@Deprecated
@SelectProvider(method = "queryRecordForCache", type = BaseSqlProvider.class)
List<T> queryRecordForCache(@Param("id") Serializable id, @Param("limitSize") Integer limitSize, @Param("clazz") Class<T> clazz);
}
|
LogicDeleteMapper.java
package com.ssmcode.plus;
import java.io.Serializable;
import java.util.List;
import java.util.Objects;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.UpdateProvider;
/**
* 定义逻辑删除方法
*
* @author www.ssmcode.com 2024-07-04 11:47:33
*
* @param <T>
*/
public interface LogicDeleteMapper<T> extends RootMapper<T>{
/**
* 根据主键id、更新者执行逻辑删除
*
* @param id 主键ID 支持 Integer|Long
* @param updateId 更新人
* @return DataObject对象
*/
default Integer logicDeleteById(Serializable id, Serializable updateId) {
Integer count = this.logicDeleteById(id, updateId, this.coverDomainClass());
if (Objects.nonNull(count)) {
return count;
}
return 0;
}
/**
* 根据主键id列表、更新人及DataObject Class批量逻辑删除
*
* @param ids 主键ID列表 范型支持 Integer|Long
* @param updateId 更新人 支持 Integer|Long|String
* @return 删除的记录数
*/
default Integer logicDeleteByIds(List<? extends Serializable> ids, Serializable updateId) {
Integer obj = this.logicDeleteByIds(ids, updateId, this.coverDomainClass());
if (Objects.nonNull(obj)) {
return obj;
}
return 0;
}
/**
* 根据主键id、更新者和DataObject Class执行逻辑删除
*
* @param id 主键ID 支持 Integer|Long
* @param updateId 更新人
* @param clazz dataObject类名
* @return DataObject对象
*/
@Deprecated
@UpdateProvider(method = "logicDeleteById", type = BaseSqlProvider.class)
Integer logicDeleteById(@Param("id") Serializable id, @Param("updateId") Serializable updateId, @Param("clazz") Class<T> clazz);
/**
* 根据主键id列表、更新人及DataObject Class执行逻辑删除
*
* @param ids 主键ID列表 范型支持 Integer|Long
* @param updateId 更新人
* @param clazz dataObject类名
* @return 删除的记录数
*/
@Deprecated
@UpdateProvider(method = "logicDeleteByIds", type = BaseSqlProvider.class)
Integer logicDeleteByIds(@Param("ids") List<? extends Serializable> ids, @Param("updateId") Serializable updateId, @Param("clazz") Class<T> clazz);
}
|
DeleteMapper.java
package com.ssmcode.plus;
import org.apache.ibatis.annotations.DeleteProvider;
import org.apache.ibatis.annotations.Param;
import java.io.Serializable;
import java.util.List;
import java.util.Objects;
/**
* 定义物理删除方法
*
* @author www.ssmcode.com 2024-07-04 11:47:33
*
* @param <T>
*/
public interface DeleteMapper<T> extends RootMapper<T>{
/**
* 根据主键ID物理删除一条记录,Where条件不拼接 逻辑删除列的值
*
* @param id 主键ID
* @return
*/
default Integer deleteById(Serializable id) {
Integer count = this.deleteById(id, this.coverDomainClass(), null);
if (Objects.nonNull(count)) {
return count;
}
return 0;
}
/**
* 根据主键ID 和逻辑删除列的值 来物理删除一条记录,logicColumnDeleteValues有值时Where条件拼接 逻辑删除列的值,否则不拼接
*
* @param id
* @param logicColumnDeleteValues 逻辑删除值列表,有值时Where条件拼接 逻辑删除列的值,否则不拼接
* @return
*/
default Integer deleteById(Serializable id, List<? extends Serializable> logicColumnDeleteValues) {
Integer count = this.deleteById(id, this.coverDomainClass(), logicColumnDeleteValues);
if (Objects.nonNull(count)) {
}
return 0;
}
/**
* 根据主键ID列表 来物理删除多条记录,Where条件不拼接 逻辑删除列的值
*
* @param ids 主键ID列表
* @return
*/
default Integer deleteByIds(List<? extends Serializable> ids) {
Integer obj = this.deleteByIds(ids, this.coverDomainClass(), null);
if (Objects.nonNull(obj)) {
return obj;
}
return 0;
}
/**
* 根据主键ID列表 和逻辑删除列的值 来物理删除多条记录,logicColumnDeleteValues有值时Where条件拼接 逻辑删除列的值,否则不拼接
*
* @param ids 主键ID列表
* @param logicColumnDeleteValues 逻辑删除值列表,有值时Where条件拼接 逻辑删除列的值,否则不拼接
* @return
*/
default Integer deleteByIds(List<? extends Serializable> ids, List<? extends Serializable> logicColumnDeleteValues) {
Integer obj = this.deleteByIds(ids, this.coverDomainClass(), logicColumnDeleteValues);
if (Objects.nonNull(obj)) {
return obj;
}
return 0;
}
@Deprecated
@DeleteProvider(method = "deleteById", type = BaseSqlProvider.class)
Integer deleteById(@Param("id") Serializable id, @Param("clazz") Class<T> clazz, @Param("values") List<? extends Serializable> logicColumnDeleteValues);
@Deprecated
@DeleteProvider(method = "deleteByIds", type = BaseSqlProvider.class)
Integer deleteByIds(@Param("ids") List<? extends Serializable> ids, @Param("clazz") Class<T> clazz,
@Param("values") List<? extends Serializable> logicColumnDeleteValues);
}
|
RootMapper.java
package com.ssmcode.plus;
import org.springframework.core.GenericTypeResolver;
public interface RootMapper<T> {
default Class<T> coverDomainClass() {
return (Class<T>) GenericTypeResolver.resolveTypeArgument(this.getClass(), RootMapper.class);
}
}
|
CityDO.java
package com.ssmcode.domain;
import java.util.Date;
import io.swagger.annotations.ApiModelProperty;
import io.swagger.annotations.ApiModel;
import lombok.Data;
import lombok.EqualsAndHashCode;
import com.ssmcode.domain.BaseDO;
import com.ssmcode.plus.Table;
import com.ssmcode.plus.PrimaryKey;
import com.ssmcode.plus.Column;
import com.ssmcode.plus.LogicDelete;
/**
* 城市
* @author ssmcode.com 2024-07-04 11:47:33
*/
@Data
@EqualsAndHashCode(callSuper = true)
@ApiModel(value="城市",parent=BaseDO.class)
@Table("t_city")
public class CityDO extends BaseDO {
@ApiModelProperty(value="主键",required=true)
@PrimaryKey
/** 主键 */
private Integer id;
@ApiModelProperty(value="名称",required=true)
/** 名称 */
private String name;
@ApiModelProperty(value="编码",required=true)
/** 编码 */
private String code;
@ApiModelProperty(value="父ID",required=true)
/** 父ID */
private Integer parentId;
@ApiModelProperty(value="是否删除 0否1是",required=true)
@LogicDelete(value = "is_delete")
/** 是否删除 0否1是 */
private Boolean isDelete;
@ApiModelProperty(value="创建人ID",required=true)
/** 创建人ID */
private Integer createId;
@ApiModelProperty(value="修改人ID",required=true)
/** 修改人ID */
private Integer updateId;
@ApiModelProperty(value="发布时间",required=false)
/** 发布时间 */
private Date publishTime;
@ApiModelProperty(value="创建时间",required=false)
/** 创建时间 */
private Date createTime;
@ApiModelProperty(value="修改时间",required=false)
/** 修改时间 */
private Date updateTime;
}
|
CityQuery.java
package com.ssmcode.query;
import com.ssmcode.domain.CityDO;
import java.util.Date;
import java.util.List;
import lombok.Data;
import lombok.EqualsAndHashCode;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
/**
* query对象直接从 domain层继承(DO|PO|Entity)继承
*
* 城市查询对象
* @author ssmcode.com 2024-07-04 11:47:33
*
*/
@Data
@EqualsAndHashCode(callSuper = true)
@ApiModel(value="城市查询对象",parent=CityDO.class)
public class CityQuery extends CityDO {
@ApiModelProperty(value="发布时间 start",required=false)
/** 发布时间 start */
private Date startPublishTime;
@ApiModelProperty(value="发布时间 end",required=false)
/** 发布时间 end */
private Date endPublishTime;
@ApiModelProperty(value="创建时间 start",required=false)
/** 创建时间 start */
private Date startCreateTime;
@ApiModelProperty(value="创建时间 end",required=false)
/** 创建时间 end */
private Date endCreateTime;
@ApiModelProperty(value="修改时间 start",required=false)
/** 修改时间 start */
private Date startUpdateTime;
@ApiModelProperty(value="修改时间 end",required=false)
/** 修改时间 end */
private Date endUpdateTime;
@ApiModelProperty(value="搜索关键字",required=false)
/** 搜索关键字 */
private String searchStr;
@ApiModelProperty(value="主键ID列表",required=false)
/** 主键ID列表 */
private List<Integer> ids;
}
|
CityDTO.java
package com.ssmcode.dto;
import com.ssmcode.domain.CityDO;
/**
* dto对象一般直接从 domain层继承(DO|PO|Entity) 也可以包含其他domain对象 继承的属性不满足业务需求时,可以根据业务手动添加其他属性
* DTO一般用于feign层调用的API
*
* 城市数据转换对象
* @author ssmcode.com 2024-07-04 11:47:33
*
*/
public class CityDTO extends CityDO {
// dto对象一般直接从 domain层继承(DO|PO|Entity)
// 也可以包含其他domain对象
// 继承的属性不足时,可以根据业务手动添加期他属性
// DTO一般用于feign层调用的API
}
|
BaseDO.java
package com.ssmcode.domain;
import io.swagger.annotations.ApiModelProperty;
import java.io.Serializable;
import com.alibaba.excel.annotation.ExcelIgnore;
public class BaseDO implements Serializable {
public static final int MAX_PAGE_SIZE = 2000;
public static final int DEFAULT_START_PAGE = 1;
public static final int PAGE_SIZE = 20;
/** SQL语句limit默认限制数 */
@ApiModelProperty(value="limit分页size,前端无须关心此字段",required=false,hidden=true)
@ExcelIgnore
private Integer limitSize = MAX_PAGE_SIZE;
/** 当前页码 */
@ApiModelProperty(value="当前页码,分页查询时使用",required=false,hidden=false)
@ExcelIgnore
private Integer currentPage;
/** 每页记录数 */
@ApiModelProperty(value="每页记录条数,分页查询时使用",required=false,hidden=false)
@ExcelIgnore
private Integer pageSize;
/** 开始记录数 */
@ApiModelProperty(value="开始记录数,分页查询时使用",required=false,hidden=true)
@ExcelIgnore
private Integer start;
public Integer getLimitSize() {
return limitSize;
}
public void setLimitSize(Integer limitSize) {
this.limitSize = limitSize;
}
public Integer getCurrentPage() {
return currentPage;
}
public void setCurrentPage(Integer currentPage) {
this.currentPage = currentPage;
}
public Integer getPageNumber() {//bootstrap-table分页使用
return this.getCurrentPage();
}
public void setPageNumber(Integer pageNumber) {//bootstrap-table分页使用
this.setCurrentPage(pageNumber);
}
public Integer getPageSize() {
return pageSize;
}
public void setPageSize(Integer pageSize) {
this.pageSize = pageSize;
}
public Integer getStart() {
if (currentPage ==null || pageSize ==null) {
return null;
}
if (currentPage < 0 || pageSize < 0) {
return 0;
} else {
return ((currentPage - 1) * pageSize);
}
}
public Integer getEnd() {
if (this.getStart() != null) {
return this.getStart() + this.getPageSize();
}
return null;
}
}
|
数据层实现方式: 纯Mapper接口【示例代码】 | ||||
CityMapper.java
package com.ssmcode.mapper;
import java.util.List;
import com.ssmcode.domain.CityDO;
import com.ssmcode.query.CityQuery;
import org.apache.ibatis.annotations.Param;
/**
* 城市 Mapper
* @author ssmcode.com 2024-07-04 11:47:45
*/
public interface CityMapper {
/**
* 插入 城市
* @param cityDO
* @return 影响行数,如需主键值,请使用cityDO参数get主键
*/
int insert(CityDO cityDO);
/**
* 动态插入 城市
* @param cityDO
* @return 影响行数,如需主键值,请使用cityDO参数get主键
*/
int insertSelective(CityDO cityDO);
/**
* 批量插入 城市
* @param cityList
* @return 插入条数
*/
int batchInsert(List<CityDO> cityList);
/**
* 根据ID更新 城市全部属性
* @param cityDO
* @return 更新行数
*/
int updateById(CityDO cityDO);
/**
* 动态更新 城市部分属性,包括全部
* @param cityDO
* @return 更新行数
*/
int updateDynamic(CityDO cityDO);
/**
* 根据ID逻辑删除 城市
* @param id
* @return 更新行数
*/
int logicDeleteById(@Param("id") Integer id,@Param("updateId") Integer updateId);
/**
* 根据IDS批量逻辑删除 城市
* @param ids
* @return 更新行数
*/
int logicDeleteByIds(@Param("ids") List<Integer> ids,@Param("updateId") Integer updateId);
/**
* 根据ID查询 一个 城市
* @param id
* @return CityDO
*/
CityDO selectById(Integer id);
/**
* 根据 城市主键列表 动态返回 城市 列表
* @param ids 主键列表,最多传递2000个,建议传递200个以内
* @return List<CityDO>
*/
List<CityDO> selectByIds(List<Integer> ids);
/**
* 根据 城市 动态返回 城市 对象
* @param cityQuery
* @return CityDO
*/
CityDO dynamicSelectOne(CityQuery cityQuery);
/**
* 根据 城市 动态返回 城市 列表
* @param cityQuery
* @return List<CityDO>
*/
List<CityDO> dynamicSelectList(CityQuery cityQuery);
/**
* 根据 城市 动态返回记录数
* @param cityQuery
* @return 记录条数
*/
Integer dynamicSelectCount(CityQuery cityQuery);
/**
* 根据 城市 动态返回 城市 Limit 列表
* @param cityQuery start,pageSize属性必须指定
* @return List<CityDO>
*/
List<CityDO> dynamicSelectPageQuery(CityQuery cityQuery);
/*#########################自定义方法请写在此行下面,方便接口重新生成作代码对比#####################################*/
}
|
city-mybatis-sqlmap.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.ssmcode.mapper.CityMapper">
<resultMap type="com.ssmcode.domain.CityDO" id="CityDOResultMap">
<id column="id" property="id" jdbcType="INTEGER"/>
<result column="name" property="name" jdbcType="VARCHAR" />
<result column="code" property="code" jdbcType="VARCHAR" />
<result column="parent_id" property="parentId" jdbcType="INTEGER" />
<result column="is_delete" property="isDelete" jdbcType="BIT" />
<result column="create_id" property="createId" jdbcType="INTEGER" />
<result column="update_id" property="updateId" jdbcType="INTEGER" />
<result column="publish_time" property="publishTime" jdbcType="TIMESTAMP" />
<result column="create_time" property="createTime" jdbcType="TIMESTAMP" />
<result column="update_time" property="updateTime" jdbcType="TIMESTAMP" />
</resultMap>
<sql id="allColumnFields">
id,name,code,parent_id,is_delete,create_id,update_id,publish_time,create_time,update_time
</sql>
<!-- 只有varchar char text类型 做 !='' 判断,其他类型时只做!=null 判断 0或fasle与空''是相同的【老版本】,在mybatis中的动态语句中-->
<!-- xml转义字符需要 <![CDATA[ ]]> 标签-->
<sql id="dynamicWhereFieldsUseQuery">
<where>
<trim prefixOverrides="AND |OR">
<if test="id != null "> AND id=#{id,jdbcType=INTEGER} </if>
<if test="name != null and name != '' "> AND name=#{name,jdbcType=VARCHAR} </if>
<if test="code != null and code != '' "> AND code=#{code,jdbcType=VARCHAR} </if>
<if test="parentId != null "> AND parent_id=#{parentId,jdbcType=INTEGER} </if>
<if test="isDelete != null "> AND is_delete=#{isDelete,jdbcType=BIT} </if>
<if test="createId != null "> AND create_id=#{createId,jdbcType=INTEGER} </if>
<if test="updateId != null "> AND update_id=#{updateId,jdbcType=INTEGER} </if>
<if test="startPublishTime != null"><![CDATA[ AND publish_time>=#{startPublishTime} ]]></if>
<if test="endPublishTime != null"><![CDATA[ AND publish_time<=#{endPublishTime} ]]></if>
<if test="startCreateTime != null"><![CDATA[ AND create_time>=#{startCreateTime} ]]></if>
<if test="endCreateTime != null"><![CDATA[ AND create_time<=#{endCreateTime} ]]></if>
<if test="startUpdateTime != null"><![CDATA[ AND update_time>=#{startUpdateTime} ]]></if>
<if test="endUpdateTime != null"><![CDATA[ AND update_time<=#{endUpdateTime} ]]></if>
<if test="ids != null and ids.size()>0"> AND id in
<foreach item="id" index="index" collection="ids"
open="(" separator="," close=")">
#{id}
</foreach>
</if>
<if test="searchStr != null and searchStr != '' "> AND name LIKE CONCAT(CONCAT('%', #{searchStr}),'%') </if>
AND is_delete=0
</trim>
</where>
</sql>
<insert id="insert" parameterType="com.ssmcode.domain.CityDO" useGeneratedKeys="true" statementType="PREPARED" keyProperty="id">
INSERT INTO t_city(
id,
name,
code,
parent_id,
is_delete,
create_id,
update_id,
publish_time,
create_time,
update_time
)values(
#{id,jdbcType=INTEGER},
#{name,jdbcType=VARCHAR},
#{code,jdbcType=VARCHAR},
#{parentId,jdbcType=INTEGER},
#{isDelete,jdbcType=BIT},
#{createId,jdbcType=INTEGER},
#{updateId,jdbcType=INTEGER},
#{publishTime,jdbcType=TIMESTAMP},
#{createTime,jdbcType=TIMESTAMP},
#{updateTime,jdbcType=TIMESTAMP}
)
</insert>
<insert id="insertSelective" parameterType="com.ssmcode.domain.CityDO" keyProperty="id" useGeneratedKeys="true" statementType="PREPARED">
insert into t_city
<trim prefix="(" suffix=")" suffixOverrides=",">
<if test="id != null">
id,
</if>
<if test="name != null">
name,
</if>
<if test="code != null">
code,
</if>
<if test="parentId != null">
parent_id,
</if>
<if test="isDelete != null">
is_delete,
</if>
<if test="createId != null">
create_id,
</if>
<if test="updateId != null">
update_id,
</if>
<if test="publishTime != null">
publish_time,
</if>
<if test="createTime != null">
create_time,
</if>
<if test="updateTime != null">
update_time,
</if>
</trim>
<trim prefix="values (" suffix=")" suffixOverrides=",">
<if test="id != null">
#{id,jdbcType=INTEGER},
</if>
<if test="name != null">
#{name,jdbcType=VARCHAR},
</if>
<if test="code != null">
#{code,jdbcType=VARCHAR},
</if>
<if test="parentId != null">
#{parentId,jdbcType=INTEGER},
</if>
<if test="isDelete != null">
#{isDelete,jdbcType=BIT},
</if>
<if test="createId != null">
#{createId,jdbcType=INTEGER},
</if>
<if test="updateId != null">
#{updateId,jdbcType=INTEGER},
</if>
<if test="publishTime != null">
#{publishTime,jdbcType=TIMESTAMP},
</if>
<if test="createTime != null">
#{createTime,jdbcType=TIMESTAMP},
</if>
<if test="updateTime != null">
#{updateTime,jdbcType=TIMESTAMP},
</if>
</trim>
</insert>
<insert id="batchInsert" parameterType="java.util.List" statementType="PREPARED" useGeneratedKeys="false">
INSERT INTO t_city(
name,
code,
parent_id,
is_delete,
create_id,
update_id,
publish_time,
create_time,
update_time
)values
<foreach collection="list" item="item" index="index" separator=",">
(
#{item.name,jdbcType=VARCHAR},
#{item.code,jdbcType=VARCHAR},
#{item.parentId,jdbcType=INTEGER},
#{item.isDelete,jdbcType=BIT},
#{item.createId,jdbcType=INTEGER},
#{item.updateId,jdbcType=INTEGER},
#{item.publishTime,jdbcType=TIMESTAMP},
#{item.createTime,jdbcType=TIMESTAMP},
#{item.updateTime,jdbcType=TIMESTAMP}
)
</foreach>
</insert>
<update id="updateById" parameterType="com.ssmcode.domain.CityDO" statementType="PREPARED">
UPDATE t_city
SET
name = #{name,jdbcType=VARCHAR},
code = #{code,jdbcType=VARCHAR},
parent_id = #{parentId,jdbcType=INTEGER},
is_delete = #{isDelete,jdbcType=BIT},
create_id = #{createId,jdbcType=INTEGER},
update_id = #{updateId,jdbcType=INTEGER},
publish_time = #{publishTime,jdbcType=TIMESTAMP},
update_time = #{updateTime,jdbcType=TIMESTAMP}
WHERE
id = #{id,jdbcType=INTEGER} AND is_delete=0
</update>
<update id="updateDynamic" parameterType="com.ssmcode.domain.CityDO">
UPDATE t_city
<set>
<if test="name != null and name != '' ">name=#{name,jdbcType=VARCHAR},</if>
<if test="code != null and code != '' ">code=#{code,jdbcType=VARCHAR},</if>
<if test="parentId != null ">parent_id=#{parentId,jdbcType=INTEGER},</if>
<if test="isDelete != null ">is_delete=#{isDelete,jdbcType=BIT},</if>
<if test="createId != null ">create_id=#{createId,jdbcType=INTEGER},</if>
<if test="updateId != null ">update_id=#{updateId,jdbcType=INTEGER},</if>
<if test="publishTime != null ">publish_time=#{publishTime,jdbcType=TIMESTAMP},</if>
<if test="updateTime != null ">update_time=#{updateTime,jdbcType=TIMESTAMP},</if>
</set>
WHERE id = #{id,jdbcType=INTEGER} AND is_delete=0
</update>
<update id="logicDeleteById" parameterType="java.util.Map">
update t_city set is_delete=1,update_id= #{updateId,jdbcType=INTEGER},update_time=now() WHERE id = #{id,jdbcType=INTEGER} AND is_delete=0
</update>
<update id="logicDeleteByIds" parameterType="java.util.Map">
update t_city set is_delete=1,update_id= #{updateId,jdbcType=INTEGER},update_time=now() WHERE id in
<foreach item="item" index="index" collection="ids" open="(" separator="," close=")">
#{item}
</foreach>
AND is_delete=0
</update>
<select id="selectById" parameterType="int" resultMap="CityDOResultMap">
SELECT
<include refid="allColumnFields" />
FROM
t_city
WHERE
id = #{id,jdbcType=INTEGER} AND is_delete=0
</select>
<select id="selectByIds" resultMap="CityDOResultMap" parameterType="java.util.List">
SELECT
<include refid="allColumnFields" />
FROM
t_city
WHERE id in
<foreach item="item" index="index" collection="list" open="(" separator="," close=")">
#{item}
</foreach>
AND is_delete=0
</select>
<select id="dynamicSelectOne" resultMap="CityDOResultMap" parameterType="com.ssmcode.query.CityQuery">
SELECT
<include refid="allColumnFields" />
FROM
t_city
<include refid="dynamicWhereFieldsUseQuery" />
limit #{limitSize}
</select>
<select id="dynamicSelectList" resultMap="CityDOResultMap" parameterType="com.ssmcode.query.CityQuery">
SELECT
<include refid="allColumnFields" />
FROM
t_city
<include refid="dynamicWhereFieldsUseQuery" />
ORDER BY update_time DESC
limit #{limitSize}
</select>
<select id="dynamicSelectCount" resultType="int" parameterType="com.ssmcode.query.CityQuery">
SELECT
count(id)
FROM
t_city
<include refid="dynamicWhereFieldsUseQuery" />
</select>
<select id="dynamicSelectPageQuery" resultMap="CityDOResultMap" parameterType="com.ssmcode.query.CityQuery">
SELECT
<include refid="allColumnFields" />
FROM
t_city
<include refid="dynamicWhereFieldsUseQuery" />
ORDER BY update_time DESC
<if test="start != null and pageSize!=null">
LIMIT #{start},#{pageSize}
</if>
</select>
<!--
如果生成完代码后,表有所改动,则可以按以下步骤可以减少手动修改效率问题
1.提交代码到代码仓库
2.在www.ssmcode.com上选择上次的生成记录,重新加载配置,再生成代码
3.把标签ID为updateDynamic【含】以上的代码覆盖
4.标签updateDynamic以下的代码如果字段名【逻辑删除、状态、表中父ID、创建时间、修改时间、创建人ID、修改人ID、表中外键】无变化不需要覆盖,有变化需要覆盖
5.修改实体com.ssmcode.domain.CityDO类
6.修改com.ssmcode.mapper.CityMapper类
7.对比git|svn记录,检查代码修改提交即可
-->
<!--#########################自定义方法、resultMap、sql片段 请写在此行下面,方便接口重新生成作代码对比##################################### -->
</mapper>
|
CityDO.java
package com.ssmcode.domain;
import java.util.Date;
import io.swagger.annotations.ApiModelProperty;
import io.swagger.annotations.ApiModel;
import lombok.Data;
import lombok.EqualsAndHashCode;
import com.ssmcode.domain.BaseDO;
/**
* 城市
* @author ssmcode.com 2024-07-04 11:47:45
*/
@Data
@EqualsAndHashCode(callSuper = true)
@ApiModel(value="城市",parent=BaseDO.class)
public class CityDO extends BaseDO {
@ApiModelProperty(value="主键",required=true)
/** 主键 */
private Integer id;
@ApiModelProperty(value="名称",required=true)
/** 名称 */
private String name;
@ApiModelProperty(value="编码",required=true)
/** 编码 */
private String code;
@ApiModelProperty(value="父ID",required=true)
/** 父ID */
private Integer parentId;
@ApiModelProperty(value="是否删除 0否1是",required=true)
/** 是否删除 0否1是 */
private Boolean isDelete;
@ApiModelProperty(value="创建人ID",required=true)
/** 创建人ID */
private Integer createId;
@ApiModelProperty(value="修改人ID",required=true)
/** 修改人ID */
private Integer updateId;
@ApiModelProperty(value="发布时间",required=false)
/** 发布时间 */
private Date publishTime;
@ApiModelProperty(value="创建时间",required=false)
/** 创建时间 */
private Date createTime;
@ApiModelProperty(value="修改时间",required=false)
/** 修改时间 */
private Date updateTime;
}
|
CityQuery.java
package com.ssmcode.query;
import com.ssmcode.domain.CityDO;
import java.util.Date;
import java.util.List;
import lombok.Data;
import lombok.EqualsAndHashCode;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
/**
* query对象直接从 domain层继承(DO|PO|Entity)继承
*
* 城市查询对象
* @author ssmcode.com 2024-07-04 11:47:45
*
*/
@Data
@EqualsAndHashCode(callSuper = true)
@ApiModel(value="城市查询对象",parent=CityDO.class)
public class CityQuery extends CityDO {
@ApiModelProperty(value="发布时间 start",required=false)
/** 发布时间 start */
private Date startPublishTime;
@ApiModelProperty(value="发布时间 end",required=false)
/** 发布时间 end */
private Date endPublishTime;
@ApiModelProperty(value="创建时间 start",required=false)
/** 创建时间 start */
private Date startCreateTime;
@ApiModelProperty(value="创建时间 end",required=false)
/** 创建时间 end */
private Date endCreateTime;
@ApiModelProperty(value="修改时间 start",required=false)
/** 修改时间 start */
private Date startUpdateTime;
@ApiModelProperty(value="修改时间 end",required=false)
/** 修改时间 end */
private Date endUpdateTime;
@ApiModelProperty(value="搜索关键字",required=false)
/** 搜索关键字 */
private String searchStr;
@ApiModelProperty(value="主键ID列表",required=false)
/** 主键ID列表 */
private List<Integer> ids;
}
|
CityDTO.java
package com.ssmcode.dto;
import com.ssmcode.domain.CityDO;
/**
* dto对象一般直接从 domain层继承(DO|PO|Entity) 也可以包含其他domain对象 继承的属性不满足业务需求时,可以根据业务手动添加其他属性
* DTO一般用于feign层调用的API
*
* 城市数据转换对象
* @author ssmcode.com 2024-07-04 11:47:45
*
*/
public class CityDTO extends CityDO {
// dto对象一般直接从 domain层继承(DO|PO|Entity)
// 也可以包含其他domain对象
// 继承的属性不足时,可以根据业务手动添加期他属性
// DTO一般用于feign层调用的API
}
|
BaseDO.java
package com.ssmcode.domain;
import io.swagger.annotations.ApiModelProperty;
import java.io.Serializable;
import com.alibaba.excel.annotation.ExcelIgnore;
public class BaseDO implements Serializable {
public static final int MAX_PAGE_SIZE = 2000;
public static final int DEFAULT_START_PAGE = 1;
public static final int PAGE_SIZE = 20;
/** SQL语句limit默认限制数 */
@ApiModelProperty(value="limit分页size,前端无须关心此字段",required=false,hidden=true)
@ExcelIgnore
private Integer limitSize = MAX_PAGE_SIZE;
/** 当前页码 */
@ApiModelProperty(value="当前页码,分页查询时使用",required=false,hidden=false)
@ExcelIgnore
private Integer currentPage;
/** 每页记录数 */
@ApiModelProperty(value="每页记录条数,分页查询时使用",required=false,hidden=false)
@ExcelIgnore
private Integer pageSize;
/** 开始记录数 */
@ApiModelProperty(value="开始记录数,分页查询时使用",required=false,hidden=true)
@ExcelIgnore
private Integer start;
public Integer getLimitSize() {
return limitSize;
}
public void setLimitSize(Integer limitSize) {
this.limitSize = limitSize;
}
public Integer getCurrentPage() {
return currentPage;
}
public void setCurrentPage(Integer currentPage) {
this.currentPage = currentPage;
}
public Integer getPageNumber() {//bootstrap-table分页使用
return this.getCurrentPage();
}
public void setPageNumber(Integer pageNumber) {//bootstrap-table分页使用
this.setCurrentPage(pageNumber);
}
public Integer getPageSize() {
return pageSize;
}
public void setPageSize(Integer pageSize) {
this.pageSize = pageSize;
}
public Integer getStart() {
if (currentPage ==null || pageSize ==null) {
return null;
}
if (currentPage < 0 || pageSize < 0) {
return 0;
} else {
return ((currentPage - 1) * pageSize);
}
}
public Integer getEnd() {
if (this.getStart() != null) {
return this.getStart() + this.getPageSize();
}
return null;
}
}
|
数据层实现方式: dao接口及其实现类【示例代码】 | ||||
CityDAO.java
package com.ssmcode.mapper;
import java.util.List;
import com.ssmcode.domain.CityDO;
import com.ssmcode.query.CityQuery;
import com.ssmcode.exception.DAOException;
/**
* 城市 DAO
* @author ssmcode.com 2024-07-04 11:47:55
*/
public interface CityDAO {
/**
* 插入 城市
* @param cityDO
* @return 主键
* @throws DAOException
*/
Integer insert(CityDO cityDO) throws DAOException;
/**
* 动态插入 城市
* @param cityDO
* @return 主键
* @throws DAOException
*/
Integer insertSelective(CityDO cityDO) throws DAOException;
/**
* 根据ID更新 城市全部属性
* @param cityDO
* @return 更新行数
* @throws DAOException
*/
int updateById(CityDO cityDO) throws DAOException;
/**
* 动态更新 城市部分属性,包括全部
* @param cityDO
* @return 更新行数
* @throws DAOException
*/
int updateDynamic(CityDO cityDO) throws DAOException;
/**
* 根据ID逻辑删除 城市
* @param id
* @return 更新行数
* @throws DAOException
*/
int logicDeleteById(Integer id,Integer updateId) throws DAOException;
/**
* 根据IDS批量逻辑删除 城市
* @param ids
* @return 更新行数
* @throws DAOException
*/
int logicDeleteByIds(List<Integer> ids,Integer updateId) throws DAOException;
/**
* 根据ID查询 一个 城市
* @param id
* @return CityDO
* @throws DAOException
*/
CityDO selectById(Integer id) throws DAOException;
/**
* 根据 城市主键列表 动态返回 城市 列表
* @param 主键列表,最多传递2000个,建议传递200个以内
* @return List<CityDO>
* @throws DAOException
*/
List<CityDO> selectByIds(List<Integer> ids) throws DAOException;
/**
* 批量插入 城市
* @param cityDO
* @return 插入条数
*/
int batchInsert(List<CityDO> cityDOList) throws DAOException;
/**
* 根据 城市 动态返回 城市 对象
* @param cityDO
* @return CityDO
* @throws DAOException
*/
CityDO dynamicSelectOne(CityQuery cityQuery) throws DAOException;
/**
* 根据 城市 动态返回 城市 列表
* @param cityQuery
* @return List<CityDO>
* @throws DAOException
*/
List<CityDO> dynamicSelectList(CityQuery cityQuery) throws DAOException;
/**
* 根据 城市 动态返回记录数
* @param cityQuery
* @return 记录条数
* @throws DAOException
*/
Integer dynamicSelectCount(CityQuery cityQuery) throws DAOException;
/**
* 根据 城市 动态返回 城市 Limit 列表
* @param cityQuery start,pageSize属性必须指定
* @return List<CityDO>
* @throws DAOException
*/
List<CityDO> dynamicSelectPageQuery(CityQuery cityQuery) throws DAOException;
}
|
MybatisCityDAO.java
package com.ssmcode.mapper.mybatis;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.HashMap;
import java.util.ArrayList;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.alibaba.fastjson.JSON;
import org.springframework.stereotype.Repository;
import com.ssmcode.mapper.CityDAO;
import com.ssmcode.domain.CityDO;
import com.ssmcode.query.CityQuery;
import com.ssmcode.constant.BaseConstant;
import com.ssmcode.exception.DAOException;
@Repository(value="cityDAO")
public class MybatisCityDAO extends MybatisBaseDAO implements CityDAO {
private static Logger logger = LoggerFactory.getLogger(MybatisCityDAO.class);
public Integer insert(CityDO cityDO) throws DAOException {
cityDO.setCreateTime(new Date());
cityDO.setUpdateTime(new Date());
int i=0;
try{
i = getSqlSession().insert("com.ssmcode.domain.CityMapper.insert", cityDO);
}catch (Exception e) {
logger.error("insert is error,cityDO=>{}",JSON.toJSONString(cityDO), e);
throw new DAOException(e.getMessage(), e);
}
return i>0? cityDO.getId():0;
}
public Integer insertSelective(CityDO cityDO) throws DAOException {
cityDO.setCreateTime(new Date());
cityDO.setUpdateTime(new Date());
int i=0;
try{
i = getSqlSession().insert("com.ssmcode.domain.CityMapper.insertSelective", cityDO);
}catch (Exception e) {
logger.error("insertSelective is error,cityDO=>{}",JSON.toJSONString(cityDO), e);
throw new DAOException(e.getMessage(), e);
}
return i>0? cityDO.getId():0;
}
public int updateById(CityDO cityDO) throws DAOException {
cityDO.setUpdateTime(new Date());
try{
return getSqlSession().update("com.ssmcode.domain.CityMapper.updateById", cityDO);
}catch (Exception e) {
logger.error("updateById is error,cityDO=>{}",JSON.toJSONString(cityDO), e);
throw new DAOException(e.getMessage(), e);
}
}
public int updateDynamic(CityDO cityDO) throws DAOException {
cityDO.setUpdateTime(new Date());
try{
return getSqlSession().update("com.ssmcode.domain.CityMapper.updateDynamic", cityDO);
}catch (Exception e) {
logger.error("updateDynamic is error,cityDO=>{}",JSON.toJSONString(cityDO), e);
throw new DAOException(e.getMessage(), e);
}
}
public int logicDeleteById(Integer id,Integer updateId) throws DAOException {
if (null == id) {
return 0;
}
if (null ==updateId){
return 0;
}
Map<String,Object> map=new HashMap<String,Object>();
map.put("id",id);
map.put("updateId",updateId);
try{
return getSqlSession().update("com.ssmcode.domain.CityMapper.logicDeleteById", map);
}catch (Exception e) {
logger.error("logicDeleteById is error,params map=>{}",JSON.toJSONString(map), e);
throw new DAOException(e.getMessage(), e);
}
}
public int logicDeleteByIds(List<Integer> ids,Integer updateId) throws DAOException {
if (null == ids || ids.size() == 0) {
return 0;
}
if (null ==updateId){
return 0;
}
if (ids.size() > BaseConstant.MAX_IDS_SIZE) {
throw new DAOException("参数列表不能超过"+BaseConstant.MAX_IDS_SIZE+"个", new IllegalArgumentException("logicDeleteByIds params is more than "+BaseConstant.MAX_IDS_SIZE+" num"));
}
Map<String,Object> map=new HashMap<String,Object>();
map.put("ids",ids);
map.put("updateId",updateId);
try{
return getSqlSession().update("com.ssmcode.domain.CityMapper.logicDeleteByIds", map);
}catch (Exception e) {
logger.error("logicDeleteByIds is error,map params=>{}",JSON.toJSONString(map), e);
throw new DAOException(e.getMessage(), e);
}
}
public CityDO selectById(Integer id) throws DAOException {
try{
return getSqlSession().selectOne("com.ssmcode.domain.CityMapper.selectById", id);
}catch (Exception e) {
logger.error("selectById is error,id=>{}",id, e);
throw new DAOException(e.getMessage(), e);
}
}
public List<CityDO> selectByIds(List<Integer> ids) throws DAOException {
if (null == ids || ids.size() == 0) {
return new ArrayList<CityDO>();
}
if (ids.size() > BaseConstant.MAX_IDS_SIZE) {
throw new DAOException("参数列表不能超过"+BaseConstant.MAX_IDS_SIZE+"个", new IllegalArgumentException("selectByIds params is more than "+BaseConstant.MAX_IDS_SIZE+" num"));
}
try{
return getSqlSession().selectList("com.ssmcode.domain.CityMapper.selectByIds", ids);
}catch (Exception e) {
logger.error("selectByIds is error,ids=>{}",JSON.toJSONString(ids), e);
throw new DAOException(e.getMessage(), e);
}
}
public int batchInsert(List<CityDO> cityList) throws DAOException {
if (null == cityList || cityList.size() == 0) {
return 0;
}
if (cityList.size() > BaseConstant.BATCH_INSERT_MAX_SIZE) {
throw new DAOException("参数列表不能超过"+BaseConstant.BATCH_INSERT_MAX_SIZE+"个", new IllegalArgumentException("batchInsert params is more than "+BaseConstant.BATCH_INSERT_MAX_SIZE+" num"));
}
try{
return getSqlSession().insert("com.ssmcode.domain.CityMapper.batchInsert", cityList);
}catch (Exception e) {
logger.error("batchInsert is error,cityList=>{}",JSON.toJSONString(cityList), e);
throw new DAOException(e.getMessage(), e);
}
}
public List<CityDO> dynamicSelectList(CityQuery cityQuery) throws DAOException {
try{
return getSqlSession().selectList("com.ssmcode.domain.CityMapper.dynamicSelectList",cityQuery);
}catch (Exception e) {
logger.error("dynamicSelectList is error,cityQuery=>{}",JSON.toJSONString(cityQuery), e);
throw new DAOException(e.getMessage(), e);
}
}
public CityDO dynamicSelectOne(CityQuery cityQuery) throws DAOException {
try{
return getSqlSession().selectOne("com.ssmcode.domain.CityMapper.dynamicSelectOne", cityQuery);
}catch (Exception e) {
logger.error("dynamicSelectOne is error,cityQuery=>{}",JSON.toJSONString(cityQuery), e);
throw new DAOException(e.getMessage(), e);
}
}
public Integer dynamicSelectCount(CityQuery cityQuery) throws DAOException {
try{
return getSqlSession().selectOne("com.ssmcode.domain.CityMapper.dynamicSelectCount", cityQuery);
}catch (Exception e) {
logger.error("dynamicSelectCount is error,cityQuery=>{}",JSON.toJSONString(cityQuery), e);
throw new DAOException(e.getMessage(), e);
}
}
public List<CityDO> dynamicSelectPageQuery(CityQuery cityQuery) throws DAOException {
try{
return getSqlSession().selectList("com.ssmcode.domain.CityMapper.dynamicSelectPageQuery", cityQuery);
}catch (Exception e) {
logger.error("dynamicSelectPageQuery is error,cityQuery=>{}",JSON.toJSONString(cityQuery), e);
throw new DAOException(e.getMessage(), e);
}
}
}
|
city-mybatis-sqlmap.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.ssmcode.domain.CityMapper">
<resultMap type="com.ssmcode.domain.CityDO" id="CityDOResultMap">
<id column="id" property="id" jdbcType="INTEGER"/>
<result column="name" property="name" jdbcType="VARCHAR" />
<result column="code" property="code" jdbcType="VARCHAR" />
<result column="parent_id" property="parentId" jdbcType="INTEGER" />
<result column="is_delete" property="isDelete" jdbcType="BIT" />
<result column="create_id" property="createId" jdbcType="INTEGER" />
<result column="update_id" property="updateId" jdbcType="INTEGER" />
<result column="publish_time" property="publishTime" jdbcType="TIMESTAMP" />
<result column="create_time" property="createTime" jdbcType="TIMESTAMP" />
<result column="update_time" property="updateTime" jdbcType="TIMESTAMP" />
</resultMap>
<sql id="allColumnFields">
id,name,code,parent_id,is_delete,create_id,update_id,publish_time,create_time,update_time
</sql>
<!-- 只有varchar char text类型 做 !='' 判断,其他类型时只做!=null 判断 0或fasle与空''是相同的【老版本】,在mybatis中的动态语句中-->
<!-- xml转义字符需要 <![CDATA[ ]]> 标签-->
<sql id="dynamicWhereFieldsUseQuery">
<where>
<trim prefixOverrides="AND |OR">
<if test="id != null "> AND id=#{id,jdbcType=INTEGER} </if>
<if test="name != null and name != '' "> AND name=#{name,jdbcType=VARCHAR} </if>
<if test="code != null and code != '' "> AND code=#{code,jdbcType=VARCHAR} </if>
<if test="parentId != null "> AND parent_id=#{parentId,jdbcType=INTEGER} </if>
<if test="isDelete != null "> AND is_delete=#{isDelete,jdbcType=BIT} </if>
<if test="createId != null "> AND create_id=#{createId,jdbcType=INTEGER} </if>
<if test="updateId != null "> AND update_id=#{updateId,jdbcType=INTEGER} </if>
<if test="startPublishTime != null"><![CDATA[ AND publish_time>=#{startPublishTime} ]]></if>
<if test="endPublishTime != null"><![CDATA[ AND publish_time<=#{endPublishTime} ]]></if>
<if test="startCreateTime != null"><![CDATA[ AND create_time>=#{startCreateTime} ]]></if>
<if test="endCreateTime != null"><![CDATA[ AND create_time<=#{endCreateTime} ]]></if>
<if test="startUpdateTime != null"><![CDATA[ AND update_time>=#{startUpdateTime} ]]></if>
<if test="endUpdateTime != null"><![CDATA[ AND update_time<=#{endUpdateTime} ]]></if>
<if test="ids != null and ids.size()>0"> AND id in
<foreach item="id" index="index" collection="ids"
open="(" separator="," close=")">
#{id}
</foreach>
</if>
<if test="searchStr != null and searchStr != '' "> AND name LIKE CONCAT(CONCAT('%', #{searchStr}),'%') </if>
AND is_delete=0
</trim>
</where>
</sql>
<insert id="insert" parameterType="com.ssmcode.domain.CityDO" useGeneratedKeys="true" statementType="PREPARED" keyProperty="id">
INSERT INTO t_city(
id,
name,
code,
parent_id,
is_delete,
create_id,
update_id,
publish_time,
create_time,
update_time
)values(
#{id,jdbcType=INTEGER},
#{name,jdbcType=VARCHAR},
#{code,jdbcType=VARCHAR},
#{parentId,jdbcType=INTEGER},
#{isDelete,jdbcType=BIT},
#{createId,jdbcType=INTEGER},
#{updateId,jdbcType=INTEGER},
#{publishTime,jdbcType=TIMESTAMP},
#{createTime,jdbcType=TIMESTAMP},
#{updateTime,jdbcType=TIMESTAMP}
)
</insert>
<insert id="insertSelective" parameterType="com.ssmcode.domain.CityDO" keyProperty="id" useGeneratedKeys="true" statementType="PREPARED">
insert into t_city
<trim prefix="(" suffix=")" suffixOverrides=",">
<if test="id != null">
id,
</if>
<if test="name != null">
name,
</if>
<if test="code != null">
code,
</if>
<if test="parentId != null">
parent_id,
</if>
<if test="isDelete != null">
is_delete,
</if>
<if test="createId != null">
create_id,
</if>
<if test="updateId != null">
update_id,
</if>
<if test="publishTime != null">
publish_time,
</if>
<if test="createTime != null">
create_time,
</if>
<if test="updateTime != null">
update_time,
</if>
</trim>
<trim prefix="values (" suffix=")" suffixOverrides=",">
<if test="id != null">
#{id,jdbcType=INTEGER},
</if>
<if test="name != null">
#{name,jdbcType=VARCHAR},
</if>
<if test="code != null">
#{code,jdbcType=VARCHAR},
</if>
<if test="parentId != null">
#{parentId,jdbcType=INTEGER},
</if>
<if test="isDelete != null">
#{isDelete,jdbcType=BIT},
</if>
<if test="createId != null">
#{createId,jdbcType=INTEGER},
</if>
<if test="updateId != null">
#{updateId,jdbcType=INTEGER},
</if>
<if test="publishTime != null">
#{publishTime,jdbcType=TIMESTAMP},
</if>
<if test="createTime != null">
#{createTime,jdbcType=TIMESTAMP},
</if>
<if test="updateTime != null">
#{updateTime,jdbcType=TIMESTAMP},
</if>
</trim>
</insert>
<insert id="batchInsert" parameterType="java.util.List" statementType="PREPARED" useGeneratedKeys="false">
INSERT INTO t_city(
name,
code,
parent_id,
is_delete,
create_id,
update_id,
publish_time,
create_time,
update_time
)values
<foreach collection="list" item="item" index="index" separator=",">
(
#{item.name,jdbcType=VARCHAR},
#{item.code,jdbcType=VARCHAR},
#{item.parentId,jdbcType=INTEGER},
#{item.isDelete,jdbcType=BIT},
#{item.createId,jdbcType=INTEGER},
#{item.updateId,jdbcType=INTEGER},
#{item.publishTime,jdbcType=TIMESTAMP},
#{item.createTime,jdbcType=TIMESTAMP},
#{item.updateTime,jdbcType=TIMESTAMP}
)
</foreach>
</insert>
<update id="updateById" parameterType="com.ssmcode.domain.CityDO" statementType="PREPARED">
UPDATE t_city
SET
name = #{name,jdbcType=VARCHAR},
code = #{code,jdbcType=VARCHAR},
parent_id = #{parentId,jdbcType=INTEGER},
is_delete = #{isDelete,jdbcType=BIT},
create_id = #{createId,jdbcType=INTEGER},
update_id = #{updateId,jdbcType=INTEGER},
publish_time = #{publishTime,jdbcType=TIMESTAMP},
update_time = #{updateTime,jdbcType=TIMESTAMP}
WHERE
id = #{id,jdbcType=INTEGER} AND is_delete=0
</update>
<update id="updateDynamic" parameterType="com.ssmcode.domain.CityDO">
UPDATE t_city
<set>
<if test="name != null and name != '' ">name=#{name,jdbcType=VARCHAR},</if>
<if test="code != null and code != '' ">code=#{code,jdbcType=VARCHAR},</if>
<if test="parentId != null ">parent_id=#{parentId,jdbcType=INTEGER},</if>
<if test="isDelete != null ">is_delete=#{isDelete,jdbcType=BIT},</if>
<if test="createId != null ">create_id=#{createId,jdbcType=INTEGER},</if>
<if test="updateId != null ">update_id=#{updateId,jdbcType=INTEGER},</if>
<if test="publishTime != null ">publish_time=#{publishTime,jdbcType=TIMESTAMP},</if>
<if test="updateTime != null ">update_time=#{updateTime,jdbcType=TIMESTAMP},</if>
</set>
WHERE id = #{id,jdbcType=INTEGER} AND is_delete=0
</update>
<update id="logicDeleteById" parameterType="java.util.Map">
update t_city set is_delete=1,update_id= #{updateId,jdbcType=INTEGER},update_time=now() WHERE id = #{id,jdbcType=INTEGER} AND is_delete=0
</update>
<update id="logicDeleteByIds" parameterType="java.util.Map">
update t_city set is_delete=1,update_id= #{updateId,jdbcType=INTEGER},update_time=now() WHERE id in
<foreach item="item" index="index" collection="ids" open="(" separator="," close=")">
#{item}
</foreach>
AND is_delete=0
</update>
<select id="selectById" parameterType="int" resultMap="CityDOResultMap">
SELECT
<include refid="allColumnFields" />
FROM
t_city
WHERE
id = #{id,jdbcType=INTEGER} AND is_delete=0
</select>
<select id="selectByIds" resultMap="CityDOResultMap" parameterType="java.util.List">
SELECT
<include refid="allColumnFields" />
FROM
t_city
WHERE id in
<foreach item="item" index="index" collection="list" open="(" separator="," close=")">
#{item}
</foreach>
AND is_delete=0
</select>
<select id="dynamicSelectOne" resultMap="CityDOResultMap" parameterType="com.ssmcode.query.CityQuery">
SELECT
<include refid="allColumnFields" />
FROM
t_city
<include refid="dynamicWhereFieldsUseQuery" />
limit #{limitSize}
</select>
<select id="dynamicSelectList" resultMap="CityDOResultMap" parameterType="com.ssmcode.query.CityQuery">
SELECT
<include refid="allColumnFields" />
FROM
t_city
<include refid="dynamicWhereFieldsUseQuery" />
ORDER BY update_time DESC
limit #{limitSize}
</select>
<select id="dynamicSelectCount" resultType="int" parameterType="com.ssmcode.query.CityQuery">
SELECT
count(id)
FROM
t_city
<include refid="dynamicWhereFieldsUseQuery" />
</select>
<select id="dynamicSelectPageQuery" resultMap="CityDOResultMap" parameterType="com.ssmcode.query.CityQuery">
SELECT
<include refid="allColumnFields" />
FROM
t_city
<include refid="dynamicWhereFieldsUseQuery" />
ORDER BY update_time DESC
<if test="start != null and pageSize!=null">
LIMIT #{start},#{pageSize}
</if>
</select>
<!--
如果生成完代码后,表有所改动,则可以按以下步骤可以减少手动修改效率问题
1.提交代码到代码仓库
2.在www.ssmcode.com上选择上次的生成记录,重新加载配置,再生成代码
3.把标签ID为updateDynamic【含】以上的代码覆盖
4.标签updateDynamic以下的代码如果字段名【逻辑删除、状态、表中父ID、创建时间、修改时间、创建人ID、修改人ID、表中外键】无变化不需要覆盖,有变化需要覆盖
5.修改实体com.ssmcode.domain.CityDO类
6.修改com.ssmcode.domain.CityMapper类
7.对比git|svn记录,检查代码修改提交即可
-->
<!--#########################自定义方法、resultMap、sql片段 请写在此行下面,方便接口重新生成作代码对比##################################### -->
</mapper>
|
CityDO.java
package com.ssmcode.domain;
import java.util.Date;
import io.swagger.annotations.ApiModelProperty;
import io.swagger.annotations.ApiModel;
import lombok.Data;
import lombok.EqualsAndHashCode;
import com.ssmcode.domain.BaseDO;
/**
* 城市
* @author ssmcode.com 2024-07-04 11:47:55
*/
@Data
@EqualsAndHashCode(callSuper = true)
@ApiModel(value="城市",parent=BaseDO.class)
public class CityDO extends BaseDO {
@ApiModelProperty(value="主键",required=true)
/** 主键 */
private Integer id;
@ApiModelProperty(value="名称",required=true)
/** 名称 */
private String name;
@ApiModelProperty(value="编码",required=true)
/** 编码 */
private String code;
@ApiModelProperty(value="父ID",required=true)
/** 父ID */
private Integer parentId;
@ApiModelProperty(value="是否删除 0否1是",required=true)
/** 是否删除 0否1是 */
private Boolean isDelete;
@ApiModelProperty(value="创建人ID",required=true)
/** 创建人ID */
private Integer createId;
@ApiModelProperty(value="修改人ID",required=true)
/** 修改人ID */
private Integer updateId;
@ApiModelProperty(value="发布时间",required=false)
/** 发布时间 */
private Date publishTime;
@ApiModelProperty(value="创建时间",required=false)
/** 创建时间 */
private Date createTime;
@ApiModelProperty(value="修改时间",required=false)
/** 修改时间 */
private Date updateTime;
}
|
CityQuery.java
package com.ssmcode.query;
import com.ssmcode.domain.CityDO;
import java.util.Date;
import java.util.List;
import lombok.Data;
import lombok.EqualsAndHashCode;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
/**
* query对象直接从 domain层继承(DO|PO|Entity)继承
*
* 城市查询对象
* @author ssmcode.com 2024-07-04 11:47:55
*
*/
@Data
@EqualsAndHashCode(callSuper = true)
@ApiModel(value="城市查询对象",parent=CityDO.class)
public class CityQuery extends CityDO {
@ApiModelProperty(value="发布时间 start",required=false)
/** 发布时间 start */
private Date startPublishTime;
@ApiModelProperty(value="发布时间 end",required=false)
/** 发布时间 end */
private Date endPublishTime;
@ApiModelProperty(value="创建时间 start",required=false)
/** 创建时间 start */
private Date startCreateTime;
@ApiModelProperty(value="创建时间 end",required=false)
/** 创建时间 end */
private Date endCreateTime;
@ApiModelProperty(value="修改时间 start",required=false)
/** 修改时间 start */
private Date startUpdateTime;
@ApiModelProperty(value="修改时间 end",required=false)
/** 修改时间 end */
private Date endUpdateTime;
@ApiModelProperty(value="搜索关键字",required=false)
/** 搜索关键字 */
private String searchStr;
@ApiModelProperty(value="主键ID列表",required=false)
/** 主键ID列表 */
private List<Integer> ids;
}
|
CityDTO.java
package com.ssmcode.dto;
import com.ssmcode.domain.CityDO;
/**
* dto对象一般直接从 domain层继承(DO|PO|Entity) 也可以包含其他domain对象 继承的属性不满足业务需求时,可以根据业务手动添加其他属性
* DTO一般用于feign层调用的API
*
* 城市数据转换对象
* @author ssmcode.com 2024-07-04 11:47:55
*
*/
public class CityDTO extends CityDO {
// dto对象一般直接从 domain层继承(DO|PO|Entity)
// 也可以包含其他domain对象
// 继承的属性不足时,可以根据业务手动添加期他属性
// DTO一般用于feign层调用的API
}
|
BaseDO.java
package com.ssmcode.domain;
import io.swagger.annotations.ApiModelProperty;
import java.io.Serializable;
import com.alibaba.excel.annotation.ExcelIgnore;
public class BaseDO implements Serializable {
public static final int MAX_PAGE_SIZE = 2000;
public static final int DEFAULT_START_PAGE = 1;
public static final int PAGE_SIZE = 20;
/** SQL语句limit默认限制数 */
@ApiModelProperty(value="limit分页size,前端无须关心此字段",required=false,hidden=true)
@ExcelIgnore
private Integer limitSize = MAX_PAGE_SIZE;
/** 当前页码 */
@ApiModelProperty(value="当前页码,分页查询时使用",required=false,hidden=false)
@ExcelIgnore
private Integer currentPage;
/** 每页记录数 */
@ApiModelProperty(value="每页记录条数,分页查询时使用",required=false,hidden=false)
@ExcelIgnore
private Integer pageSize;
/** 开始记录数 */
@ApiModelProperty(value="开始记录数,分页查询时使用",required=false,hidden=true)
@ExcelIgnore
private Integer start;
public Integer getLimitSize() {
return limitSize;
}
public void setLimitSize(Integer limitSize) {
this.limitSize = limitSize;
}
public Integer getCurrentPage() {
return currentPage;
}
public void setCurrentPage(Integer currentPage) {
this.currentPage = currentPage;
}
public Integer getPageNumber() {//bootstrap-table分页使用
return this.getCurrentPage();
}
public void setPageNumber(Integer pageNumber) {//bootstrap-table分页使用
this.setCurrentPage(pageNumber);
}
public Integer getPageSize() {
return pageSize;
}
public void setPageSize(Integer pageSize) {
this.pageSize = pageSize;
}
public Integer getStart() {
if (currentPage ==null || pageSize ==null) {
return null;
}
if (currentPage < 0 || pageSize < 0) {
return 0;
} else {
return ((currentPage - 1) * pageSize);
}
}
public Integer getEnd() {
if (this.getStart() != null) {
return this.getStart() + this.getPageSize();
}
return null;
}
}
|
BaseDAO.java
package com.ssmcode.mapper;
public interface BaseDAO {
}
|
MybatisBaseDAO.java
package com.ssmcode.mapper.mybatis;
import org.mybatis.spring.SqlSessionTemplate;
import org.mybatis.spring.support.SqlSessionDaoSupport;
import org.springframework.beans.factory.annotation.Autowired;
import com.ssmcode.mapper.BaseDAO;
public class MybatisBaseDAO extends SqlSessionDaoSupport implements BaseDAO{
@Override
@Autowired
public void setSqlSessionTemplate(SqlSessionTemplate sqlSessionTemplate) {
super.setSqlSessionTemplate(sqlSessionTemplate);
}
}
|
|
联系人:龙先生 邮箱:longhaisheng20@163.com 手机:15900686292 |
Copyright ? 2012-2021 All rights reserved ![]() |