MyBatis之动态sql
发布时间:2020-12-15 07:10:34 所属栏目:Java 来源:网络整理
导读:如果使用JDBC或者Hibernate等ORM框架,很多时候你要根据需要去拼接sql,这是一个很麻烦的事情。而MyBatis提供对动态sql的组装能力,而且它只有为数不多的几个基本元素,简单明了,大量的判断可以在MyBatis的映射文件xml进行配置,以达到我们需要编写大量代码才
如果使用JDBC或者Hibernate等ORM框架,很多时候你要根据需要去拼接sql,这是一个很麻烦的事情。而MyBatis提供对动态sql的组装能力,而且它只有为数不多的几个基本元素,简单明了,大量的判断可以在MyBatis的映射文件xml进行配置,以达到我们需要编写大量代码才能实现的需求。动态sql减少了很多编写代码量的工作。 这从中又体现了MyBatis的优点,可配置性,灵活性和可维护性。 ? 注意该例子在MyBatis+Hibernate+JDBC分析对比的文章上基础进行的 下面进行对上述表中的例子进行演示: package cn.mybatis; import org.apache.ibatis.annotations.Param; public interface UserMapper { User getUserById(Integer Id); //注意@Param 适用场景针对于参数n<=5的情况下进行,如果参数n大于5以上建议将参数改为JavaBean User getUserByName(@Param("userName") String userName); } if演示示例: <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="cn.mybatis.UserMapper"> <!--如果一部分字段查询比较频繁,建议使用sql标签,将查询过频繁的字段放进去,这样方面管理和修改--> sql id="user"> id,user_name </sql> select ="getUserById" parameterType="Integer" resultMap="users" select include refid/> from `user` where id=#{Id} select> ? ? choosey演示示例: > <!-- Choose相当于Java中的 if(..){ }else if(..){ }else{ } otherwise这里就不做演示了,otherwise相当于否则的意思,可以说就是else 注意 在外层必须嵌套<where>标签,否则会一直显示sql错误 --> ="Map" select * from `user` where> choosewhen ="Id!=null and Id!=''" and id = #{Id} when> ="userName != null and userName != ''" and user_name = #{userName} > > > > ? 接口类 java.util.List; java.util.Map; UserMapper { User getUserByName(Map<String,Object> map); } 测试类 java.util.HashMap; org.apache.ibatis.session.SqlSession; class TestMyBatis { static void main(String[] args) { SqlSession sqlSession = null; sqlSession = MyBatisExample.getSqlSessionFactory().openSession(); UserMapper userMapper = sqlSession.getMapper(UserMapper.); User users = new User(); users.setId(1); users.setUserName(); Map<String,Object> map = new HashMap<String,1)">(); map.put("user",users); User user = userMapper.getUserByName(map); System.out.println(user.getUserName()); } } ? trim演示示例: > trim意味着去掉一些特殊字符 trim prefix表示前缀 通常加上where的话,表示已经将where写进前缀,这时就不用写where了 prefixOverrides 表示将第一個and或者or去掉 --> select id,user_name from `user` trim prefix="where" prefixOverrides="and|or"="userName!=null" and user_name = #{userName} > trim> > ? 接口类: cn.mybatis; UserMapper { User getUserByName(@Param ("userName") String userName); } ? 测试类: ); User user = userMapper.getUserByName("张飞"); System.out.println(user.getUserName()); } } ? set > <!-- ? 测试类: ; sqlSession = MyBatisExample.getSqlSessionFactory().openSession(true); UserMapper userMapper = sqlSession.getMapper(UserMapper.); User user = User(); user.setId(1); user.setUserName("张好s"); int lines =userMapper.updateUserInfo(user); if(lines==1) { System.out.println("Yes"); }else { System.out.println("No"); } } } ? foreach这里就不演示了,参照我的博文批量更新,那里写的比较详细 当然接下来还有bind,不过这个不常用,以上说的包括没说的foreach是开发过程中常用的动态sql。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |