今日内容
1.mybatis动态sql
2.模糊查询(3种方式)
3.查询返回结果集
4.分页查询
5.特殊字符处理**
1.mybatis动态sql
1.1 if
1.2 trim
1.3 foreach
1.4 choose/set/where
(代码在后面)
2.模糊查询(3种方式)
2.1 参数中直接加入%%
2.2 使用${...}代替#{...}(不建议使用该方式,有SQL注入风险)
关键:#{...}与${...}区别?
参数类型为字符串,#会在前后加单引号['],$则直接插入值
注:
1) mybatis中使用OGNL表达式传递参数
2) 优先使用#{...}
3) ${...}方式存在SQL注入风险
2.3 SQL字符串拼接CONCAT
[(MyBatis中#和$的区别)
1. #将传入的数据都当成一个字符串,会对自动传入的数据加一个双引号。
如:order by #user_id#,如果传入的值是111,那么解析成sql时的值为order by '111',
如果传入的值是id,则解析成的sql为order by "id".
2. $将传入的数据直接显示生成在sql中。
如:order by $user_id$,如果传入的值是111,那么解析成sql时的值为order by user_id,
如果传入的值是id,则解析成的sql为order by id.
3. #方式能够很大程度防止sql注入。
4. $方式无法防止Sql注入。
5. $方式一般用于传入数据库对象,例如传入表名.
6. 一般能用#的就别用$. ]
3.查询返回结果集
resultMap:适合使用返回值是自定义实体类的情况
resultType:适合使用返回值的数据类型是非自定义的,即jdk的提供的类型
3.1 使用resultMap返回自定义类型集合
3.2 使用resultType返回List<T>
3.3 使用resultType返回单个对象
* 3.4 使用resultType返回List<Map>,适用于多表查询返回结果集(常用)
无论返回单体记录,还是多条记录,mybatis会自动给你封装
* 3.5 使用resultType返回Map<String,Object>,适用于多表查询返回单个结果集(常用)
4.分页查询
为什么要重写mybatis的分页?
Mybatis的分页功能很弱,它是基于内存的分页(查出所有记录再按偏移量offset和边界limit取结果),在大数据量的情况下这样的分页基本上是没有用的
4.1 导入分页插件到pom.xml
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper</artifactId>
<version>5.1.2</version>
</dependency>
4.2 将pagehelper插件配置到mybatis中
<!-- 配置分页插件PageHelper, 4.0.0以后的版本支持自动识别使用的数据库 -->
<plugin interceptor="com.github.pagehelper.PageInterceptor">
</plugin>
4.3 在你需要进行分页的Mybatis方法前调用PageHelper.startPage静态方法即可,紧跟在这个方法后的第一个Mybatis查询方法会被进行分页
//设置分页处理
if (null != pageBean && pageBean.isPaginate()) {
PageHelper.startPage(pageBean.getCurPage(), pageBean.getPageRecord());
}
4.4 获取分页信息(二种方式)
4.4.1 使用插件后,查询实际返回的是Page<E>,而非List<E>,Page继承了ArrayList,同时还包含分页相关的信息
Page<Book> page = (Page<Book>)list;
System.out.println("页码:" + page.getPageNum());
System.out.println("页大小:" + page.getPageSize());
System.out.println("总记录:" + page.getTotal());
4.4.2 使用PageInfo
PageInfo pageInfo = new PageInfo(list);
System.out.println("页码:" + pageInfo.getPageNum());
System.out.println("页大小:" + pageInfo.getPageSize());
System.out.println("总记录:" + pageInfo.getTotal());
5.特殊字符处理
>(>) (greater then)
<(<) (less then )
&(&)
空格( )
<![CDATA[ <= ]]>
所有代码如下:
BookMapper.java
package com.zking.T211_mybais01.mapper;
import com.zking.T211_mybais01.model.Book;
import com.zking.T211_mybais01.vo.BookVo;
import java.util.List;
import java.util.Map;
public interface BookMapper {
int deleteByPrimaryKey(Integer bid);
int insert(Book record);
int insertSelective(Book record);
Book selectByPrimaryKey(Integer bid);
int updateByPrimaryKeySelective(Book record);
int updateByPrimaryKey(Book record);
/**
* 1.讲解foreach标签
* @param bookVo
* @return
*/
List<Book> foreachlist(BookVo bookVo);
/**
* 2.讲解模糊查询
* 三种方式
* @param book
* @return
*/
List<Book> selectlike(Book book);
/**
* 3.讲解 使用resultMap返回自定义类型集合
* @param book
* @return
*/
List<Book> list3(Book book);
/**
* 4.讲解 使用resultType返回List<T>
* @param book
* @return
*/
List<Book> list4(Book book);
/**
* 5.讲解 使用resultType返回List<Map>,适用于多表查询返回结果集
* 无论返回单体记录,还是多条记录,mybatis会自动给你封装
* @param book
* @return
*/
List<Map> list5();
/**
* 6.讲解 使用resultType返回Map<String,Object>,适用于多表查询返回单个结果集
* @param map
* @return
*/
Map singleOne(Map map);
/**
* 7.讲解 github提供的分页插件
*/
List<Book> pageBean(Book book);
/**
* 8.讲解 特殊字符处理
* >(>)
* <(<)
* &(&)
* 空格( )
*
* <![CDATA[ <= ]]>
*/
List<Book> list8(BookVo bookVo);
}
BookMapper.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">
<mapper namespace="com.zking.T211_mybais01.mapper.BookMapper">
<resultMap id="BaseResultMap" type="com.zking.T211_mybais01.model.Book">
<constructor>
<idArg column="bid" javaType="java.lang.Integer" jdbcType="INTEGER" />
<arg column="bname" javaType="java.lang.String" jdbcType="VARCHAR" />
<arg column="price" javaType="java.lang.Float" jdbcType="REAL" />
</constructor>
</resultMap>
<sql id="Base_Column_List">
bid, bname, price
</sql>
<select id="selectByPrimaryKey" parameterType="java.lang.Integer" resultMap="BaseResultMap">
select
<include refid="Base_Column_List" />
from t_mvc_book
where bid = #{bid,jdbcType=INTEGER}
</select>
<!--foreach标签 -->
<select id="foreachlist" parameterType="com.zking.T211_mybais01.vo.BookVo" resultType="com.zking.T211_mybais01.model.Book">
select
<include refid="Base_Column_List" />
from t_mvc_book
where bid in
<foreach collection="bookIds" item="bid" open="(" close=")" separator="," >
#{bid}
</foreach>
</select>
<!--模糊查询-->
<select id="selectlike" parameterType="com.zking.T211_mybais01.model.Book" resultType="com.zking.T211_mybais01.model.Book">
select
<include refid="Base_Column_List" />
from t_mvc_book
where bname like #{bname}
/* where bname like '${bname}'*/
</select>
<!--使用resultMap返回自定义类型集合-->
<select id="list3" parameterType="com.zking.T211_mybais01.model.Book" resultMap="BaseResultMap">
select
<include refid="Base_Column_List" />
from t_mvc_book
</select>
<!--使用resultType返回List<T>-->
<select id="list4" parameterType="com.zking.T211_mybais01.model.Book" resultType="com.zking.T211_mybais01.model.Book">
select
<include refid="Base_Column_List" />
from t_mvc_book
</select>
<!--使用resultType返回List<Map>,适用于多表查询返回结果集-->
<select id="list5" resultType="java.util.Map">
select
<include refid="Base_Column_List" />
from t_mvc_book
</select>
<!--使用resultType返回Map<String,Object>,适用于多表查询返回单个结果集
-->
<select id="singleOne" parameterType="java.util.Map" resultType="java.util.Map">
select
<include refid="Base_Column_List" />
from t_mvc_book
where bid=#{bid}
</select>
<!--分页查询-->
<select id="pageBean" parameterType="com.zking.T211_mybais01.model.Book" resultType="com.zking.T211_mybais01.model.Book">
select
<include refid="Base_Column_List" />
from t_mvc_book
where 1=1
<if test="bname != null">
and bname like #{bname}
</if>
</select>
<!--特殊字符处理-->
<select id="list8" parameterType="com.zking.T211_mybais01.vo.BookVo" resultType="com.zking.T211_mybais01.model.Book">
select
<include refid="Base_Column_List" />
from t_mvc_book
where 1=1
<![CDATA[and price > #{minPrice}
and price < #{maxPrice} ]]>
/*and price > #{minPrice}
and price < #{maxPrice}*/
</select>
<delete id="deleteByPrimaryKey" parameterType="java.lang.Integer">
delete from t_mvc_book
where bid = #{bid,jdbcType=INTEGER}
</delete>
<!--通过主键集合批量删除记录-->
<delete id="delete" parameterType="java.lang.Integer">
delete from t_mvc_book
where bid in
<foreach collection="bookIds" item="bid" open="(" close=")" separator="," >
#{bid}
</foreach>
</delete>
<insert id="insert" parameterType="com.zking.T211_mybais01.model.Book">
insert into t_mvc_book (bid, bname, price
)
values (#{bid,jdbcType=INTEGER}, #{bname,jdbcType=VARCHAR}, #{price,jdbcType=REAL}
)
</insert>
<insert id="insertSelective" parameterType="com.zking.T211_mybais01.model.Book">
insert into t_mvc_book
<trim prefix="(" suffix=")" suffixOverrides=",">
<if test="bid != null">
bid,
</if>
<if test="bname != null">
bname,
</if>
<if test="price != null">
price,
</if>
</trim>
<trim prefix="values (" suffix=")" suffixOverrides=",">
<if test="bid != null">
#{bid,jdbcType=INTEGER},
</if>
<if test="bname != null">
#{bname,jdbcType=VARCHAR},
</if>
<if test="price != null">
#{price,jdbcType=REAL},
</if>
</trim>
</insert>
<update id="updateByPrimaryKeySelective" parameterType="com.zking.T211_mybais01.model.Book">
update t_mvc_book
<set>
<if test="bname != null">
bname = #{bname,jdbcType=VARCHAR},
</if>
<if test="price != null">
price = #{price,jdbcType=REAL},
</if>
</set>
where bid = #{bid,jdbcType=INTEGER}
</update>
<update id="updateByPrimaryKey" parameterType="com.zking.T211_mybais01.model.Book">
update t_mvc_book
set bname = #{bname,jdbcType=VARCHAR},
price = #{price,jdbcType=REAL}
where bid = #{bid,jdbcType=INTEGER}
</update>
</mapper>
BookService.java
package com.zking.T211_mybais01.service;
import com.zking.T211_mybais01.Util.PageBean;
import com.zking.T211_mybais01.model.Book;
import com.zking.T211_mybais01.vo.BookVo;
import java.util.List;
import java.util.Map;
/**
* @author HYT
* @site
* @company
* @create 2018-12-14 18:50
*/
public interface BookService {
int deleteByPrimaryKey(Integer bid);
int insert(Book record);
int insertSelective(Book record);
Book selectByPrimaryKey(Integer bid);
int updateByPrimaryKeySelective(Book record);
int updateByPrimaryKey(Book record);
/**
* 讲解foreach标签
* @param bookVo
* @return
*/
List<Book> foreachlist(BookVo bookVo);
/**
* 2.讲解模糊查询
* 三种方式
* @param book
* @return
*/
List<Book> selectlike(Book book);
/**
* 讲解 使用resultMap返回自定义类型集合
* @param book
* @return
*/
List<Book> list3(Book book);
/**
* 讲解 使用resultType返回List<T>
* @param book
* @return
*/
List<Book> list4(Book book);
/**
* 5.讲解 使用resultType返回List<Map>,适用于多表查询返回结果集
* @param book
* @return
*/
List<Map> list5();
/**
* 6.讲解 使用resultType返回Map<String,Object>,适用于多表查询返回单个结果集
* @param map
* @return
*/
Map singleOne(Map map);
/**
*7. 分页
*/
List<Book> pageBean(Book book, PageBean pageBean);
/**
* 8.讲解 特殊字符处理
* >(>)
* <(<)
* &(&)
* 空格( )
*
* <![CDATA[ <= ]]>
*/
List<Book> list8(BookVo bookVo);
}
BookServiceImpl.java
package com.zking.T211_mybais01.service.impl;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.zking.T211_mybais01.Util.PageBean;
import com.zking.T211_mybais01.mapper.BookMapper;
import com.zking.T211_mybais01.model.Book;
import com.zking.T211_mybais01.service.BookService;
import com.zking.T211_mybais01.vo.BookVo;
import java.util.List;
import java.util.Map;
/**
* @author HYT
* @site
* @company
* @create 2018-12-14 18:53
*/
public class BookServiceImpl implements BookService {
private BookMapper bookMapper;
public BookMapper getBookMapper() {
return bookMapper;
}
public void setBookMapper(BookMapper bookMapper) {
this.bookMapper = bookMapper;
}
@Override
public int deleteByPrimaryKey(Integer bid) {
return bookMapper.deleteByPrimaryKey(bid);
}
@Override
public int insert(Book record) {
return bookMapper.insert(record);
}
@Override
public int insertSelective(Book record) {
return bookMapper.insertSelective(record);
}
@Override
public Book selectByPrimaryKey(Integer bid) {
return bookMapper.selectByPrimaryKey(bid);
}
@Override
public int updateByPrimaryKeySelective(Book record) {
return bookMapper.updateByPrimaryKeySelective(record);
}
@Override
public int updateByPrimaryKey(Book record) {
return bookMapper.updateByPrimaryKey(record);
}
@Override
public List<Book> foreachlist(BookVo bookVo) {
return bookMapper.foreachlist(bookVo);
}
@Override
public List<Book> selectlike(Book book) {
return bookMapper.selectlike(book);
}
@Override
public List<Book> list3(Book book) {
return bookMapper.list3(book);
}
@Override
public List<Book> list4(Book book) {
return bookMapper.list4(book);
}
@Override
public List<Map> list5() {
return bookMapper.list5();
}
@Override
public Map singleOne(Map map) {
return bookMapper.singleOne(map);
}
@Override
public List<Book> pageBean(Book book, PageBean pageBean) {
if(pageBean!=null&&pageBean.isPagination()){
PageHelper.startPage(pageBean.getPage(),pageBean.getRows());
}
List<Book> books = this.bookMapper.pageBean(book);
System.out.println(books.getClass());
if(pageBean!=null&&pageBean.isPagination()){
PageInfo pageInfo=new PageInfo(books);
pageBean.setTotal(pageInfo.getTotal()+"");
}
return books;
}
@Override
public List<Book> list8(BookVo bookVo) {
return bookMapper.list8(bookVo);
}
}
测试类 BookServiceImplTest.java
package com.zking.T211_mybais01.service.impl;
import com.zking.T211_mybais01.Util.PageBean;
import com.zking.T211_mybais01.Util.SessionUtil;
import com.zking.T211_mybais01.mapper.BookMapper;
import com.zking.T211_mybais01.model.Book;
import com.zking.T211_mybais01.service.BookService;
import com.zking.T211_mybais01.vo.BookVo;
import org.apache.ibatis.session.SqlSession;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import java.lang.reflect.Array;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* @author HYT
* @site
* @company
* @create 2018-12-14 18:58
*/
public class BookServiceImplTest {
private SqlSession sqlSession;
private BookService bookService;
@Before
public void setUp() throws Exception {
sqlSession = SessionUtil.openSession();//打开session
BookServiceImpl bookserviceImlp = new BookServiceImpl();
BookMapper BookMapper = sqlSession.getMapper(BookMapper.class);
bookserviceImlp.setBookMapper(BookMapper);
bookService = bookserviceImlp;
}
@After
public void tearDown() throws Exception {
sqlSession.commit();
}
@Test
public void deleteByPrimaryKey() {
this.bookService.deleteByPrimaryKey(20);
}
@Test
public void insert() {
Book book = new Book();
book.setBid(1316);
book.setBname("aaaa");
book.setPrice(34f);
this.bookService.insert(book);
}
@Test
public void insertSelective() {
Book book = new Book();
book.setBid(1315);
book.setBname("偷影子的人");
this.bookService.insertSelective(book);
}
@Test
public void selectByPrimaryKey() {
Book book = this.bookService.selectByPrimaryKey(1315);
System.out.println(book);
}
@Test
public void updateByPrimaryKeySelective() {
Book book = new Book();
book.setBid(1315);
book.setBname("偷影子的人");
this.bookService.updateByPrimaryKeySelective(book);
}
@Test
public void updateByPrimaryKey() {
Book book = new Book();
book.setBid(1314);
book.setBname("摆渡人");
book.setPrice(33f);
this.bookService.updateByPrimaryKey(book);
}
@Test
public void foreachlist() {
BookVo bookVo = new BookVo();
bookVo.setBookIds(Arrays.asList(new Integer[]{1314, 1315, 1316}));
List<Book> books = this.bookService.foreachlist(bookVo);
for (Book book : books) {
System.out.println(book);
}
}
@Test
public void selectlike() {
Book book = new Book();
book.setBname("%圣%");
List<Book> books = this.bookService.selectlike(book);
for (Book book1 : books) {
System.out.println(book1);
}
}
@Test
public void list3() {
List<Book> books = this.bookService.list3(null);
for (Book book1 : books) {
System.out.println(book1);
}
}
@Test
public void list4() {
List<Book> books = this.bookService.list4(null);
for (Book book1 : books) {
System.out.println(book1);
}
}
@Test
public void list5() {
List<Map> maps = this.bookService.list5();
for (Map map : maps) {
System.out.println(map);
}
}
/**
* resultType:适合使用返回值的数据类型是非自定义的,即jdk的提供的类型
* resultMap:适合使用返回值是自定义实体类的情况
*/
@Test
public void singleOne() {
Map map=new HashMap();
map.put("bid",1314);
Map map1 = this.bookService.singleOne(map);
System.out.println(map1);
}
@Test
public void pageBean() {
Book book=new Book();
book.setBname("%圣%");
PageBean pageBean=new PageBean();
pageBean.setRows(3);
List<Book> books = this.bookService.pageBean(book, pageBean);
for (Book book1 : books) {
System.out.println(book1);
}
}
@Test
public void list8() {
BookVo bookVo=new BookVo();
bookVo.setMinPrice(10f);
bookVo.setMaxPrice(40f);
List<Book> books = this.bookService.list8(bookVo);
for (Book book : books) {
System.out.println(book);
}
}
}
ok!