新增主键ID返回(建议参考:https://www.cnblogs.com/nuccch/p/9067305.html)
<insert id="register" parameterType="com.hans.entity.User" useGeneratedKeys="true" keyProperty="id" keyColumn="id" >
INSERT INTO USER ( usercode,PASSWORD,phone,NAME)
VALUES(#{phone},#{password},#{phone},#{name})
</insert>
集合判断;
<if test="list!= null and list.size > 0"> <foreach collection="list" item="item" separator="," open="AND v.id in (" close=")"> #{item} </foreach> </if>
特殊意义字符的转义
<![CDATA[ AND DATE_FORMAT(t.create_time,'%Y-%m-%d') = DATE_FORMAT(#{createTime},'%Y-%m-%d')]]>
公共部分SQL共享
<sql id="Base_Column_List"> t.name, t.id </sql> <select id="getObjectById" resultType="com.t3.ts.resource.manager.dto.VehicleTaxDto"> SELECT <include refid="Base_Column_List" /> FROM person t </select>
扩展1:TypeHandle
在与数据库交互过程中难免遇到需要对新增的数据类型做转换,或者对返回结果做类型转换,eg:对敏感字段加密解密,Date类型与String类型互转的问题;
而mybatis支持一个特别针对这场景处理的绝招:就是在xml使用 typeHandler
第一步:自定义自己的 typeHandler
package com.mj.app.typeHandler;
import com.google.common.cache.CacheBuilder;
import com.google.common.cache.CacheLoader;
import com.google.common.cache.LoadingCache;
import org.apache.commons.lang3.StringUtils;
import org.apache.ibatis.type.BaseTypeHandler;
import com.mj.utils.CryptoUtils;
import org.apache.ibatis.type.JdbcType;
import java.util.concurrent.TimeUnit;
import java.sql.CallableStatement;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
public class MySecurityHandler extends BaseTypeHandler { private static final String KEY = "666666666"; /*** * 加密缓存容器 */ private static final LoadingCache<String, String> ENCRYPT_CACHE = CacheBuilder.newBuilder().expireAfterWrite(30, TimeUnit.MINUTES).build(new CacheLoader<String, String>() { @Override public String load(String parameterValue) { if (StringUtils.isEmpty(parameterValue)) { return ""; } try { return CryptoUtils.encryptAES(parameterValue, KEY); } catch (Exception e) {return ""; } } }); /*** * 解密缓存容器 */ private static final LoadingCache<String, String> DECRYPT_CACHE = CacheBuilder.newBuilder().expireAfterWrite(30, TimeUnit.MINUTES).build(new CacheLoader<String, String>() { @Override public String load(String parameterValue) { if (StringUtils.isEmpty(parameterValue)) { return ""; } String str = null; try { str = CryptoUtils.decryptAES(parameterValue, KEY); if (StringUtils.isEmpty(str)) { str = parameterValue; } } catch (Exception e) { } return str; } }); /*** * 加密 * @param preparedStatement * @param i * @param parameter * @param jdbcType * @throws SQLException */ @Override public void setNonNullParameter(PreparedStatement preparedStatement, int i, Object parameter, JdbcType jdbcType) throws SQLException { String parameterValue = (String) parameter; String resultValue = ENCRYPT_CACHE.getUnchecked(StringUtils.trimToEmpty(parameterValue)); preparedStatement.setString(i, resultValue); } /*** * 解密 * @param resultSet * @param s * @return * @throws SQLException */ @Override public String getNullableResult(ResultSet resultSet, String s) throws SQLException { return DECRYPT_CACHE.getUnchecked(StringUtils.trimToEmpty(resultSet.getString(s))); } /*** * 解密 * @param resultSet * @param i * @return * @throws SQLException */ @Override public String getNullableResult(ResultSet resultSet, int i) throws SQLException { return DECRYPT_CACHE.getUnchecked(StringUtils.trimToEmpty(resultSet.getString(i))); } /*** * 解密 * @param callableStatement * @param i * @return * @throws SQLException */ @Override public String getNullableResult(CallableStatement callableStatement, int i) throws SQLException { return DECRYPT_CACHE.getUnchecked(StringUtils.trimToEmpty(callableStatement.getString(i))); } }
第二步:使用加密解密处理
<!-- 处理返回值的使用方式 --> <resultMap id="BaseResultMap" type="com.mj.app.entities.UserEntity"> <id column="id" jdbcType="VARCHAR" property="id" /> <result column="password" jdbcType="VARCHAR" property="password" typeHandler="com.mj.app.typeHandler.MySecurityHandler"/> <result column="account" jdbcType="VARCHAR" property="account" /> </resultMap> <!-- 处理新增/修改/查询时的使用方式 --> <if test="password != null"> #{password , jdbcType=VARCHAR, typeHandler=com.mj.app.typeHandler.MySecurityHandler}, </if>
SELECT TIMESTAMPDIFF(MONTH,'2009-10-01','2009-09-01'); interval可是: SECOND 秒 SECONDS MINUTE 分钟 MINUTES HOUR 时间 HOURS DAY 天 DAYS MONTH 月 MONTHS YEAR 年 YEARS
MySql基于当前时间往前或往后增减时间函数:date_add()
eg: 1、select date_add(now(), interval 1 day); - 加1天 2、select date_add(now(), interval -1 day); - 减1天 加减的单位有:hour(小时),minute(分钟),second(秒),microsecond(毫秒),day(天),week(周),month(月),quarter(季),year(年)