当前位置: 首页 > 后端技术 > Java

Java开发SSM框架集成MyBatis动态SQL

时间:2023-04-01 19:58:58 Java

元素动态SQL通常做的就是在java训练中有条件地包含where子句的一部分。所以在MyBatis中,元素是最常用的元素。它类似于Java中的if语句。在ch8应用程序中,测试元素。具体过程如下:本节继续沿用上一章的例子。在com.mybatis包的UserMapper.xml文件中,添加如下SQL映射语句:select*fromuserwhere1=1andunamelikeconcat('%',#{uname},'%')andusex=#{usex}这个元素使用POJO类MyUser。所以SQL语句中#{uname}和#{usex}的值都是MyUser.uname。在构造动态sql语句时,为了防止sql语句结构不当,加上where1=1,这样sql语句就不会报错了,背后的逻辑也很简单,判断#{usex}不为空且不为""是时候添加SQL了。对应的Dao接口:publicListselectUserByIf(MyUseruser);测试控制器://使用if元素查询用户信息ifmu);System.out.println("ifelement================");for(MyUsermyUser:listByif){System.out.println(myUser);}测试结果:我们尽量不设置#{uname}的值,看看SQL语句是否拼接正确:,,元素有些时候,不想全部使用条件语句,但只需选择一个或两个。针对这种情况,MyBatis提供了choose元素,有点像Java中的switch语句。映射语句如下:select*fromuserwhere1=1andunamelikeconcat('%',#{uname},'%')andusex=#{usex}anduid>10元素是switch语句,是这样的语句,是默认语句。还需要注意的是,当一个元素条件满足时,其他元素和都不会执行,直接结束整个元素。Dao接口:publicListselectUserByChoose(MyUseruser);Controller中测试://使用choose元素查询用户信息MyUserchoosemu=newMyUser();choosemu.setUname("");choosemu.setUsex("");ListlistByChoose=userDao.selectUserByChoose(choosemu);System.out.println("选择元素================");for(MyUsermyUser:listByChoose){System.out.println(myUser);}在我们的例子中,传入的uname和usex为空,所以执行了元素中的语句,如图:我们这次尝试传一个usex看看语句是如何执行的://使用choose元素查询用户信息(choosemu);System.out.println("选择元素================");for(MyUsermyUser:listByChoose){System.out.println(myUser);}结果如下,当usex不为空时,只执行元素。,,元素1.元素元素的主要作用是在其包含的内容前添加一些前缀,或者在其后添加一些后缀,对应的属性为prefix和后缀;可以在内容的前半部分覆盖一些内容,即忽略,也可以在尾部覆盖一些内容。对应的属性是prefixOverrides和suffixOverrides;因为元素有这样的功能,所以用来代替元素的功能也很简单。映射语句如下:select*fromuserandunamelikeconcat('%',#{uname},'%')andusex=#{usex}表示:在整个元素的范围内,在SQL语句中添加“where”前缀,去掉“and|or”后缀。和我们第一节where1=1的意思是一样的,智能拼接SQL语句。对应的Dao接口:publicListselectUserByTrim(MyUseruser);Controller中测试://使用trim元素查询用户信息trimmu);System.out.println("修剪元素================");for(MyUsermyUser:listByTrim){System.out.println(myUser);}来自测试结果,我们可以看到Mybatis对SQL语句进行了智能拼接,添加了“where”前缀,去掉了“and”后缀。2.元素元素的作用是在元素写的地方输出一条where语句。另一个优点是它不需要考虑元素中的条件输出是什么样的。MyBatis会智能处理。如果所有的条件都不满足,MyBatis就会把所有的记录都找出来。如果输出以and开头,MyBatis会忽略第一个and。当然,如果是or开头,MyBatis也会忽略;另外,也不需要考虑元素中的空格问题。MyBatis会加入智能,可以实现智能拼接SQL语句的功能。映射语句如下:select*fromuserandunamelikeconcat('%',#{uname},'%')andusex=#{usex}在这个元素中,自动添加了where前缀,并且去掉了and后缀。Dao接口:publicListselectUserByWhere(MyUseruser);Controller的测试://使用where元素查询用户信息);System.out.println("whereelement================");for(MyUsermyUser:listByWhere){System.out.println(myUser);}结果同上一节:3、元素在动态更新语句中,可以使用元素来动态更新列。映射语句:updateuseruname=#{uname},usex=#{usex}其中uid=#{uid}在元素中,当uname不为空时,SQL语句会自动加上uname=#{uname},即传入哪一列的值不为空,更新这一列。Dao接口:publicintupdateUserBySet(MyUseruser);Controller中测试://使用set元素修改一个用户MyUsersetmu=newMyUser();setmu.setUid(1);setmu.setUname("张九");intsetup=userDao.updateUserBySet(setmu);System.out.println("setelementmodified"+setup+"record");System.out.println("=================");从运行截图可以看出,因为uname不为空,所以都修改了这一列:元素元素主要用于构建in条件,可以在SQL语句中迭代一个集合。foreach元素的属性主要有item、index、collection、open、separator、close。item表示迭代时集合中每个元素的别名,即变量名。index指定一个名称,用于表示迭代过程中每次迭代的位置,即循环索引。open表示语句以什么开头。通常在构造in时,用“(”作为拼接SQL的前缀,close表示以什么结尾,“)”作为拼接SQL的后缀,分隔符表示每次迭代之间使用什么符号作为分隔符,取决于传入参数的类型。使用时,最关键和最容易出错的属性是集合属性。该属性是强制性的,但在不同的情况下,该属性的取值是不同的。主要有以下三种情况:如果你传入的是单个参数,参数类型是List时,collection属性值为list。如果传入单个参数,参数类型为数组,则collection的属性值为array。如果传入多个参数,需要封装成一个Map。当然也可以将单个参数封装成一个Map。Map的key是参数名,collection属性值是其封装的Map中传入的List或数组对象的key,是元素实际需要遍历的值的名称.看着定义很繁琐,其实举个例子就可以说清楚了,如下。定义映射语句:select*fromuserwhereuidin#{item}parameterType="List"表示incoming的参数是List,所以collection的属性是“list”。这段代码在Java中解释为:for(intindex=0;indexselectUserByForeach(ListlistId);Controller中测试://使用foreach元素查询用户信息ListlistId=newArrayList();listId.add(1);listId.add(11);listId.add(31);System.out.println("传入参数为:"+listId);ListlistByForeach=userDao.selectUserByForeach(listId);System.out.println("foreach元素================");for(MyUsermyUser:listByForeach){System.out.println(myUser);}拼接后的SQL语句为:select*fromuserwhereuidin(?,?,?)。结果如图:补充:当传入多个参数时,即当foreach的参数为map类型时,我们有时需要多条件的查询语句,如:select*fromuserwhereusex=?而uidin(?,?,?)这样的语句中,需要向Dao中的uid接口:ListselectUserByForeachMap(HashMapmap);Controller中测试://使用foreach元素查询用户信息ListlistId=newArrayList();listId.add(1);listId.add(11);listId.add(31);HashMapmap=newHashMap();//注意这个maps对应的是元素中collection属性的值//因为我们需要id值map.put("maps",listId);map.put("usex","female");System.out.println("传入的参数为:"+map);ListlistByForeach=userDao.selectUserByForeachMap(map);System.out.println("foreachelement================");for(MyUsermyUser:listByForeach){System.out.println(myUser);}注意这个map.put("maps",列表编号);元素中的map对应collection属性的值,因为我们需要将这个id值传递给元素进行分析。map.put("usex","female")中的usex;对应SQL语句的usex=#{usex},结果图:如果元素在模糊查询时使用“${}”拼接字符串,则无法防止SQL注入问题。如果使用字符串拼接函数或连接符号,但不同数据库的拼接函数或连接符号不同,如MySQL的concat函数和连接符号“||”甲骨文。这样SQL映射文件就需要根据不同的数据库提供不同的实现,显然比较繁琐,也不利于代码的移植。幸运的是,MyBatis提供了元素来解决这个问题。映射语句:select*fromuserwhereunamelike#{paran_uname}Dao接口:publicListselectUserByBind(MyUseruser);Controller中测试://使用bind元素查询用户信息"bindelement================");for(MyUsermyUser:listByBind){System.out.println(myUser);}看看我们最终正确的字符串拼接结果:%zhang%运行截图:原作者:郝