范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文
国学影视

玩转Mybatis高级特性让你的数据操作更上一层楼

  Mybatis高级特性能够帮助我们更加灵活地操作数据库,包括动态SQL、缓存机制、插件机制、自定义类型转换等。学习这些特性可以让我们更好地利用Mybatis,提高数据操作的效率和质量。  动态SQL
  动态SQL中,Mybatis提供了多种标签来帮助我们构建动态的SQL语句,其中包括:    :用于条件判断,可以动态添加WHERE语句的查询条件。   :动态生成WHERE语句,可以过滤掉不需要的条件。   :动态生成UPDATE语句,可以更新需要修改的字段。   :类似于Java中的switch语句,可以根据不同的条件生成不同的SQL语句。   :用于循环遍历集合,可以将集合中的元素作为SQL语句的参数进行批量操作。
  示例:           update sys_user                                               username = #{username,jdbcType=VARCHAR},                                                       nickname = #{nickname,jdbcType=VARCHAR},                                                       gender = #{gender,jdbcType=TINYINT},                                                       password = #{password,jdbcType=VARCHAR},                                                       dept_id = #{deptId,jdbcType=INTEGER},                                                       avatar = #{avatar,jdbcType=VARCHAR},                                                       mobile = #{mobile,jdbcType=VARCHAR},                                                       status = #{status,jdbcType=TINYINT},                                                       email = #{email,jdbcType=VARCHAR},                                                       deleted = #{deleted,jdbcType=TINYINT},                                                       create_time = #{createTime,jdbcType=TIMESTAMP},                                                       update_time = #{updateTime,jdbcType=TIMESTAMP},                                   where   id = #{id,jdbcType=INTEGER}      
  动态SQL的优化技巧:  尽量使用    标签生成WHERE语句,可以避免出现多余的AND或OR关键字。 使用    标签批量操作时,尽量使用batch模式,而不是简单的循环逐一执行。 对于常用的动态SQL语句,可以使用Mybatis提供的缓存机制进行优化。  尽量避免在动态SQL中使用  select *  语句,而是明确指定需要查询的字段。 在动态SQL中尽量使用预编译语句,可以提高SQL语句的执行效率。  让自己不断进步,让职业越来越优秀。 缓存机制一级缓存和二级缓存的区别  一级缓存是Mybatis默认开启的缓存,它是在同一个SqlSession内部共享的缓存,它可以通过查询语句的唯一标识符(id)和查询参数作为key进行缓存,可以有效地避免重复查询。一级缓存的生命周期与SqlSession相同,当SqlSession关闭时,它的缓存也会被清空。  二级缓存是Mybatis的全局缓存,它可以被多个SqlSession共享,适用于需要跨SqlSession共享数据的场景。它的存储方式是将数据放在一个HashMap中,key是查询语句的唯一标识符和查询参数的组合,value是查询到的结果。二级缓存的生命周期与整个应用程序相同,它可以在应用程序的多个SqlSession之间共享查询结果,但也由于这个原因,它的数据一旦被修改,就需要手动刷新缓存,否则会导致数据的不一致。  缓存的配置和使用方式
  配置方式:   mybatis:   configuration:     cache-enabled: true   #开启二级缓存(默认开启)     local-cache-scope: statement #关闭一级缓存(默认开启) #   local-cache-scope: session   #开启一级缓存(默认开启)
  使用方式:       
  自定义缓存实现,这里采用本地存储,分布式建议用redis  @Component @Slf4j public class MyCustomCache implements Cache, Serializable {      private String id;     private Map cache = new ConcurrentHashMap<>();      public MyCustomCache() {     }      public MyCustomCache(String id) {         this.id = id;     }      @Override     public String getId() {         log.info("获取缓存标识:{}",id);         return id;     }      @Override     public void putObject(Object key, Object value) {         log.info("添加缓存key:{},value:{}",key,value);         cache.put(key, value);     }      @Override     public Object getObject(Object key) {         log.info("获取缓存key:{}",key);         return cache.get(key);     }      @Override     public Object removeObject(Object key) {         log.info("删除缓存key:{}",key);         return cache.remove(key);     }      @Override     public void clear() {         log.info("清空缓存");         cache.clear();     }      @Override     public int getSize() {         log.info("获取缓存数量:{}",cache.size());         return cache.size();     }      @Override     public ReadWriteLock getReadWriteLock() {         log.info("拿锁");         ReentrantReadWriteLock readWriteLock = new ReentrantReadWriteLock(true);         return readWriteLock;     }      private void writeObject(ObjectOutputStream out) throws IOException {         out.writeObject(cache);     }      private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException {         cache = (Map) in.readObject();     }  } 做自己喜欢的事情,成为自己想成为的人。 插件机制
  Mybatis插件可以在执行过程中拦截指定的方法,对其进行增强或者修改,原理是使用JDK动态代理机制,对Mybatis的接口进行代理,从而实现对SQL执行过程的拦截和修改,可以实现一些比较复杂的功能,例如:  对SQL语句进行拦截和修改,实现动态SQL的功能。  统计SQL执行的时间,方便对性能进行优化。  实现通用的分页查询功能。  对查询结果进行加密或解密。
  自定义插件的步骤:  实现Interceptor接口,重写intercept方法。  在intercept方法中编写拦截逻辑,对需要拦截的方法进行增强或修改。  在plugin方法中,将拦截器实例化,并返回代理对象。  在Mybatis配置中添加插件。
  以下是一个统计SQL执行时间示例:  @Intercepts({         @Signature(type = StatementHandler.class, method = "query", args = {Statement.class, ResultHandler.class}) }) @Slf4j public class MybatisPlugin implements Interceptor {     @Override     public Object intercept(Invocation invocation) throws Throwable {         // TODO: 拦截逻辑         log.info("进入拦截器");         long startTime = System.currentTimeMillis();         Object result = invocation.proceed();         long endTime = System.currentTimeMillis();         long sqlTime = endTime - startTime;         StatementHandler statementHandler = (StatementHandler)invocation.getTarget();         String sql = statementHandler.getBoundSql().getSql();         ParameterHandler parameterHandler = statementHandler.getParameterHandler();         log.info("执行sql:{},参数:{},花费了{}毫秒",sql,parameterHandler.getParameterObject().toString(),sqlTime);         return result;     }      @Override     public Object plugin(Object target) {         log.info("生成代理对象");         return Interceptor.super.plugin(target);     }      @Override     public void setProperties(Properties properties) {         log.info("设置插件属性");         Interceptor.super.setProperties(properties);     } }
  添加插件  @Component public class MySqlSessionFactoryBeanCustomizer implements SqlSessionFactoryBeanCustomizer{     @Override     public void customize(SqlSessionFactoryBean factoryBean) {         //注册插件         factoryBean.setPlugins(new MybatisPlugin());     }  } 保持热情与好奇心,不断追求进步和创新。 自定义类型转换
  Mybatis中的类型转换指的是Java类型和数据库类型之间的转换。在Mybatis中,我们可以使用TypeHandler来实现自定义的类型转换。
  自定义TypeHandler的步骤如下:  创建一个类,实现org.apache.ibatis.type.TypeHandler接口。  在类上使用@MappedJdbcTypes注解指定要转换的JDBC类型。  在类上使用@MappedTypes注解指定要转换的Java类型。  重写TypeHandler接口中的方法,实现自定义的类型转换逻辑。
  示例:  @MappedJdbcTypes(JdbcType.VARCHAR) @MappedTypes(String.class) @Slf4j public class MyStringTypeHandler implements TypeHandler {      @Override     public void setParameter(PreparedStatement ps, int i, String parameter, JdbcType jdbcType) throws SQLException {         log.info("将Java类型的参数转换为JDBC类型的参数,并设置到PreparedStatement中");         ps.setString(i, parameter);     }      @Override     public String getResult(ResultSet rs, String columnName) throws SQLException {         log.info("通过列名{}获取数据,将JDBC类型中的结果转换为java类型",columnName);         return rs.getString(columnName);     }      @Override     public String getResult(ResultSet rs, int columnIndex) throws SQLException {         log.info("通过索引获取数据,将JDBC类型中的结果转换为java类型");         return rs.getString(columnIndex);     }      @Override     public String getResult(CallableStatement cs, int columnIndex) throws SQLException {         log.info("通过索引获取数据,将JDBC类型中的结果转换为java类型");         return cs.getString(columnIndex);     } }
  注册  @Component public class MySqlSessionFactoryBeanCustomizer implements ConfigurationCustomizer {      @Override     public void customize(Configuration configuration) {         configuration.getTypeHandlerRegistry().register(String.class,new MyStringTypeHandler());     } }
  以上示例中,我们自定义了一个将Java String类型转换为JDBC VARCHAR类型的TypeHandler。  总结
  本文介绍了Mybatis的高级特性,包括动态SQL的优化技巧、缓存机制、插件机制和自定义类型转换。动态SQL的优化技巧包括使用    标签生成WHERE语句、使用   标签批量操作时尽量使用batch模式等。缓存机制包括一级缓存和二级缓存,可以通过配置文件进行开启或关闭。插件机制可以在Mybatis的执行过程中拦截指定的方法,对其进行增强或者修改。自定义类型转换可以将Java类型和数据库类型之间进行转换。

离婚3个月!杨颖与小10岁男星交往?两人现身网咖监视器画面流出想想当初那场黄晓明和Angelababy(杨颖)的世纪婚礼,羡煞了多少人。不过轰轰烈烈的开场,并没有迎来幸福完美的结局,6年的婚姻宣告结束,如今两人离婚已经3个月。杨颖与黄晓明离婚黄晓明离婚后发泄大哭,可见他对杨颖爱有多深上身了,演完了,发泄完了,我整个人的情绪也都发泄出去了,承受都是应该的。黄晓明与baby分手后大哭,看来黄晓明对杨颖的爱不是一般的深呐。黄晓明对于杨颖婚姻破裂一事感到自责不已,但是曾被嘲最丑女星,却惊艳整个娱乐圈如今53岁的她,太美了谁人亦像玩具,有一千一百岁,只须有趣你都去追,你说爱只可以追踪,不可以留手中,不管那是谁27年前,一首爱得干脆,让吴倩莲脱颖而出。在那个美人云集的年代,她自嘲最丑,却被刘德华当众求连衣裙才是永不过时的夏日单品,自带高级感,谁穿谁优雅就要这么穿随着夏季的来临,连衣裙又卷土重来了,它温婉又大气,款式丰富多彩,相信总有一个适合你的款式。连衣裙才是永不过时的夏日单品,自带高级感,谁穿谁优雅,不必太浮夸就能让你轻松美过李佳琦618直播预告来啦!天气丹上榜!建议快看看有你需要入的吗咱就是说这辈子是不可能了下辈子能不能做李佳琦助理这样自己的护肤品就再也不会踩雷了之前买洗面奶真的就是跟风买大牌结果钱没少花,皮肤也没变好但是自从跟着李佳琦学护肤后入手的洗面奶就再也王薪凯完婚后感谢大家的祝福祝愿以后都能步步生花一路繁花北京时间5月16日,广东男篮球员王薪凯今日在社交媒体晒出昨日婚礼的照片,并对杜锋朱芳雨易建联周鹏等人表示感谢。王薪凯昨日在广州和相恋5年的女友完婚,广东男篮全体出动来见证他们的甜蜜立夏过后,下雨频繁,建议多吃这6种食物,祛湿润燥,对身体好立夏过后,下雨频繁,建议多吃这6种食物,祛湿润燥,对身体好。立夏过后,南方地区的降雨量大大增加,气温也下降了好几度。五一假期过后,我们这边就一直在下雨,哪里也不能去,而且下雨过后,面霜推荐这些面霜能够深层次的锁水和补水,让肌肤水润Q弹面霜推荐这些面霜能够深层次的锁水和补水,让肌肤水润Q弹FAB急救面霜FAB面霜相对是比较平价的了,也是被李佳琦种草而火起来。它的主要功效就是用来屏障修复,舒缓锁水,对于肌肤脆弱敏感黄圣依凭借功夫爆红,却把周星驰告上法庭,这是怎么回事呢?拍摄功夫时,与周星驰闹翻的不止洪金宝一人,还有黄圣依。20岁出头的黄圣依当时只是一个大学生,一年凭借清纯的长相与气质被周星驰一眼相中,出演功夫中的女主角,全片没有一句台词,全屏肢体奔跑吧来了李晨终熬出头,最可怜的是郑恺不知不觉,奔跑吧已经陪伴我们走过了这么多年头了。综艺节目总会有个缺点,那就是经历过很多季之后,观众都会有种审美疲劳了,如果不创新的话,那么收视率就会成为一个问题。已经第十季了,跑男水中人参芡实芡实形状和莲花差不多,芡实生长在水中,一般是在78月份开花,9月份结出果实。在南方,芡实是一种非常常见的食物,它还有一种被大家熟知的名字,叫鸡头米。新鲜的芡实生长在池沼湖泊中,和莲
E52696v3鸡血版处理器,游戏帧数表现略高于I510400F众所周知E52696v3鸡血版是目前游戏工作室多开领域打金挂机最强处理器,但大家又经常听到这样一句话E5处理器多开可以,家用打游戏不行。真相如何?今天来做一个简单的测评,不谈其强大孙颖莎与教练携手渡难关2023年中国乒乓球队世乒赛选拔赛第一站正赛开始的前两天,队员们模拟国际比赛节奏,自主安排训练时间。孙颖莎的专项技术训练一直练到了晚上18点多,结束后她到体能馆继续练体能。直通赛期首席消费官贵人鸟新增被执行人信息去年下架移动应用程序420款贵人鸟集团新增被执行人信息,执行标的近4。36亿元中国执行信息公开网显示,2月27日,贵人鸟集团(香港)有限公司新增一则被执行人信息,执行标的近4。36亿元,执行法院为厦门市中级人与苦难狭路相逢,无所畏惧,才能拥抱新生,看见人生的灿烂时刻总有疾风起,人生不言弃。风雨压不垮,苦难中开花。没有谁的生活会是一帆风顺的,没有谁能够在人生的道路上不遭遇苦难,尤其是对于那些拼搏于职场的女性来说,更是如此。不过,正如普希金所说的野性的呼唤人都是要死的,没必要活得太规矩人活一世,终归一死。不管这一生,你是活得憋憋屈屈也好,你是活得潇潇洒洒也罢,都免不了一死,死亡,是最后的审判和公平。这一生活得如何,最后都会有个裁定。杰克伦敦一生,都活得很不规矩,阜裕大桥爆火!警方出手最近一段时间阜裕大桥成了爆红网络的打卡地大家在这拍美美的照片让更多人看到咱阜阳的美景美人当然是极好的但有极少部分人显得不是那么和谐因为他们把车开到了桥下甚至玩起了越野堤坝坡陡路滑车一个普普女孩的醒悟,从现在开始要学着爱自己了第一次尝试着在网络上写文字,记录自己的蜕变和成长,之前没有写过文字,文笔不好,如果你也是和我一样的女孩,希望你可以有耐心看完,你可以从中获得力量,我也能收获来着你的力量。我是一个很新款24英寸iMac正在进行生产测试但要到2023年底才会发货据称,24英寸iMac的更新已经进入后期开发阶段,这使得苹果在2023年下半年发布它非常有可能。24英寸iMac的更新预计将被推迟到M3芯片推出之前,之前的传言将该机型的潜在发布时200mW单端推力狂飚,这不直接炸裂?解码小尾巴的新千元王者来了感觉国货啥都内卷,就拿音频圈来说,内卷并不是单单让价格更低。在我看来,实实在在倒逼出原本感觉不太可能做好的产品音频小尾巴。早期的小尾巴可以单独理解为转接口线控,甚至简单的解码器。而甘薯吃对养人,吃错伤人!来看注意事项甘薯1。高钾低钠甘薯是典型的高钾低钠食物,有一定的帮助降血压的作用。2。维生素C含量高新鲜甘薯的维生素C含量比苹果的维生素C含量还要高,并且甘薯中的淀粉加热后呈糊状,使不耐热且易溶手脚冰凉,补阳药没用?送你两味药泡水,让你全身暖洋洋总有那么一部分人在天气降温以后就非常的怕冷,手脚总是冰凉的,怎么暖都暖不热,吃了补阳药也不见效果,反而还出现了上火的症状。其实有一种手脚冰凉并不是因为阳虚才导致的,所以体内不缺阳气