目录
一,mybatis动态sql
1.if:条件语句
2.foreach
imp代码层:
与xml代码对应mapper:
在biz层写入相应的代码:
进行测试:
运行结果:
完整代码xml:
<select id="selectByIn" resultMap="BaseResultMap" parameterType="java.lang.Integer" >
select
<include refid="Base_Column_List" />
from t_mvc_book
where bid in
<foreach collection="bookIds" open="(" close= ")" separator="," item="bid">
#{bid}
</foreach>
</select>
二,模糊查询
1.#{...}
mapper:
biz:
impl:
测试:
测试结果:#{...}用的是?(占位符)
2.${...}
mapper:
biz:
impl:
测试:
测试结果:${...}防sql注入
3.Concat
mapper:
biz:
impl:
测试:
测试结果:常用的方法为concat ------> concat(concat('%',?),'%')----->%?%
由上面的结果可得:
注意:#{...}自带引号,用占位符赋值,${...}有sql注入的风险
完整代码:
xml:
<select id="selectBooksLike1" resultType="com.ruojuan.model.book" parameterType="java.lang.String">
select * from t_mvc_book where bname like #{bname}
</select>
<select id="selectBooksLike2" resultType="com.ruojuan.model.book" parameterType="java.lang.String">
select * from t_mvc_book where bname like '${bname}'
</select>
<select id="selectBooksLike3" resultType="com.ruojuan.model.book" parameterType="java.lang.String">
select * from t_mvc_book where bname like concat(concat('%',#{bname}),'%')
</select>
Mapper:
List<book> selectBooksLike1(@Param("bname") String bname);
List<book> selectBooksLike2(@Param("bname") String bname);
List<book> selectBooksLike3(@Param("bname") String bname);
biz:
public List<book> selectBooksLike1( String bname);
public List<book> selectBooksLike2( String bname);
public List<book> selectBooksLike3( String bname);
impl:
@Override
public List<book> selectBooksLike1(String bname){
return bookMapper.selectBooksLike1(bname);
};
@Override
public List<book> selectBooksLike2(String bname){
return bookMapper.selectBooksLike2(bname);
};
@Override
public List<book> selectBooksLike3(String bname){
return bookMapper.selectBooksLike3(bname);
};
test测试:
@Test
public void selectBooksLike1() {
bookBiz.selectBooksLike1("%圣墟%").forEach(System.out::println);
}
@Test
public void selectBooksLike2() {
bookBiz.selectBooksLike2("%圣墟%").forEach(System.out::println);
}
@Test
public void selectBooksLike3() {
bookBiz.selectBooksLike3("圣墟").forEach(System.out::println);
}
三,查询返回结果集的处理
1.resultMap
适合使用返回值是自定义实体类的情况
2.resultType
适合使用返回值的数据类型是非自定义的,即jdk的提供的类型
注意事项:使用resultMap返回自定义类型集合
使用resultType返回List<T>
使用resultType返回单个对象
使用resultType返回List<Map>,适用于多表查询返回结果集
使用resultType返回Map<String,Object>,适用于多表查询返回单个结果集
xml:
<select id="list1" resultMap="BaseResultMap">
select * from t_mvc_book
</select>
<select id="list2" resultType="com.ruojuan.model.book">
select * from t_mvc_book
</select>
<select id="list3" resultType="com.ruojuan.model.book" parameterType="com.ruojuan.model.BookVo">
select * from t_mvc_book where bid in
<foreach collection="bookIds" open="(" close=")" separator="," item="bid">
#{bid}
</foreach>
</select>
<select id="list4" resultType="java.util.Map">
select * from t_mvc_book
</select>
<select id="list5" resultType="java.util.Map" parameterType="java.util.Map">
select * from t_mvc_book where bid = #{bid}
</select>
mapper:
//list1 list2的结论是 ,对于单表查询而言,可以用resultmap/resultType接收,但是多表必须用resultmap接收
List<book> list1();
List<book> list2();
//如果要传入多个查询参数,必须以对象的方式进行传递
List<book> list3(BookVo vo);
// 使用resultType返回List<Map>,适用于多表查询返回结果集
List<Map> list4();
// 使用resultType返回Map<String,Object>,适用于多表查询返回单个结果集
Map list5(Map map);
//利用第三方插件进行分页
List<Map> listPager(Map map);
biz:
List<book> list1();
List<book> list2();
List<book> list3(BookVo vo);
List<Map> list4();
Map list5(Map map);
impl:
@Override
public List<book> list1(){
return bookMapper.list1();
}
@Override
public List<book> list2(){
return bookMapper.list2();
}
@Override
public List<book> list3(BookVo vo){
return bookMapper.list3(vo);
}
@Override
public List<Map> list4(){
return bookMapper.list4();
}
@Override
public Map list5(Map map){
return bookMapper.list5(map);
}
test测试类:
@Test
public void list1() {
bookBiz.list1().forEach(System.out::println);
}
@Test
public void list2() {
bookBiz.list2().forEach(System.out::println);
}
@Test
public void list3() {
BookVo vo = new BookVo();
vo.setBookIds(Arrays.asList(new Integer[]{31,32,33,34}));
bookBiz.list3(vo).forEach(System.out::println);
}
@Test
public void list4() {
bookBiz.list4().forEach(System.out::println);
}
@Test
public void list5() {
Map map = new HashMap();
map.put("bid",32);
System.out.println(bookBiz.list5(map));
}
测试结果:
四,分页查询
1.为什么要重写mybatis的分页
Mybatis的分页功能很弱,它是基于内存的分页(查出所有记录再按偏移量offset和边界limit取结果),在大数据量的情况下这样的分页基本上是没有用的
2.使用分页插件的步骤
- 导入pom依赖
- Mybatis.cfg.xml配置拦截器
- 使用PageHelper进行分页
- 处理分页结果
Pom依赖
<dependency> |
Mybatis.cfg.xml配置拦截器
<plugins> |
使用分页插件
<select id="listPager" resultType="java.util.Map" parameterType="java.util.Map"> |
Mapper层
List<Map> listPager(Map map); |
Service层
List<Map> listPager(Map map, PageBean pageBean); |
@Override |
五,特殊字符处理
>(>) <(<) &(&) 空格( ) <![CDATA[ <= ]]> |
相关代码配置
<select id="list6" resultType="com.javaxl.model.Book" parameterType="com.javaxl.model.BookVo"> |
/** |