当前位置: 首页 > news >正文

无锡网站制作的公司有哪些重庆本地生活平台

无锡网站制作的公司有哪些,重庆本地生活平台,不用代码的网站建设,昆明cms建站模板目录 一、引言 二、MyBatis动态SQL 2.1.if元素使用 2.2.foreach元素使用 三、MyBatis模糊查询 ①使用#{字段名} ②使用${字段名} ③使用concat{%,#{字段名},%} 总结 四、MyBatis结果映射 4.1.案例演示 4.1.1.resultType进行结果映射 4.1.2.resultMap进行结果映射 … 目录 一、引言 二、MyBatis动态SQL 2.1.if元素使用 2.2.foreach元素使用 三、MyBatis模糊查询 ①使用#{字段名} ②使用${字段名} ③使用concat{%,#{字段名},%} 总结 四、MyBatis结果映射 4.1.案例演示 4.1.1.resultType进行结果映射 4.1.2.resultMap进行结果映射 一、引言 在当今的软件开发环境中数据库的使用已经成为了一项基础且必不可少的技能。而在处理数据库相关的任务时SQL查询语句无疑是最为常用的工具之一。然而随着应用程序的复杂性不断增加我们往往需要编写更加复杂的SQL查询语句以满足需求。这就引出了我们今天要讨论的主题——MyBatis。 在这篇文章中我们将深入探讨MyBatis的两个重要特性动态SQL和模糊查询。动态SQL是MyBatis的一个强大功能它允许我们在XML映射文件中编写动态生成的SQL语句。模糊查询则是我们在处理大量数据时常用的一种查询方式它可以帮助我们快速地找出符合特定条件的记录。 此外我们还将讨论MyBatis的结果映射功能。结果映射是将数据库查询结果映射到Java对象的过程它是MyBatis的核心功能之一。通过结果映射我们可以将复杂的数据库表结构转换为Java中的对象使得程序的设计更加直观和简单。 掌握MyBatis的这些高级特性不仅可以提高我们的开发效率也可以让我们在面试中脱颖而出。因此无论你是已经有一定经验的开发者还是刚刚入门的学习者都值得花时间去学习和理解这些知识。在接下来的文章中我们将详细介绍这些特性的使用方法和注意事项希望对你有所帮助。 二、MyBatis动态SQL 2.1.if元素使用 在以往的编写中我们肯定写过这样的代码 update t_mvc_book bname?,btype?,bprice?,..... where bid? 假如我们前台jsp没有传参数bname到后台那么会怎么样 update t_mvc_book bnamenull,btype科幻小说,bprice9.9,..... where bid7 就会造成这样的结果原本我们不传递参数只是不想改变原有的字段值没成想不传反而变为null 有些人就会想那我传个参数来行不行呢行但是没必要。如果我们使用Mybatis里面的动态SQL这个问题就迎刃而解了它会把我们的sql语句变为xml的方式通过if标签判断如果为空就不会拼接判断条件里的内容。 update idupdateByPrimaryKeySelective parameterTypecom.csdn.xw.model.Book update t_mvc_bookset if testbname ! null bname #{bname,jdbcTypeVARCHAR},/ifif testprice ! null price #{price,jdbcTypeREAL},/if/setwhere bid #{bid,jdbcTypeINTEGER}/update 2.2.foreach元素使用 我们再来假设一个场景 我们写代码的过程中肯定写过对某个事物的批量删除 可能是这样遍历数组然后调用删除方法 for int id :ids       orderItemsDao.delete(id) 也可能是拼接的方式将需要删除的id做个拼接 delete from t_oa_order where id in(...) 如果是使用mybatis我们就可以这样写 select idselectByBids resultTypecom.csdn.xw.model.Book parameterTypejava.lang.Integer selectinclude refidBase_Column_List /from t_mvc_bookwhere bid inforeach collectionbids itembid open( close) separator,#{bid}/foreach/select 现在来测试一下 BookMapper ListBook selectByBids(Param(bids) List bids); BookBiz ListBook selectByBids(List bids); BookBizImpl Overridepublic ListBook selectByBids(List bids) {return bookMapper.selectByBids(bids);} demo测试类 Testpublic void selectByBids() {System.out.println(测试的查询的方法);ListInteger integers Arrays.asList(new Integer[]{55, 56, 57, 58});bookBiz.selectByBids(integers).forEach(System.out::println);} 测试结果 三、MyBatis模糊查询 为了突出我们的效果展示我们增加一个配置文件log4j2.xml ?xml version1.0 encodingUTF-8?!-- status : 指定log4j本身的打印日志的级别.ALL Trace DEBUG INFO WARN ERROR FATAL OFF。 monitorInterval : 用于指定log4j自动重新配置的监测间隔时间单位是s,最小是5s. -- Configuration statusWARN monitorInterval30Properties!-- 配置日志文件输出目录 ${sys:user.home} --Property nameLOG_HOME/root/workspace/lucenedemo/logs/Propertyproperty nameERROR_LOG_FILE_NAME/root/workspace/lucenedemo/logs/error/propertyproperty nameWARN_LOG_FILE_NAME/root/workspace/lucenedemo/logs/warn/propertyproperty namePATTERN%d{yyyy-MM-dd HH:mm:ss.SSS} [%t-%L] %-5level %logger{36} - %msg%n/property/PropertiesAppenders!--这个输出控制台的配置 --Console nameConsole targetSYSTEM_OUT!-- 控制台只输出level及以上级别的信息(onMatch),其他的直接拒绝(onMismatch) --ThresholdFilter leveltrace onMatchACCEPTonMismatchDENY /!-- 输出日志的格式 --!-- %d{yyyy-MM-dd HH:mm:ss, SSS} : 日志生产时间 %p : 日志输出格式 %c : logger的名称%m : 日志内容即 logger.info(message) %n : 换行符 %C : Java类名 %L : 日志输出所在行数 %M: 日志输出所在方法名 hostName : 本地机器名 hostAddress : 本地ip地址 --PatternLayout pattern${PATTERN} //Console!--文件会打印出所有信息这个log每次运行程序会自动清空由append属性决定这个也挺有用的适合临时测试用 --!--append为TRUE表示消息增加到指定文件中false表示消息覆盖指定的文件内容默认值是true --File namelog fileNamelogs/test.log appendfalsePatternLayoutpattern%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n //File!-- 这个会打印出所有的info及以下级别的信息每次大小超过size 则这size大小的日志会自动存入按年份-月份建立的文件夹下面并进行压缩作为存档 --RollingFile nameRollingFileInfo fileName${LOG_HOME}/info.logfilePattern${LOG_HOME}/$${date:yyyy-MM}/info-%d{yyyy-MM-dd}-%i.log!--控制台只输出level及以上级别的信息onMatch其他的直接拒绝onMismatch --ThresholdFilter levelinfo onMatchACCEPTonMismatchDENY /PatternLayoutpattern%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n /Policies!-- 基于时间的滚动策略interval属性用来指定多久滚动一次默认是1 hour。 modulatetrue用来调整时间比如现在是早上3aminterval是4那么第一次滚动是在4am接着是8am12am...而不是7am. --!-- 关键点在于 filePattern后的日期格式以及TimeBasedTriggeringPolicy的interval 日期格式精确到哪一位interval也精确到哪一个单位 --!-- log4j2的按天分日志文件 : info-%d{yyyy-MM-dd}-%i.log --TimeBasedTriggeringPolicy interval1modulatetrue /!-- SizeBasedTriggeringPolicy:Policies子节点 基于指定文件大小的滚动策略size属性用来定义每个日志文件的大小. --!-- SizeBasedTriggeringPolicy size2 kB / --/Policies/RollingFileRollingFile nameRollingFileWarn fileName${WARN_LOG_FILE_NAME}/warn.logfilePattern${WARN_LOG_FILE_NAME}/$${date:yyyy-MM}/warn-%d{yyyy-MM-dd}-%i.logThresholdFilter levelwarn onMatchACCEPTonMismatchDENY /PatternLayoutpattern%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n /PoliciesTimeBasedTriggeringPolicy /SizeBasedTriggeringPolicy size2 kB //Policies!-- DefaultRolloverStrategy属性如不设置则默认为最多同一文件夹下7个文件这里设置了20 --DefaultRolloverStrategy max20 //RollingFileRollingFile nameRollingFileError fileName${ERROR_LOG_FILE_NAME}/error.logfilePattern${ERROR_LOG_FILE_NAME}/$${date:yyyy-MM}/error-%d{yyyy-MM-dd-HH-mm}-%i.logThresholdFilter levelerror onMatchACCEPTonMismatchDENY /PatternLayoutpattern%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n /Policies!-- log4j2的按分钟 分日志文件 : warn-%d{yyyy-MM-dd-HH-mm}-%i.log --TimeBasedTriggeringPolicy interval1modulatetrue /!-- SizeBasedTriggeringPolicy size10 MB / --/Policies/RollingFile/Appenders!--然后定义logger只有定义了logger并引入的appenderappender才会生效 --Loggers!--过滤掉spring和mybatis的一些无用的DEBUG信息 --logger nameorg.springframework levelINFO/loggerlogger nameorg.mybatis levelINFO/logger!-- 第三方日志系统 --logger nameorg.springframework levelERROR /logger nameorg.hibernate levelERROR /logger nameorg.apache.struts2 levelERROR /logger namecom.opensymphony.xwork2 levelERROR /logger nameorg.jboss levelERROR /!-- 配置日志的根节点 --root levelallappender-ref refConsole /appender-ref refRollingFileInfo /appender-ref refRollingFileWarn /appender-ref refRollingFileError //root/Loggers/Configuration log4j2.xml文件应该位于项目的类路径根目录下即src/main/resources目录中。 小贴士 Log4j2的配置文件用于配置日志输出的格式、级别、目标等信息。Log4j2不再支持Log4j 1.x中的.properties文件的配置方式而是支持通过json、xml或者jsn的方式进行配置。 具体来说log4j2.xml文件中包含了以下几个部分 Configuration配置信息区域包括Appenders、Loggers等。Appender输出目标区域包括控制台、文件、数据库等。Logger日志记录区域包括包名、类名、日志级别等。 在MyBatis中有三种模糊查询的方法分别是 ①使用#{字段名} select idlike1 resultTypecom.csdn.xw.model.Book parameterTypejava.lang.String selectinclude refidBase_Column_List /from t_mvc_bookwhere bname like #{bname}/select 测试结果  ②使用${字段名} select idlike2 resultTypecom.csdn.xw.model.Book parameterTypejava.lang.String selectinclude refidBase_Column_List /from t_mvc_bookwhere bname like ${bname}/select 测试结果   ③使用concat{%,#{字段名},%} select idlike3 resultTypecom.csdn.xw.model.Book parameterTypejava.lang.String selectinclude refidBase_Column_List /from t_mvc_bookwhere bname like concat(%,#{bname},%) /select 测试结果  总结 想必你也看出了这三种的不同之处下面我来给你总结一下。 mybatis中的$与#的区别 ①$是占位符传参#是预处理SQL ②外在形式$传参不带引号#自带引号 可能你还没感受到有没有引号没什么太大的区别下面我来给你演示一下 假如我要根据部门编号查出该部门的所有人员信息利用$与#来做测试 #:select*from t_oa_employee where deptid#{deptid}         select*from t_oa_employee where deptid10011 $:select*from t_oa_employee where deptid${deptid}           select*from t_oa_employee where deptid10011 这么一看好像确实没有什么区别那如果前台恶意传参呢 http://localhost:8080/employee?deptid10011 or 11 那这样不就把全公司的人员信息都查出来了 ③$传参存在sql注入#不存在 ④$可以做动态列完成动态sql的开发 我们开发过程中肯定有遇到过当前字段不满足我们需求然后我们修改数据库字段的时候如果改成正确还好如果错误那就芭比Q了动态列就可以做到传入的参数当作需要查询的列来操作例如 假设我们有一个表名为user_info包含字段id、name、age、gender等现在需要根据传入的参数来动态生成查询的列可以使用如下的语句 select idgetUserInfo resultTypemapSELECT ${columnName}, ${columnAge}, ${columnGender}FROM user_info /select其中columnName、columnAge、columnGender分别代表需要查询的列名可以在Java代码中定义一个Map变量将列名作为key对应的值作为value传入即可。例如 MapString, Object columnMap new HashMap(); columnMap.put(columnName, name); columnMap.put(columnAge, 18); columnMap.put(columnGender, 男);然后将columnMap传入MyBatis的mapper中调用即可。 最后小编还是建议大家一般能用 # 的就别用 $ 最常用的还是第三种。 四、MyBatis结果映射 在使用MyBatis中拥有多个场景返回的结果是多样的resultType/resultMap ①返回单表的对应的实体类仅有一个查询结果可以用resultType/resultMap。 ②返回单表的对应的实体类有多个查询结果可以用resultType/resultMap。 ③返回多表对应结果仅有一个查询结果通常用resultType也可以用resultMap。 ④返回多表对应结果有多个查询结果通常用resultType也可以用resultMap。 ⑤返回单个列段仅有一个查询结果就用resultType。 ⑥返回单个列段有多个查询结果就用resultType。 总结就是在Mybatis中结果集的处理分为两种 resultMap适合使用返回值是自定义实体类的情况 resultType适合使用返回值的数据类型是非自定义的即jdk的提供的类型 如果是单表的情况下resultType与resultMap都可以使用。 1 使用resultMap返回映射关系指的是实体类与数据库字段的关系 2 使用resultType返回ListT 3 使用resultType返回单个对象 4 使用resultType返回ListMap【适用于多表查询返回结果集】 5 使用resultType返回MapString,Object【适用于多表查询返回单个结果集】 4.1.案例演示 4.1.1.resultType进行结果映射 假设我们有一个用户表user包含以下字段id、name、age、gender、email。现在需要根据这些字段查询用户信息并返回一个User对象。 首先我们需要定义一个User类用于存储查询结果 public class User {private int id;private String name;private int age;private String gender;private String email;// getter和setter方法省略 }然后在MyBatis的mapper文件中我们可以使用resultType来映射查询结果到User对象上。具体配置如下 select idgetUserById resultTypecom.example.UserSELECT id, name, age, gender, emailFROM userWHERE id #{id} /select在上面的配置中我们使用了resultType属性来指定查询结果映射到的Java对象的全限定名。这样当执行查询语句时MyBatis会自动将查询结果映射到指定的Java对象上。 4.1.2.resultMap进行结果映射 假设我们有一个订单表order包含以下字段id、user_id、product_id、price、quantity。现在需要根据这些字段查询订单信息并返回一个Order对象。 首先我们需要定义一个Order类用于存储查询结果 public class Order {private int id;private int userId;private int productId;private double price;private int quantity;// getter和setter方法省略 }然后在MyBatis的mapper文件中我们可以使用resultMap来映射查询结果到Order对象上。具体配置如下 resultMap idOrderResultMap typecom.example.Orderid propertyid columnid /result propertyuserId columnuser_id /result propertyproductId columnproduct_id /result propertyprice columnprice /result propertyquantity columnquantity / /resultMapselect idgetOrderById resultMapOrderResultMapSELECT id, user_id, product_id, price, quantityFROM orderWHERE id #{id} /select在上面的配置中我们定义了一个名为OrderResultMap的resultMap它的type属性指定了要映射的Java对象的全限定名。接下来我们为每个字段指定了对应的属性名和数据库表中的列名。最后在查询语句中引用这个resultMap即可将查询结果映射到Order对象上。 需要注意的是如果查询结果中的某个字段在Java对象中没有对应的属性那么该字段将被映射为null。此外如果查询结果中的某个字段在Java对象中有多个对应的属性那么该字段的值将被映射为一个列表或数组。 到这里我的分享就结束了欢迎到评论区探讨交流 如果觉得有用的话还请点个赞吧 ♥  ♥
http://www.hkea.cn/news/14475276/

