首页 > 代码库 > mybatis 几个小技巧
mybatis 几个小技巧
1.多个参数传入 dao接口
public interface TrainingUserExtendMapper extends BaseExtMapper { public int updateTrainingUserByMobileNum(@Param("offTrainId")Long offTrainId, @Param("mobileNum")Long mobileNum, @Param("signTime")Date signTime); public Integer selectByMobileNum(@Param("offTrainId")Long offTrainId, @Param("mobileNum")Long mobileNum); }
mapper文件
<update id="updateTrainingUserByMobileNum" > update TRAINING_USER set IS_SIGN = 1,SIGN_TIME = #{signTime,jdbcType=TIMESTAMP} where OFF_TRAIN_ID = #{offTrainId,jdbcType=BIGINT} AND MOBILE_NUM = #{mobileNum,jdbcType=BIGINT} </update> <select id="selectByMobileNum" resultType="Integer" > SELECT count(1) FROM TRAINING_USER WHERE OFF_TRAIN_ID = #{offTrainId,jdbcType=BIGINT} AND MOBILE_NUM = #{mobileNum,jdbcType=BIGINT} </select>
2 数据库里的字段是 datetime类型
当传入string 类型的时间时,mapp文件可用str_to_date()方法
params.put("updateDateStart", updateDateStart + " 00:00:00"); //dao 接口 public interface OfflineTrainingExtendMapper { public List<OfflineTraining> getListTraining(Map<String,Object> params); }
mapp文件
<select id="getListTraining" resultMap="BaseResultMap"> SELECT * FROM OFFLINE_TRAINING WHERE 1=1 <include refid="selectTrainingCondition"/> <if test="page != null and rows != null"> LIMIT #{startIndex},#{rows} </if> </select> <sql id="selectTrainingCondition"> <if test="trainingName != null"> AND NAME LIKE CONCAT(‘%‘, #{trainingName},‘%‘) </if> <if test="updateDateStart != null"> AND UPDATE_TIME >= str_to_date(#{updateDateStart}, ‘%Y-%m-%d %H:%i:%s‘) </if> <if test="updateDateEnd != null"> AND UPDATE_TIME <= str_to_date(#{updateDateEnd}, ‘%Y-%m-%d %H:%i:%s‘) </if> <if test="statuses != null"> AND STATUS IN (#{statuses}) </if> </sql>
3 当定义的实体类 需要额外字段时,可以通过继承的方式 可以在mapper里给字段赋值,特殊字段在实体类get方法里赋值
实体类
package cn.com.demos.entity; import cn.com.demos.entity.base.EntityBase; import java.io.Serializable; import java.util.Date; public class TrainingUser extends EntityBase implements Serializable { private Integer type; private Long userId; private String userName; private Long mobileNum; private Integer isSign; private Date signTime; private Float score; private Long offTrainId; private Integer credit; private Date createTime; private static final long serialVersionUID = 1L; public Integer getType() { return type; } public void setType(Integer type) { this.type = type; } public Long getUserId() { return userId; } public void setUserId(Long userId) { this.userId = userId; } public String getUserName() { return userName; } public void setUserName(String userName) { this.userName = userName == null ? null : userName.trim(); } public Long getMobileNum() { return mobileNum; } public void setMobileNum(Long mobileNum) { this.mobileNum = mobileNum; } public Integer getIsSign() { return isSign; } public void setIsSign(Integer isSign) { this.isSign = isSign; } public Date getSignTime() { return signTime; } public void setSignTime(Date signTime) { this.signTime = signTime; } public Float getScore() { return score; } public void setScore(Float score) { this.score = score; } public Long getOffTrainId() { return offTrainId; } public void setOffTrainId(Long offTrainId) { this.offTrainId = offTrainId; } public Integer getCredit() { return credit; } public void setCredit(Integer credit) { this.credit = credit; } public Date getCreateTime() { return createTime; } public void setCreateTime(Date createTime) { this.createTime = createTime; } }
实体类子类
public class TrainingUserExtend extends TrainingUser implements Serializable{ /** * */ private static final long serialVersionUID = 1L; private String offlineTrainingName; private String isSignText; public String getOfflineTrainingName() { return offlineTrainingName; } public void setOfflineTrainingName(String offlineTrainingName) { this.offlineTrainingName = offlineTrainingName; } public String getIsSignText() { return super.getIsSign()==Constant.ONE?Constant.ISSIGN_TRUE:Constant.ISSIGN_NO; } public void setIsSignText(String isSignText) { this.isSignText = isSignText; } }
mapper文件
<?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="cn.com.demos.mapper.extend.TrainingUserExtendMapper"> <resultMap id="BaseResultMap" type="cn.com.demos.entity.TrainingUser"> <id column="ID" jdbcType="BIGINT" property="id" /> <result column="TYPE" jdbcType="INTEGER" property="type" /> <result column="USER_ID" jdbcType="BIGINT" property="userId" /> <result column="USER_NAME" jdbcType="VARCHAR" property="userName" /> <result column="MOBILE_NUM" jdbcType="BIGINT" property="mobileNum" /> <result column="IS_SIGN" jdbcType="INTEGER" property="isSign" /> <result column="SIGN_TIME" jdbcType="TIMESTAMP" property="signTime" /> <result column="SCORE" jdbcType="REAL" property="score" /> <result column="OFF_TRAIN_ID" jdbcType="BIGINT" property="offTrainId" /> <result column="CREDIT" jdbcType="INTEGER" property="credit" /> <result column="CREATE_TIME" jdbcType="TIMESTAMP" property="createTime" /> </resultMap> <resultMap id="TrainingUserExtendResult" type="cn.com.demos.entity.extend.TrainingUserExtend" extends="BaseResultMap"> <result column="NAME" property="offlineTrainingName" jdbcType="VARCHAR" /> </resultMap> <sql id="Base_Column_List"> ID, TYPE, USER_ID, USER_NAME, MOBILE_NUM, IS_SIGN, SIGN_TIME, SCORE, OFF_TRAIN_ID, CREDIT, CREATE_TIME </sql> <select id="selectByParameter" resultMap="TrainingUserExtendResult" parameterType="map" > SELECT o.NAME, t.ID,t.USER_ID,t.USER_NAME,t.MOBILE_NUM,t.SCORE,t.CREDIT,t.CREATE_TIME FROM TRAINING_USER t, OFFLINE_TRAINING o WHERE t.OFF_TRAIN_ID = o.ID <if test="offlineTrainingId != null" > AND o.ID = #{offlineTrainingId} </if> <if test="type != null" > AND t.TYPE = #{type} </if> <if test="userName != null" > AND t.USER_NAME LIKE CONCAT(‘%‘,#{userName},‘%‘) </if> ORDER BY CREATE_TIME DESC <if test="starNum != null and pageSize != null" > LIMIT #{starNum},#{pageSize} </if> </select> <select id="selectTotalByParameter" resultType="int" parameterType="map" > SELECT COUNT(t.ID) FROM TRAINING_USER t, OFFLINE_TRAINING o WHERE t.OFF_TRAIN_ID = o.ID <if test="offlineTrainingId != null" > AND t.OFF_TRAIN_ID = #{offlineTrainingId} </if> <if test="type != null" > AND t.TYPE = #{type} </if> <if test="isSign != null " > AND t.IS_SIGN = #{isSign} </if> <if test="userName != null" > AND t.USER_NAME LIKE CONCAT(‘%‘,#{userName},‘%‘) </if> </select> <select id="selectTrainingUserListByParameter" resultMap="TrainingUserExtendResult" parameterType="map" > SELECT o.NAME,t.ID,t.USER_ID,t.USER_NAME,t.MOBILE_NUM,t.IS_SIGN,t.SIGN_TIME FROM TRAINING_USER t, OFFLINE_TRAINING o WHERE t.OFF_TRAIN_ID = o.ID <if test="offlineTrainingId != null " > AND t.OFF_TRAIN_ID = #{offlineTrainingId} </if> <if test="type != null " > AND t.TYPE = #{type} </if> <if test="isSign != null " > AND t.IS_SIGN = #{isSign} </if> <if test="userName != null " > AND t.USER_NAME LIKE CONCAT(‘%‘,#{userName},‘%‘) </if> ORDER BY t.SIGN_TIME DESC <if test="starNum != null and pageSize != null" > LIMIT #{starNum},#{pageSize} </if> </select> <update id="updateTrainingUserByMobileNum" > update TRAINING_USER set IS_SIGN = 1,SIGN_TIME = #{signTime,jdbcType=TIMESTAMP} where OFF_TRAIN_ID = #{offTrainId,jdbcType=BIGINT} AND MOBILE_NUM = #{mobileNum,jdbcType=BIGINT} </update> <select id="selectByMobileNum" resultType="Integer" > SELECT count(1) FROM TRAINING_USER WHERE OFF_TRAIN_ID = #{offTrainId,jdbcType=BIGINT} AND MOBILE_NUM = #{mobileNum,jdbcType=BIGINT} </select> </mapper>
4
函数:FROM_UNIXTIME
作用:将MYSQL中以INT(11)存储的时间以"YYYY-MM-DD"格式来显示。
语法:FROM_UNIXTIME(unix_timestamp,format)
返回表示 Unix 时间标记的一个字符串,根据format字符串格式化。format可以包含与DATE_FORMAT()函数列出的条目同样的修饰符。
根据format字符串格式化date值。
下列修饰符可以被用在format字符串中:
%M 月名字(January……December)
%W 星期名字(Sunday……Saturday)
%D 有英语前缀的月份的日期(1st, 2nd, 3rd, 等等。)
%Y 年, 数字, 4 位
%y 年, 数字, 2 位
%a 缩写的星期名字(Sun……Sat)
%d 月份中的天数, 数字(00……31)
%e 月份中的天数, 数字(0……31)
%m 月, 数字(01……12)
%c 月, 数字(1……12)
%b 缩写的月份名字(Jan……Dec)
%j 一年中的天数(001……366)
%H 小时(00……23)
%k 小时(0……23)
%h 小时(01……12)
%I 小时(01……12)
%l 小时(1……12)
%i 分钟, 数字(00……59)
%r 时间,12 小时(hh:mm:ss [AP]M)
%T 时间,24 小时(hh:mm:ss)
%S 秒(00……59)
%s 秒(00……59)
%p AM或PM
%w 一个星期中的天数(0=Sunday ……6=Saturday )
%U 星期(0……52), 这里星期天是星期的第一天
%u 星期(0……52), 这里星期一是星期的第一天
%% 一个文字“%”。
例子:
SELECT FROM_UNIXTIME(1234567890, ‘%Y-%m-%d %H:%i:%S‘)
1. UNIX时间戳转换为日期用函数: FROM_UNIXTIME()
一般形式:select FROM_UNIXTIME(1156219870);
2. 日期转换为UNIX时间戳用函数: UNIX_TIMESTAMP()
一般形式:Select UNIX_TIMESTAMP(‘2006-11-04 12:23:00′);
if("year".equals(searchType) || "halfyear".equals(searchType)){ map.put("searchType", "%Y-%m"); } if("month".equals(searchType)){ map.put("searchType", "%Y-%m-%d"); } if("day".equals(searchType)){ map.put("searchType", "%Y-%m-%d %H"); } map.put("startTime", startTime); //2017-3-4 map.put("endTime", endTime); map.put("orgIdList", orgIdList); map.put("rootOrgId", rootOrgId);
mapper
<select id="selectLoginCount" resultMap="CountResultMap" parameterType="map" > select COUNT(1) as COUNT,from_UNIXTIME(LOGIN_TIME/1000,#{searchType}) as TIME FROM USER_LOGIN_EXIT where 1=1 <if test="orgIdList != null and orgIdList != ‘‘ and orgIdList.size()>0"> and ORG_ID in <foreach item="orgId" index="index" collection="orgIdList" open="(" separator="," close=")"> #{orgId} </foreach> </if> <if test="rootOrgId != null" > and ROOT_ORG_ID = #{rootOrgId} </if> <if test="startTime != null" >//数据库里 LOGIN_TIME 是int(11), 除以1000 只得到日期,不得到时分秒 searchType就是传进来的%Y-%m-%d and from_UNIXTIME(LOGIN_TIME/1000,#{searchType}) >= #{startTime} //startTime 就是日期 比如 2017-5-6 </if> <if test="endTime != null" > and from_UNIXTIME(LOGIN_TIME/1000,#{searchType}) <= #{endTime} </if> group by time; </select>
4 一个sql语句,可以根据表里某个字段查询 某个记录的排名是多少
<select id="selectOrderNoByUserId" resultType="Integer"> SELECT temp.pm FROM ( SELECT @rowNum :=@rowNum + 1 pm, u.* FROM (SELECT @rowNum := 0) a, `PERSONAL_POINTS` u WHERE ROOT_ORG_ID = #{rootOrgId,jdbcType=BIGINT} ORDER BY POINTS DESC,USER_ID ASC ) temp WHERE temp.USER_ID = #{userId,jdbcType=BIGINT} </select>
mybatis 几个小技巧