mybatis的动态SQL和模糊查询实例详解
现在以一个例子来介绍mybatis的动态SQL和模糊查询:通过多条件查询用户记录,条件为姓名模糊匹配,并且年龄在某两个值之间。
新建表d_user:
createtabled_user( idintprimarykeyauto_increment, namevarchar(10), ageint(3) ); insertintod_user(name,age)values('Tom',12); insertintod_user(name,age)values('Bob',13); insertintod_user(name,age)values('Jack',18);
建表成功:
新建实体类User:
publicclassUser{ privateIntegerid; privateStringname; privateIntegerage; //gettersandsetters @Override publicStringtoString(){ return"User[id="+id+",name="+name+",age="+age+"]"; } publicUser(Integerid,Stringname,Integerage){ super(); this.id=id; this.name=name; this.age=age; } publicUser(){ super(); } }
创建查询条件实体类ConditionUser:
publicclassConditionUser{ privateStringname; privateintminAge; privateintmaxAge; //gettersandsetters publicConditionUser(Stringname,intminAge,intmaxAge){ super(); this.name=name; this.minAge=minAge; this.maxAge=maxAge; } publicConditionUser(){ super(); } }
新建映射文件userMapper.xml:
SELECT*FROMd_userWHEREage>=#{minAge}ANDage<=#{maxAge} ANDnameLIKECONCAT(CONCAT('%',#{name}),'%')
编写测试类:
publicclassTest{ privateSqlSessionFactorysessionFactory; privateSqlSessionsession; @Before publicvoidinit(){ //读取配置文件 Stringresource="conf.xml"; InputStreamis=this.getClass().getClassLoader().getResourceAsStream(resource); //创建SqlSessionFactory和SqlSession sessionFactory=newSqlSessionFactoryBuilder().build(is); session=sessionFactory.openSession(); } @After publicvoidfree(){ session.commit(); session.close(); } @org.junit.Test publicvoidgetUser(){ Stringstatement="com.mybatis.test7.userMapper"+".getUser"; ConditionUserconditionUser=newConditionUser("o",13,18); Listlist=session.selectList(statement,conditionUser); System.out.println(list); } }
运行结果:
注意:
1.在配置文件中编写sql语句时,为防止大于号和小于号在表示大小关系和表示标签符号之间产生混淆,所以通常用>;和<;来代替sql语句中大于号和小于号。
2.在SQL语句中添加动态SQL标签if的原因是,当在后台获取的name属性值为null时,防止生成wherenamelike%null%的条件判断语句,正确的逻辑应该是,当传来的name属性值为null时,取消此筛选条件,即不使用wherenamelike?的判断条件。在mybatis中,可用的动态SQL标签有:if,choose(when,otherwise),trim(where,set),foreach。
3.在使用模糊查询时,拼接%+#{name}+%的方法有如下几种:
(1).像上述例子中一样,在SQL语句中使用CONCAT关键字。
(2).使用${}代替#{}:
SELECT*FROMd_userWHEREage>=#{minAge}ANDage<=#{maxAge} ANDnameLIKE'%${name}%'
注意,默认情况下,使用#{}语法,MyBatis会产生PreparedStatement语句,并且安全地设置PreparedStatement参数,这个过程中MyBatis会进行必要的安全检查和转义。例如:
执行SQL:select*fromempwherename=#{employeeName}
参数:employeeName=>Smith
解析后执行的SQL:select*fromempwherename=?
执行SQL:Select*fromempwherename=${employeeName}
参数:employeeName传入值为:Smith
解析后执行的SQL:Select*fromempwherename=Smith
综上所述,${}方式可能会引发SQL注入的问题,同时也会影响SQL语句的预编译,所以从安全性和性能的角度出发,应尽量使用#{}。当需要直接插入一个不做任何修改的字符串到SQL语句中,例如在ORDERBY后接一个不添加引号的值作为列名,这时候就需要使用${}。
(3).在程序中拼接。
总结
到此这篇关于mybatis的动态SQL和模糊查询的文章就介绍到这了,更多相关mybatis动态SQL模糊查询内容请搜索毛票票以前的文章或继续浏览下面的相关文章希望大家以后多多支持毛票票!
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。