相关文章:

  • 网站设计个人心得成都手机号码销售网站建设
  • 买个个域名做网站咋做网站搭建需要的公司
  • 国内10大网站建设公司企业工商公示信息查询系统
  • 城乡建设厅官方网站工作简历模板免费下载
  • 网站建设网上商城心得体会华久网站建设
  • 广元网站建设广元重庆市沙坪坝区
  • 在线做热图的网站前端工作好找吗
  • dede网站经常被挂马 怎么办南京企业网站
  • 衡水网站seo山东展厅设计公司
  • 制作网站管理系统建站技术知识
  • 微建网站有没有网站做lol网站的
  • PHP网站建设的课后笔记flash网站动画
  • 前端网站开发课程抚州市做棋牌网站
  • 网站建设无广告广州网页设计培训教程
  • 网站建设 企业建站小程序
  • 手机网站跳转怎么办wordpress怎么上传图片
  • 阜阳网站建设工作室做网站需要有公司吗
  • 网站设计 字体的搭配攀枝花建设集团网站
  • 做网站42类商标怎么选小类杭州网站 建设
  • 网站设计市场价佛山seo优化电话
  • 文登住房与建设局网站开网店货源怎么弄
  • 网站快速排名优化报价天津建设信息工程
  • 从做网站可以用现在的名称吗青岛开发区网站建设哪家好
  • 精美网页源码网站网站管理助手3.0
  • 如何做类似千图网的网站网站后台图片编辑器
  • 网站加产品分类网页制作基础教程ppt
  • seo于刷网站点击长春网站制作方案定制
  • 乐清站在哪苏州调查公司有哪些
  • 网站建设与管理书网站怎么添加软件
  • ps做好的网站如何做链接免费搭建网站主机