上篇文章简单分享了MyBatis的入门,这次就来分享Mybatis的动态SQL和分页。
我们自动生成的增删改查方法,跟之前自定义MVC还是不一样的。同样的增加方法在自定义MVC中是这样的。
Insert into t_mvc_book(id,name,price) values(?,?,?)
我们要传三个参数。假设id不为自动增长,name = zs, price = 11;那么id就为null。
而mybatis自动生成的就有所不同。
- <trim prefix="(" suffix=")" suffixOverrides="," >
- <if test="bid != null" >
- bid,
- if>
- <if test="bname != null" >
- bname,
- if>
- <if test="price != null" >
- price,
- if>
- trim>
在MyBatis生成的方法中,用到了if标签,判断该字段是否为null,如果该字段为空,就不会拼接该字段。
例如:id为空,其他不为空。SQL语句是
Insert into t_mvc_book(name,price) values(?,?)
我们查询时,会有查询数据库中在某个集合中的内容。
例如 selec from t_mvc_book where bid in(31,32,33,34)之类的。
如果用for循环或者foreach将数组转变为字符串
或许会用以下方式
public void test3(){ int[] ints = {1,2,3,4,5,6}; // 将数组转成字符串 StringBuffer sb = new StringBuffer(); for (int i:ints){ sb.append(i); sb.append(","); } System.out.println(sb); }明显多了一个逗号。或许在分割一下就OK了
而mybatis中的foreach标签就不一样啦。
- // 如果参数 为非实体类 记得 加注解
- List
selectByIn(@Param("bookIds") List bookIds);
- <select id="selectByIn" resultMap="BaseResultMap" parameterType="java.util.List" >
- select
- <include refid="Base_Column_List" />
- from t_mvc_book
- where bid in
- <foreach collection="bookIds" open="(" close=")" separator="," item="bid">
- #{bid}
- foreach>
- select>
- @Test
- public void selectByIn() {
- bookBiz.selectByIn(Arrays.asList(new Integer[]{31,32,33,34})).forEach(System.out::println);
- }
同样是数组变字符串,我们将数组放在collection中,separator中放分割符.
运行看一下效果。
注意:#{...}自带引号,${...}有sql注入的风险
- <select id="selectBooksLike1" resultType="com.zhw.model.Book" parameterType="java.lang.String">
- select * from t_mvc_book where bname like #{bname}
- select>
测试一下:
- @Test
- public void selectBooksLike1() {
- bookBiz.selectBooksLike1("%圣墟%").forEach(System.out::println);
- }
- <select id="selectBooksLike2" resultType="com.zhw.model.Book" parameterType="java.lang.String">
- select * from t_mvc_book where bname like '${bname}'
- select>
测试一下:
- @Test
- public void selectBooksLike2() {
- bookBiz.selectBooksLike2("%圣墟%").forEach(System.out::println);
- }
- <select id="selectBooksLike3" resultType="com.zhw.model.Book" parameterType="java.lang.String">
- select * from t_mvc_book where bname like concat('%',#{bname},'%')
- select>
测试一下:
- @Test
- public void selectBooksLike2() {
- bookBiz.selectBooksLike3("圣墟").forEach(System.out::println);
- }
能用#{}就不用${},但是第三种更符合实际应用,传参的拼接上%%和直接传参我觉得还是直接传更好。
适合使用返回值是自定义实体类的情况
- <select id="selectByIn" resultMap="BaseResultMap" parameterType="java.util.List" >
- select
- <include refid="Base_Column_List" />
- from t_mvc_book
- where bid in
- <foreach collection="bookIds" open="(" close=")" separator="," item="bid">
- #{bid}
- foreach>
- select>
适合使用返回值的数据类型是非自定义的,即jdk的提供的类型
- <select id="selectByIn" resultType="com.zhw.model.Book" parameterType="java.util.List" >
- select
- <include refid="Base_Column_List" />
- from t_mvc_book
- where bid in
- <foreach collection="bookIds" open="(" close=")" separator="," item="bid">
- #{bid}
- foreach>
- select>
在查询单表的情况下 resultType,resultMap都能用
- <select id="list3" resultType="com.zhw.model.Book" parameterType="com.zhw.model.BookVo">
- select * from t_mvc_book where bid in
- <foreach collection="bookIds" open="(" close=")" separator="," item="bid">
- #{bid}
- foreach>
- select>
- @Test
- public void list3() {
- BookVo vo = new BookVo();
- vo.setBookIds(Arrays.asList(new Integer[]{31,32,33,34}));
- bookBiz.list3(vo);
- }
适用于多表查询返回结果集
- <select id="list4" resultType="java.util.Map">
- select * from t_mvc_book
- select>
- @Test
- public void list4() {
- bookBiz.list4().forEach(System.out::println);
- }
适用于多表查询返回单个结果集
- <select id="list5" resultType="java.util.Map" parameterType="java.util.Map">
- select * from t_mvc_book where bid = #{bid}
- select>
- @Test
- public void list5() {
- Map map = new HashMap();
- map.put("bid",32);
- System.out.println(bookBiz.list5(map));
- }
不论返回的是集合还是单条数据,都用单条数据的类型
- <dependency>
- <groupId>com.github.pagehelpergroupId>
- <artifactId>pagehelperartifactId>
- <version>5.1.2version>
- dependency>
- <plugins>
-
- <plugin interceptor="com.github.pagehelper.PageInterceptor">
- plugin>
- plugins>
- <select id="listPager" resultType="java.util.Map" parameterType="java.util.Map">
- select * from t_mvc_book where bname like concat(concat('%',#{bname}),'%')
- select>
- <select id="listPager" resultType="java.util.Map" parameterType="java.util.Map">
- select * from t_mvc_book where bname like concat(concat('%',#{bname}),'%')
- select>
- public List
- if(pageBean != null && pageBean.isPagination()){
- PageHelper.startPage(pageBean.getPage(),pageBean.getPage());
- }
-
- List
-
- if(pageBean != null && pageBean.isPagination()){
- PageInfo info = new PageInfo(maps);
- pageBean.setTotal(info.getTotal()+"");
- }
- return maps;
- }
- public void listPager() {
- Map map = new HashMap();
- map.put("bname","圣墟");
- PageBean pageBean = new PageBean();
- pageBean.setPage(2);
- pageBean.setRows(20);
-
- bookBiz.listPager(map,pageBean).forEach(System.out::println);
- }
- <select id="list6" resultType="com.zhw.model.Book" parameterType="com.zhw.model.BookVo">
- select * from t_mvc_book
- <where>
- <if test="null != min and min != ''">
-
- if>
- <if test="null != max and max != ''">
- price ]]>
- if>
- where>
- select>
-
被CDATA包裹的特殊字符,都会被转义成SQL语句中的字符
list6
- @Test
- public void list6() {
- BookVo vo = new BookVo();
- vo.setMax(45);
- vo.setMin(35);
- bookBiz.list6(vo).forEach(System.out::println);
- }
- <select id="list7" resultType="com.zhw.model.Book" parameterType="com.zhw.model.BookVo">
- select * from t_mvc_book
- <where>
- <if test="null != min and min != ''">
-
- if>
- <if test="null != max and max != ''">
-
- if>
- where>
- select>
list7
- @Test
- public void list7() {
- BookVo vo = new BookVo();
- vo.setMax(45);
- vo.setMin(35);
- bookBiz.list7(vo).forEach(System.out::println);
- }