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

玩转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类型和数据库类型之间进行转换。

泰拉瑞亚松叶快刀获得方法松叶快刀是泰拉瑞亚中非常好用的一把武器,很多玩家都想要知道泰拉瑞亚松叶快刀怎么获得,小编为大家带来泰拉瑞亚松叶快刀获得方法。泰拉瑞亚松叶快刀获得方法1。松刀是一把花后的法师武器,获退休人员养老金增长方案离我们越来越近往年的这个时间各地退休人员养老金增长方案早已出台,今年到目前为止迟迟没有动静。随着网上议论增多,感觉退休人员养老金增长方案离我们会越来越近,相关部门的步伐也会加快!每出次养老金增长刘涛辟谣婚变,王珂将其取关并删除恩爱动态,两人已半年没互动5月18日,有博主再度爆料刘涛与老公王珂现离婚的消息,原因是王珂第三次投资失败,还因为炒币巨亏了3。5亿,对于这样的传闻,刘涛工作室率先发声予以澄清,不过爆料博主却态度强硬,直接与刘涛婚姻亮红灯?淡雅女星被报复?张杰谢娜秀恩爱被嘲?1。刘涛今天因为这个热搜,有人爆料刘涛离婚了,原因是老公王珂炒币亏了,这爆料也是来源于网络!微博上有人堆这个爆料进行了细致的分析,大概意思就是刘涛的老公王珂在2008年的时候因为炒2013年安徽夫妻坐火车回家,妻子在厕所待半小时后消失,后来找到没2013年10月12日凌晨三点左右。呼哧轰轰一辆绿皮火车正在轨道上急速行驶,车厢里,旅客们纷纷沉浸在酣甜的睡梦中。不同的是,一名年轻男子神色紧张,满头大汗,正急促地敲着乘务员的门。反诈老陈进剧组拍戏,淋雨跪在主演旁,称演戏不好玩,网友小丑命运送给你的每一样礼物,其实背后都标记了筹码。每个时代都有机会的风口,如果能把握住,就能成功但是如果没有驾驭的能力,就会遭受更大的打击。反诈老陈的走红正是如此。他本是一名普通的警察油价调整消息今天5月19日,各地加油站调价后9295汽油售价截止到现在,国内成品油价格调整预计调整幅度为上调320元吨左右,三地原油品种变化率自本计价周期开始,持续处于高位运行。虽然变化率有小幅度的下跌,但是仍旧没有改变油价预计上调的局面。钟丽缇穿超短裤运动,大腿粗壮腰间赘肉明显,网友姐姐老了5月18日,钟丽缇在社交平台晒出动态,她身着米黄色的T恤,搭配着亮黄色的超短裤,竖着两根辫子,穿着运动鞋,在自己家豪宅的客厅里对着镜头做运动,整个人显得特别的自信,完全不像50岁的神回复长城这么矮能拦住什么呢?看完神评服了,好有道理以为是赚大了,馅饼太大,不要轻易相信。从外边绕啊!继续传播。恐龙玩具?抑或是恐龙摆件吧。看看你男朋友变了吗?看看这个图是什么意思呢?还记得西游记里米勒佛的金铙吗?男子是怎么得罪他的快本停播7个月,5位主持人天差地别有人暴瘦,有人疑似隐退快乐大本营停播后,主持人杜海涛工作量骤减,最近参加了一个减肥训练营。在健身教练放出来的视频里,34岁的杜海涛正在接受魔鬼训练,和巨大的轮胎玩命。腰部做了保护的杜海涛挥汗如雨,完成了朱立伦狠下手为拉拢深蓝?台媒朱想平息内乱,但恐无法如愿据台媒5月19日报道国民党主席朱立伦征召行政院前院长张善政参选桃园市长,引发党内震荡。党中央昨天透露韩国瑜扮演重要角色,意在安抚深蓝罗(智强)粉,寻求团结。但即便抬出韩国瑜,仍造成
湖南双峰曾国藩故居富厚堂曾国藩故居景区在双峰县荷叶镇,范围宽规模大,进入县境就有高大的曾国藩故里牌坊矗立在大路上,这里留有曾氏痕迹,曾国藩的标签无处不在。当然在景区附近也还有蔡和森纪念馆和秋瑾故居纪念馆,简述第二野战军第4兵团作战序列和主要领导成员名录历史1949年2月,根据中央军委关于统一全军组织及部队番号的规定,中国人民解放军第二野战军第13第14第15军,在河南漯河地区组成第4兵团,共计8万余人。渡江战役中,第4兵团从安徽1950年四川一位69岁老妇被捕,审讯后得知她的身份竟是双枪老太婆1950年,在四川锦竹县的一个偏僻小山村中,一位已经69岁的老太太正在自家院中干着活,生活可以说很是惬意,但不料一天,一行官兵火急火撩冲入院中,二话没说随即将老人按压在墙上,大声道记者问天安门上的毛主席像会挂多久?邓小平的回答令人肃然起敬为开国大典画毛主席像时,您只有30岁,如此年轻,这么神圣而光荣的任务怎么会落在您的身上呢?其实,我也没有什么过人之处,只是机缘巧合之下被中央领导选中了。1949年4月,在一次机缘巧周总理的智慧(一)历史背景中苏交恶已久,1964年10月中国第一颗原子弹爆炸成功,同月赫鲁晓夫下台。1964年11月5日,周总理率领由贺龙康生伍修权乔冠华等人组成的中国党政代表团离京赴莫斯科,参加十1949年,一位汉奸微笑赴死,建国后他的真实身份才被揭综述1949年五月的一天,大街上熙熙攘攘,他们都聚集在上海警察总局的门口看热闹,因为就在前段时间,他们发布告示会在今天处置几位犯人,其中有一位大汉奸。因为痛恨,百姓在看到那名汉奸的清朝最后一位大内高手,贴身护卫慈禧的宫猴子宫宝田小时候第一个喜欢的影视人物,是何家劲扮演的展昭,威风八面,帅的一塌糊涂,当时崇拜的不得了展昭保护包拯有功,经过举荐,被皇上御封为御前四品带刀护卫,封号御猫。实际上,宋朝还没有御前带婉容被溥仪关猪圈十年,被救出时,她的一句话让人很心疼满清的最后一位皇帝,叫做爱新觉罗溥仪。他的一生从即位,到被军阀推翻,再到辗转各地,最后成为日本人的傀儡。短暂的皇帝生涯,却造就了传奇的人生。后世对于溥仪的研究十分深入,很多人也十分小妾分得30万遗产,却全部交给原配儿子我才17岁,要去读书了各种题材的文艺作品都十分青睐民国,而民国的确是个迷人的时代。一件古之未有,惊天动地的大事就在这一时期发生皇帝退位,中国成为了民主国家。但社会上的矛盾仍然是存在的,千年以来的遗毒难以毛泽东和周恩来是怎么认识的?又怎么巧合的见了第一次面?作为中国历史上最伟大最成功的搭档和组合,周恩来和毛泽东在那一年第一次见面,又是在哪里见的这一面呢?1924年7月,周恩来从法国回国,9月抵达广州。10月间,中共中央决定重新建立广东诺贝尔奖越发越多!诺贝尔留了多少遗产,怎么120年了还用不尽?至高的奖项玛丽居里杨振宁李政道屠呦呦国际原子能机构红十字国际委员会这些响当当的人物和世界组织为人类做出的贡献可谓影响深远。生物医学获得者,屠呦呦不管他们来自何方,从事怎样的工作,有