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

mybatis各阶段的详解

  1 本阶段的需要注意的几个点1,首先是在核心配置文件里面的内容:
  配置的顺序,不配则不用管,配则必须按顺序来!!!!
  properties?,
  settings?,
  typeAliases?,
  typeHandlers?,
  objectFactory?,
  objectWrapperFactory?,
  reflectorFactory?,
  plugins?,environments?,
  databaseIdProvider?,
  mappers?.-->
  比如我们在引入了jdbc的配置文件使用了properties标签,引入jdbc有什么好处?,可以在配置文件中统一管理
  内容而不是在很多个文件改来改去,而且在核心配置文件中把数据库连接相关的写死,显然是硬编码的所以我们用配置文件代替 nice!!! jdbc.driver=com.mysql.jdbc.Driver jdbc.url=jdbc:mysql://localhost:3306/mybatis_db jdbc.username=root jdbc.password=kobedu #为了解决重名的问题和风险 使用前缀jdbc. 见名示意
  你可能注意到了上面的写法 用前缀jdbc. 可以很好地将他们与其他的变量区分开,(可以从名字很容易看出是jdbc相关的数据,不至于和同名变量搞混因为username这种可能
  不止会出现在数据库的连接) 1,在核心配置文件中引入jdbc的配置文件                                                                                                                                                                                
  上面的代码中引入配置文件的部分为
  可以从上面看到写法: 2,在核心的配置文件中设置类的别名
  下面这段就是用来设置类的别名:        
  那么问题来了,为什么要有类的别名这种操作??
  因为在映射文件中每次都要写全类名显然有点麻烦比如下面这样:                insert into t_user values (null,"旺财","20")      
  一个项目是会有很多个映射文件的为了方便,所以类别名就出现了。可以在核心配置文件写接口类和对应的别名        
  这样就可以在映射文件的命名空间里可以直接写User(对大小没有要求也可以是user; 其实可以比这更加简单,也是我们在实际开发中常用的写法
  就是将整个包写成别名的形式,如果不写alias属性默认为类名(不区分大小写),这样就容易多了,我们只需一行代码,便可以在所有的映射文件命名空间
  中直接写对应的类名         3、在核心配置中引入映射文件
  引入核心的配置文件       
  首先需要思考的这里是映射文件的引入,我们正常的一个项目的数据库是有很多个表组成的那么每一张表对应一个mapper接口,每个接口对应一个映射文件,那么就需要导入大量的映射文件,还容易漏掉-->        
  上面这种以包的形式的导入非常方便,不用每次新建一个接口就要导入它的映射文件,但是上面这种写法需要 注意 一些问题: 在当前的resource目录下建包 (新建文件 然后是文件名 com/kobedu/com.kobedu.mybatis/mapper -->enter) 用上面方式建的包必须要和mapper接口所在的包同名 在包里的映射文件必须和接口类同名 4、查询时需要返回类型
  如果你在映射文件中编写查询语句的sql,但是粗心的你忘记了设置返回类型会在控制台抛异常且会看到这样的说明:
  It"s likely that neither a Result Type nor a Result Map was specified.
  下面只是指定返回类型的一种方式:resultType,还有 resultMap
  它们的区别: resultType : 设置默认的映射关系(字段名和属性一致的情况) resultMap : 设置自定义的映射关系(字段名和属性名不一致或一对多或多对一)
  查询的标签必须指定resultType或resultMap   2、mybtis获取参数的两种方式(重点)
  com.kobedu.mybatis 获取参数的两种方式:${} 和 #{} ${}:本质字符串的拼接(JDBC原生中的字符串拼接) 和 #{}:本质占位符 <?xml version="1.0" encoding="UTF-8" ?>          
  上面是使用了 #{}写法相当于原生jdbc的占位符,这个前面已经提到过了所以不多赘述, 需要注意的是#{}里面的变量名可以是任意的username规范显然很好,但是aaaa也没错因为只是用来占位的;
  还有就是在使用${}时注意""单引号问题,因为${}是字符拼接的方式,所以需要注意!!
  传输参数时有多个参数时     
  在测试代码里通过传入两个参数分别为 username和password 但是在上面代码的(映射文件里的部分代码)执行失败,(sql语句未能解析)
  报错:
  Cause: org.apache.ibatis.binding.BindingException: Parameter "username" not found. Available parameters are [arg1, arg0, param1, param2]
  可以从错误提示的信息不难发现我们的参数在映射文件里未能真正地接受到,可以用[arg1, arg0, param1, param2] 的方式获取,mybatis将参数放到map容器可以通过建arg0,agr1..的方式
  获取参数(也可以是param1,param2..)
  将上面的代码改动:      
  需要注意的是:使用${}时需要手动添加""才能正常访问,因为他的处理方式是字符串的拼接 class test{     @Test     public void selectUser(){         ParameterMapper parameterMapper = SqlSessionUtils.getSqlSession().getMapper(ParameterMapper.class);         User userById = parameterMapper.getUserByUsernameAndPassword("旺财","cwlz");         System.out.println(userById);     } }
  做了改动之后结果很感人!!
  User{id=6, userName="旺财", age=20, password="cwlz"} 若mapper接口的参数有多个时可以手动添加到map集合
  可以直接通过键访问相对应的值(通过自己的方式访问到数据,上面的形式是mybatis默认提供的map和mybatis默认的提取指的方式 arg0,arg2...)
  当需要传多个参数时将他们放到一个map容器,然后将map传给对应的方法(模拟mybatis的做法,就可以在sql语句中直接通过键访问到值)代码如下: class Test{  @Test     public void longinTest(){         ParameterMapper parameterMapper = SqlSessionUtils.getSqlSession().getMapper(ParameterMapper.class);         Map userInfo = new HashMap<>();         userInfo.put("username","旺财");         userInfo.put("password","cwlz");         User userById = parameterMapper.login(userInfo);         System.out.println(userById);         if (userById!=null) {             System.out.println("登录成功!");         }else{             System.out.println("用户名或密码错误");         }     } }
  映射文件中的部分代码 :     
  通过键直接获取值,注意:使用${}时不要忘了单引号!!!!
  当参数以实体对象的形式传参时如何解决?
  只需要通过#{}以属性名的方式访问! class Test{  @Test     public void longinTest2(){         ParameterMapper parameterMapper = SqlSessionUtils.getSqlSession().getMapper(ParameterMapper.class);         User userById = parameterMapper.loginByUser(new User(null,"旺财",21,"cwlz"));         if (userById!=null) {             System.out.println("登录成功!");             System.out.println(userById);         }else{             System.out.println("用户名或密码错误");         }     } } 小提醒: 在接受以实体类对象的参数时在sql语句中的属性名一定要和实体类定义时属性的名一样!!     比如在实体类的定义时用户名是这样定义的 private String userName ;但是在映射文件中#{username} 就会报错:      Error querying database.  Cause: org.apache.ibatis.reflection.ReflectionException: There is no getter for property named "username" in "class com.kobedu.com.kobedu.mybatis.pojo.User"
  所以代码的编写一定要规范,才能减少这种错误!!! 使用注解的方式传递参数:(以后开发就用它)
  在声明方法时在参数前用注解 @Param("参数名") public interface ParameterMapper {     //用于测试使用注解的传参方式     User testZhuJie(@Param("z_username") String username, @Param("z_password") String password); }
  映射文件中的部分代码:(取参数时参数名和方法声明时的注解的中的参数名一一对应)      小提示:如果映射文件中的参数的名如果和注解中的参数名不一一对应则会报错:     Cause: org.apache.ibatis.binding.BindingException: Parameter "username" not found. Available parameters are [z_username, param1, z_password, param2]     可以从提示看出是参数找不到(参数名写错)!!!
  一定要和注解中的参数名一一对应!!! 各种查询功能查询功能     1. 若查询出的数据只有一条,可以通过实体类对象接收或者集合类接收     2. 若查询出的数据有多条可以通过List集合接收,一定不能通过实体类对象接收,此时会抛异常TooManyResultsException:(就是预期的结果是一个或者null,但是发现多个就会抛出此类异常)
  如果查询的结果只有一个,也可以通过Map集合接收,字段名为键字段的值为值:{password=0000, id=3, userName=图区, age=20} MyBatis 有默认的类型别名,可以在官方文档中查看!
  java.lang.Ingeger --> int ,Integer
  int --> _int,_Integer
  Map --> map
  String --> string 以Map集合接收多条数据首先我们测试了  Map getAllUser();  像这样接收多个数据会报错TooManyResultsException 然后可以用List接收多条数据:List> getAllUser();结果如下: [{password=1234, id=1, userName=锁哥, age=21}, {password=3211, id=2, userName=仁王, age=21}, {password=0000, id=3, userName=图区, age=20}, {password=kkkk, id=4, userName=旦罗, age=22}, {password=kobedu, id=5, userName=kobe, age=21}, {password=cwlz, id=6, userName=旺财, age=20}, {password=cwlz, id=9, userName=miss, age=20}, {password=cwlz, id=10, userName=1024, age=20}] 以map的形式接收多条数据 (重点) @MapKey("id")  Map getAllUser();
  注意: 小提示:   将多条数据用Map接收可以使用@MapKey 将一个字段(在表中独一无二(通常为主键))设为map的键将每一条数据作为值,用Map集合接收!   特殊sql的执行1#{} 底层为占位符原理 ${} 字符串拼接原理 1,模糊查询"%${username}" concat("%",#{username},"%") "%"#{username}"%" (这个最常用) 2,批量删除#{} 是自动会添加""的
  所以在批量删除的案例:需要注意的是不能使用#{} 因为它是会自动添加"" 所以在批量删除的语句中我们要使用${}       delete from t_user where id in (${ids})  3,动态设置表名select * from ${tableName}      不能使用#{} 会有错 4,添加功能获取自增的主键用的场景:  useGeneratedKeys:设置当前的标签中的sql使用了自增主键 keyProperty:将自增主键的值赋值给传输到映射文件中参数的某个属性 自定义映射1,resultMap处理字段和属性的映射关系
  若字段和属性名不一致 ,则可以通过resultMap设置自定义映射 为字段起别名,保持和属性名一致 设置全局配置将 _ 自动映射为驼峰 使用自定义映射 resultMap 1,为字段起别名2,设置全局配置
  在mybatis的核心配置文件用下面的代码将 数据库中命名的规范 (user_name) 转换为 java中的命名规范 (userName)                    3,通过resultMap设置自定义映射关系
  就是手动设置属性与字段的映射关系:
  如果设置了手动的设置属性和字段的映射关系,注意主键使用 id 标签,普通字段使用 result标签,就算属性和字段名一一对应,只要
  用了这种方式就 必须要写全 !!!                                                   映射
  表和表之间是有映射的,那么表所对应的实体类之间也是要有映射的,处理多对一的映射关系 级联属性赋值 association 分步查询
  一对多的查询: 案例:按照部门的编号查询部门需要返回该部门的员工列表                                                                                                    
  通过分步查询实现: mybatis 中的动态查询
  多条件的查询 if
  if 根据标签中test的属性所对应的表达式决定标签中的内容是否拼接到sql语句中   
  上面的where后面的 1=1 是细节,因为当where后面的条件都为空时就成了 select * from t_user where
  显然这种sql语句是有问题的,还有一种情况就是当userName为null时语句就成了 select * from t_user where and age=#{age}
  这也是错的,所以在where后加一个恒成立的条件不仅不会影响查询结果,而且没有会在特定情况时sql语句是会报错的所以很有必要 where
  where 当where标签中有内容时,会自动生成where关键字,并且将内容前多余的and 或者or去掉
  当where中没有内容时,此时where标签没有任何效果 就是不会生成关键字 注意:在写条件时不能在后面加and or 这个在下一条语句无效时mybatis不会帮你去掉! trimprifix|suffix : 将trim标签中在内容前面或后面添加指定内容 suffixOverrides|prefixOverrides: 将trim标签中内容前面或后面去掉指定内容      choose when otherwise
  相当于 if else choose:用于包when otherwise when: 相当于if otherwise: else      foreach
  一个案例 -->就是当我们需要批量删除一些东西时(参数以数组的形式传入)           delete from t_user where id in         (                              #{id}                          )     collection 是需要遍历的集合 item 代表当前的 separator 分隔 open 以什么开始,在上面案例中的括号可以 open="(" 这样写 close 以什么结束,在上面案例中的括号可以 open=")" 这样写           delete from t_user where id in                              id = #{id}                  sql
  sql 片段: 在我们的查询语句不能在实际开发中也一直写 *;因为我们要按需查找,不必将不需要的也查询出来,我们可以将我们平常查询次数较多的字段
  放在sql片段内,可以在需要查询时直接进行引用!   id,dept_name     缓存
  缓存,这个术语我们听过很多次,在web阶段时访问网页时有缓存机制!
  现在sql的查询时也有缓存机制,有一级缓存,一级缓存是默认开启的,一级缓存的范围时sqlSession,将我们查询到的数据先进行缓存,若下次有相同的查询时不用重新
  访问数据库,可以直接从缓存中取出!!!! 使一级缓存失效的情况不同的sqlSession对应不同的一级缓存 同一个SqlSession但是查询条件不同 同一个SqlSession两次的查询期间执行了任何一次增删改操作 同一个SqlSession两次查询期间手动清空了缓存
  手动清空缓存 sqlSession.clearCache();
  一级缓存是默认使用的,而二级缓存需要手动开启! 二级缓存二级缓存的相关配置
  在mapper配置文件中添加cache标签可以设置一些属性: eviction属性:缓存回收策略LRU 最近最少使用的:移除最长时间不被使用的对象。FIFO 先进先出:按对象进入缓存的顺序来移除他们。SOFT 软引用:移除基于垃圾回收器状态和弱引用规则的对象。WEAK 弱引用: 更积极地移除基于垃圾回收器状态和弱引用规则的对象。
  默认为LRU flushInterval属性:刷新间隔,单位毫秒
  默认情况是不设置的,也就是说没有刷新间隔,缓存仅仅调用语句时刷新 size属性: 引用数目,正整数。
  代表缓存最多可以存储多少个对象,太大容易导致内存溢出 readOnly:只读 true/falsetrue 只读缓存:会给所有的调用者返回缓存对象的相同实例。因此这些对象不能被修改。这提供了很重要的性能优势false 读写缓存: 会返回缓存对象的拷贝(通过序列化) 。这回慢些,但是安全,因此默认是FALSE 谈缓存一级缓存的作用域是一个sqlsession内; 二级缓存的作用域是针对mapper进行缓存 MyBatis缓存查询的顺序先查询二级缓存,因为二级缓存中可能会有其他程序已经查出来的数据,可以拿来直接使用。 如果二级缓存没有命中,在查询一级缓存 如果一级缓存也没有命中,则查询数据库 SqlSession 关闭之后,一级缓存中的数据会写入二级缓存 整合EHCache      org.mybatis.caches     mybatis-ehcache     1.2.1        ch.qos.logback     logback-classic     1.2.3  MyBatis的逆向工程正向工程: 先创建java实体类,由框架负责根据实体类生成数据库表。 Hibernate是支持正向工程的。 逆向工程: 先创建数据库表,有框架负责根据数据库表,反向生成如下资源:java实体类Mapper接口Mapper映射文件 MyBatis逆向工程
  逆向工程就是不难理解,我们之前都是由实体类到数据库,而逆向类就是通过数据库表生成实体类, 正向工程:先创建java实体类,有框架负责根据实体类生成数据库表。 逆向工程:先创建数据库表,有框架负责根据数据库表,反向生成java实体类java实体类Mapper接口Mapper映射文件 创建逆向工程的步骤添加依赖和插件 	 	 		org.mybatis 		mybatis 		3.5.9 	 	 	 		junit 		junit 		4.13.2 		test 	 	 	 		mysql 		mysql-connector-java 		8.0.27 	 	 	 		log4j 		log4j 		1.2.17 	    	 	 		 		 			org.mybatis.generator 			mybatis-generator-maven-plugin 			1.3.0 			 			 				 				 					org.mybatis.generator 					mybatis-generator-core 					1.3.2 				 				 				 					com.mchange 					c3p0 					0.9.2 				 				 				 					mysql 					mysql-connector-java 					8.0.27 				 			 		 	  创建MyBatis的核心配置文件<?xml version="1.0" encoding="UTF-8" ?>                                                                                                                                                                                      创建逆向工程的配置文件文件名必须是:generatorConfig.xml <?xml version="1.0" encoding="UTF-8"?>                                                                                                                                                                                                                
执行插件的generate目标   在maven中找到插件下的generate并执行它你就会发现他自动帮你生成了java的实体类! QBC   逆向工程有两个版本简单版 和 加强版   实际开发中使用的大都是加强版,可以按条件进行增删改查! 对逆向工厂的操作的相关回顾!分页插件引入依赖 com.github.pagehelper pagehelper 5.2.0 配置分页插件(在核心配置文件中)   文章来自https://www.cnblogs.com/kobedu/p/16252029.html
华为matepad10。4英寸,4128G,值得推荐一波再说这款平板之前我必须要对大家负责,这款平板4128g的是2099,但是也就在刚刚,我才发现今天发布了一款华为Matepad11,骁龙865处理器,自带鸿蒙系统,120赫兹刷新率,字节复活旗下社交APP和腾讯正面硬刚据国内媒体爆料,字节跳动即将重启此前关闭的旗下社交APP飞聊。飞聊APP在2019年5月刚上线时就遭到了腾讯的封杀。在发现用户可通过飞聊分享朋友圈拉拢客户后,仅上线不到一个小时,就iPhone12新广告再惹争议,网友吐槽还能来点有新意的东西吗曾几何时,苹果就是智能手机的风向标。几乎所有安卓厂商都在盯着iPhone,只要苹果这一代有什么新功能和新设计,下一代的安卓手机都会蜂拥而上。但是近几年,iPhone在创新上开始显得为什么拼多多上的东西如此廉价?是假货吗?原来暗藏这些套路随着我国互联网产业的发展和交通基础设施的不断完善,我国的经商产品已大大降低,所有的商家几乎都在降价销售,有些商家竟然不惜自己的部分利益,以此来吸引人气。为什么拼多多上的东西如此廉价120Hz屏双主摄55W闪充,跌至2998元,骁龙888旗舰重回低价目前价格比较便宜的骁龙888手机,怎么数也就是三款了,第一款是RedmiK40Pro手机,目前8GB128GB版售价是2999元第二款是realmeGT,目前8GB128GB版的价30天再卖20735辆,刹不住的特斯拉Model3,为何如此火爆?在今年举办的上海车展上,哪个品牌最出风头呢?我们的答案一定是特斯拉。作为一个致力于新能源的未来汽车品牌,特斯拉在今年上海车展上可谓是一炮走红,车主车顶维权负责人态度强硬等话题,可以美团打车App上线,时隔两年重出江湖中华网财经7月11日讯,在2019年5月下架的美团打车应用,于2021年7月9日重新在手机应用商店上线。此次新版美团打车App,采用了黄黑相间的全新Logo。截至发稿,美团打车已经滴滴APP全面下架,国家利益不容半点触碰关于25款滴滴APP下架,在这里说一声,太好了,一些人为了个人的商业利益,不惜损害祖国的利益,人民的利益。政府对他们的打击太解气了,而滴滴赴美上市,趁着百年庆偷偷摸摸的,只是为了不第四次工业革命已经到来一直从事代工行业。最近在和家人一起选车。从中有很多思考。目前选车,都在往电动化,智能化方向靠拢。感觉现在在一个很关键的时刻。一不小心就选错了。最近看上比亚迪的DMi系列。从中看到车vivos10看起来预约很成功?为什么vivo最近的手机都很成功?vivos10要发布了,一加的nord2也要发布了,当然两个产品其实定位会差不多,但是看情况,vivo的s10比预期火爆,原因就是,因为看起来这部手机现在预约已经超过12万了?当然冷门却表现不错的四款手机,都怪影响力不够,不然会翻身哈喽大家好,我是你们的老朋友小馨,每天都会给大家更新我的原创内容,今天给大家推荐几款比较冷门但实力还不错的手机。第一款三星S20FE三星S20FE的实力还是比较强的,比如在性能上搭
怎么才算国有资产流失?司马南质疑联想质疑柳传志的话题,最近在网上是越来越热,网友们也是一边倒的支持司马南,要联想给出交代。最近网上出现了一波人,出来为联想洗白,好像引发了蝴蝶效应,而后又有大量的自媒体站手机号的前生郁晶陶你知道吗,手机号可能有前生,或许还会给新主人带来不小的困扰。这是因为老用户停用或弃用手机号后,运营商收回并空置一段时间,会再次投放市场给新用户选购。但一些用户在使用这样的二手共享单车造成的浪费谁来买单?盲目跟风,共享单车造成的浪费谁来买单要是从投资者的角度看,不仅是共享单车,任何行业的浪费最后都是投资者来买单!谁投的钱,浪费了,肯定是投钱的人买单,不然谁会帮你买单?但确实还是有倒经济周期你为什么赚不到钱?在过去的一年当中我们在互联网的时代经历了很多,国家各种各样政策的出台,比如双减政策三胎政策养老政策等,各种各样的政策,大家有没有想过一个问题,各种各样政策的出台,跟我们有什么关系呢网暴入刑如何有效落地近期,关于刘学州的事件,社会一直在进行反思,可以说这是网络暴力背景下的一个悲剧,带给很多人思考。网络暴力是一种社会现象,既然是社会现象,就不是单靠某一内容平台或者单靠互联网行业能解JVM垃圾回收怎么样JVM的自动内存管理,让原本应该是开发人员去做的事情,变成了垃圾回收器来做的事情既然是别人帮忙做的事情,那么可能就不是自己想要的,所以就需要我们了解一下垃圾回收相关的内容引用计数法互联网伦理信息时代的道德重构读后感互联网伦理信息时代的道德重构由美国作家迈克尔J奎因所著。该书围绕科技互联网伦理三个话题,探讨了在互联网背景下,信息传播者所要面临的伦理问题与道德抉择。全书引用大量案例,其中包括条件去年预亏4853亿元,极狐销量疲软,北汽蓝谷低迷不振记者周纯粼编辑1月29日,北汽蓝谷新能源科技股份有限公司发布2021年年度业绩预亏的公告。公告内容显示,北汽蓝谷预计2021年年度归属于上市公司股东的净利润亏损48亿元到53亿元。最新版微信重大变更支付消失!已改为服务,什么情况?最近更新了微信版本的用户,有没有发现一些新变化。以笔者为例,意外发现我之中的支付没了,取而代之的是名为服务的入口。点开服务,除了有传统的收付款查看钱包余额,还有金融理财生活服务交通如果小行星撞击地球会发生什么?根据太空岩石的大小,小行星撞击可能是灭绝级别的事件,研究人员已经创建了模拟来看看它可能有多糟糕。如果小行星撞击地球会发生什么?如果您看过Netflix电影别抬头,您可能会担心潜在的从零开始码后台管理系统权限表设计前后台可以正式接通以后,我们就可以设计基础的几个数据库表了,菜单表角色表用户表角色菜单表和用户角色表,有这5个表我们就可以搞定用户权限。因为要开始涉及数据库操作,每个表的单表操作我