1.动态sql
——Mybatis框架可以对sql语句进行灵活操作,通过表达式进行判断,
对sql进行灵活拼接、组装。
实现动态的主要元素
MyBatis中用于实现动态SQL的元素主要有:
if
choose(when,otherwise)
trim
where
set
foreach
2.一个动态查询语句
UserDao.xml
<?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"><mappernamespace="myBatisTest.dao.UserDao"><!--resultType可以为包加类的model对象 如果返回多条数据,他会返回一个list<UserInfo>的集合--><!--可以使用java.util.Map 但不能直接指定为java.util.List 因为返回的是一个泛型集合list<UserInfo>--><!--resultType的返回类型为POJO类型(list<UserInfo>类型)所以UserDao接口需要保持一致--><selectid="getUser"parameterType="UserInfo"resultType="UserInfo">
select * from userinfo<!--where 加入where语句 也可以在上面语句用 where 1=1之类的 --><where><!--为true则加入下面语句 test内的id是从对象UserInfo中获取的属性值--><iftest="id!=0"><!--加入了where标签如果是第一个条件,组合语句会自动去掉and-->
and id=#{id}</if><!--语句可以用and(&&)或者or(||)连接--><iftest="userName!=null and userName!=''"><!--在双引号内 需要把#改为$ ${userName}用于与%%拼接字符串 否则会出现%?%的占位符而出错-->
and username like '%${userName}%'</if></where></select></mapper>
test.java
package myBatisTest.dao;
import ....publicclass test {publicstaticvoidmain(String[] args) throws IOException, SQLException {// TODO Auto-generated method stub
InputStreamis = Resources.getResourceAsStream("myBatisTest/dao/SqlMapConfig.xml");
SqlSessionFactory sf =new SqlSessionFactoryBuilder().build(is);
SqlSession sqlSession = sf.openSession();
UserDao ud= sqlSession.getMapper(UserDao.class);//获取代理对象
List<UserInfo> ulist=ud.getUser(new UserInfo(0,"张","","",""));for (int i =0; i < ulist.size(); i++) {
System.out.println(ulist.get(i));
}
}
}
concole
UserInfo [id=51, userName=张九, password=123456, sex=男, email=23123@qq.com]
UserInfo [id=52, userName=张九, password=123456, sex=男, email=null]
UserInfo [id=53, userName=张九, password=123456, sex=男, email=null]
UserInfo [id=59, userName=张九, password=123456, sex=男, email=null]
如果设定resultType=”java.util.Map”
在接口该方法需要设定返回值为list
List<Map<String,Object>> getUserMapList(UserInfo user) throws SQLException;
输出语句
List<Map<String,Object>> ulist=ud.getUserMapList(new UserInfo(0,"张","","",""));for(Map<String,Object> user : ulist){
System.out.println(user);
}
取出的都是键值对 而且键是从数据库取的
concole
{ID=51, USERNAME=张九, PASSWORD=123456, SEX=男, EMAIL=23123@qq.com}
{ID=52, USERNAME=张九, PASSWORD=123456, SEX=男, EMAIL=null}
{ID=53, USERNAME=张九, PASSWORD=123456, SEX=男, EMAIL=null}
{ID=59, USERNAME=张九, PASSWORD=123456, SEX=男, EMAIL=null}