• 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(年)
     
  • 相关阅读:
    $NOIP2012$ 题解报告
    $NOIP2011$ 题解报告
    $NOIP2007$ 题解报告
    $NOIP2006$ 题解报告
    $NOIP2005$ 题解报告
    $NOIP2003$ 题解报告
    $NOIP2002$ 题解报告
    $NOIP2001$ 题解报告
    $NOIP2000$ 题解报告
    $NOIP1999$ 题解报告
  • 原文地址:https://www.cnblogs.com/outpointexception/p/10771779.html
Copyright © 2020-2023  润新知