学习动态SQL
先学习动态SQL中的if
开始干活,先在接口里面写一个方法
/Mybatis02/src/com/chen/dao/GoodsDao2.java
//动态SQL 。。。 if..
public List<GoodsInfo> queryByIf(GoodsInfo a);
/Mybatis02/config/mappers/GoodsInfoMapper.xml
<!-- 下面是动态SQL -->
<select id="queryByIf" resultType="com.chen.GoodsInfo">
select * from goods where
<if test="name !=null">
name like '${name}%'
</if>
</select>
上面这个if标签的意思是,如果你传递过来的name不为空,那么就把下面
name like '${name}%'
拼接到 where的后面去。即变成,select * from goods where name like '${name}%'
在主入口类 设置好对象的属性,以传值进去
/Mybatis02/src/test/Start2.java
package test;
import java.io.IOException;
import java.io.InputStream;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import com.chen.GoodsInfo;
import com.chen.dao.GoodsDao;
import com.chen.dao.GoodsDao2;
public class Start2 {
public static void main(String[] args) throws IOException {
String resource = "mybatis-conf.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
//创建SqlSessionFactory
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
//true表示自动提交。否则需要使用commit方法才会提交。默认是false
SqlSession session = sqlSessionFactory.openSession();
//拿到接口的代理对象
GoodsDao2 dao=session.getMapper(GoodsDao2.class);
//拿到了dao这个对象接下来就可以创建sql语句了;(直接调用接口方法)
//因为接口方法里需要传入一个对象,所以
GoodsInfo goods =new GoodsInfo();
//然后给对象插属性
goods.setId(123);
goods.setName("牛");
List list =dao.queryByIf(goods);
System.out.println(list.size());
//如果上面不设置自动提交表单,那么就需要commit方法
session.commit();
}
}
三个地方连起来就是表达了 select * from goods where name like '牛'% 这句话
点击运行,查询到结果
**因为name以牛开头的 ,数据库表里有三条,即有三个对象
现在学习动态SQL的---Choose
/Mybatis02/config/mappers/GoodsInfoMapper.xml
<select id="queryByChoose" resultType="com.chen.GoodsInfo">
<!-- 为了避免传入空值而where后没拼接语句造成的mysql语法错误,一般都是写select * from goods where 1=1 -->
select * from goods where
<choose>
<when test="name !=null">
name like '${name}%'
</when>
<when test="id !=null">
id =${id}
</when>
<otherwise>
order by name
</otherwise>
</choose>
</select>
在接口中添加一个新方法
/Mybatis02/src/com/chen/dao/GoodsDao2.java
//动态SQL 。。Choose
public List<GoodsInfo> queryByChoose(GoodsInfo a);
在主入口类 设置好对象的属性,以传值进去
/Mybatis02/src/test/Start2.java
public class Start2 {
public static void main(String[] args) throws IOException {
String resource = "mybatis-conf.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
//创建SqlSessionFactory
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
//true表示自动提交。否则需要使用commit方法才会提交。默认是false
SqlSession session = sqlSessionFactory.openSession();
//拿到接口的代理对象
GoodsDao2 dao=session.getMapper(GoodsDao2.class);
//拿到了dao这个对象接下来就可以创建sql语句了;(直接调用接口方法)
//因为接口方法里需要传入一个对象,所以
GoodsInfo goods =new GoodsInfo();
//然后给对象插属性
goods.setId(10);
goods.setName("牛");
List list =dao.queryByChoose(goods);
System.out.println(list.size());
//如果上面不设置自动提交表单,那么就需要commit方法
session.commit();
}
}
点击运行
这表示List 里面 存放着 3个对象 , 就意味这 ,查询到了 三条数据。不信,我去mysql客户端 查下
因为现在我们用的是choose标签 ,那么when 标签里写着
<when test="id !=null"> id =${id} </when>
假如我们只设置:goods.setId(10);,而把goods.setName("牛");注释掉,那么就只传入了id这个参数。然后即是相当于执行了
select * from goods where id =${id}这条语句
结果显示 只得到了一个对象,就意味着数据库查到的只有一条数据
那么现在将这条语句放mysql客户端查一下 并验证