Mybatis使用经验归档

新增主键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>
 
MySql计算两个日期的时间差函数TIMESTAMPDIFF用法: 
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:
1select  date_add(now(), interval 1 day); - 加1天
2select  date_add(now(), interval -1 day); - 减1天
加减的单位有:hour(小时),minute(分钟),second(秒),microsecond(毫秒),day(天),week(周),month(月),quarter(季),year(年)
 
原文地址:https://www.cnblogs.com/outpointexception/p/10771779.html