目录
前言
本章的内容重点在于玩转BookMapper.xml这个文件。(实体类的映射文件)
简单的说就是去了解这个文件的每一个配置是什么意思,也了解sql语句该如何实现实战所需要的要求。
BookMapper.xml中自动生成的文件
这个是对应的一个接口文件,一般都会自动生成
不理解的可以理解为:
BookMapper.xml是dao方法
BookMapper.java是dao方法的接口文件
这个是自定义的实体类,在下面的resultMap中我们会用到。
可一般的话是不会使用到的,只有一般的特殊场景才会使用到
OK,现在我们再看一看系统自动生成的sql语句。
我们就是待会就如此来写sql代码
自定义sql语句(案例)
sql语句重点解析
注意先看这里
这个的意思是搜索,当然也有对应的delete,update,insert
这个是id ,必须和接口文件的方法名保持一致。
result后面分别有两个:(一般使用resultType)
resultMap:适合使用返回值是自定义实体类的情况
resultType:适合使用返回值的数据类型是非自定义的,即jdk的提供的类型
简单的说就是你这个方法返回什么数据类型
简单的说就是你这个方法调用的参数是什么数据类型
如果没有参数,就不用写
sql语句整体
sql语句整体又有些其他的标签,简单的就只有if,foreach,用法跟之前的EL表达式差不多
获取所有对应的bid集合,通过 where bid in(?)(案例)
一,定义构造方法
//根据bid,查询所有相对应bid的内容
List<Book> selectIds( @Param("bookInds") List bookInds);
二,写好sql语句
<select id="selectIds" resultType="com.liwangwang.model.Book" parameterType="java.util.List">
select * from t_mvc_book where bid in
<foreach collection="bookInds" open="(" close=")" separator="," item="bid">
#{bid}
</foreach>
</select>
三,配置好相关的三层架构(下面不会再详细讲解)
四,开始测试
package com.liwangwang.test;
import com.liwangwang.mapper.BookMapper;
import com.liwangwang.model.Book;
import com.liwangwang.model.BookVo;
import com.liwangwang.service.BookService;
import com.liwangwang.service.impl.BookServiceImpl;
import com.liwangwang.util.PageBean;
import com.liwangwang.util.SessionUtil;
import com.liwangwang.util.StringUtils;
import org.apache.ibatis.session.SqlSession;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class BookTest {
private BookService bookService;
private SqlSession sqlSession;
@Before
public void setUp() throws Exception {
BookServiceImpl bookServiceImpl = new BookServiceImpl();
sqlSession = SessionUtil.openSession();
bookServiceImpl.setBookMapper(sqlSession.getMapper(BookMapper.class));
this.bookService = bookServiceImpl;
}
@After
public void tearDown() throws Exception {
sqlSession.commit();
sqlSession.close();
}
@Test
public void selectList() {
List ls = new ArrayList();
ls.add(1);
ls.add(3);
ls.add(27);
ls.add(38);
List<Book> books = bookService.selectIds(ls);
for (Book book : books) {
System.out.println(book);
}
}
}
模糊查询的多种方式 where bname like ‘%?%’(案列)
一,定义构造方法
//模糊查询1
List<Book> selectBylike1( String bookname);
//模糊查询2
List<Book> selectBylike2( String bookname);
//模糊查询3
List<Book> selectBylike3( String bookname);
二,写好sql语句
<select id="selectBylike1" resultType="com.liwangwang.model.Book" parameterType="java.lang.String">
select * from t_mvc_book where bname like #{bookname}
</select>
<select id="selectBylike2" resultType="com.liwangwang.model.Book" parameterType="java.lang.String">
select * from t_mvc_book where bname like '${bookname}'
</select>
<select id="selectBylike3" resultType="com.liwangwang.model.Book" parameterType="java.lang.String">
select * from t_mvc_book where bname like concat(concat('%',#{bookname}),'%')
</select>
三,开始测试
package com.liwangwang.test;
import com.liwangwang.mapper.BookMapper;
import com.liwangwang.model.Book;
import com.liwangwang.model.BookVo;
import com.liwangwang.service.BookService;
import com.liwangwang.service.impl.BookServiceImpl;
import com.liwangwang.util.PageBean;
import com.liwangwang.util.SessionUtil;
import com.liwangwang.util.StringUtils;
import org.apache.ibatis.session.SqlSession;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class BookTest {
private BookService bookService;
private SqlSession sqlSession;
@Before
public void setUp() throws Exception {
BookServiceImpl bookServiceImpl = new BookServiceImpl();
sqlSession = SessionUtil.openSession();
bookServiceImpl.setBookMapper(sqlSession.getMapper(BookMapper.class));
this.bookService = bookServiceImpl;
}
@After
public void tearDown() throws Exception {
sqlSession.commit();
sqlSession.close();
}
@Test
public void selectBylike1() {
List<Book> ls = this.bookService.selectBylike1(StringUtils.SetSelectLike("圣墟"));
for (Book l : ls) {
System.out.println(l);
}
}
@Test
public void selectBylike2() {
List<Book> ls = this.bookService.selectBylike2(StringUtils.SetSelectLike("圣墟"));
for (Book l : ls) {
System.out.println(l);
}
}
@Test
public void selectBylike3() {
List<Book> ls = this.bookService.selectBylike3("圣墟");
for (Book l : ls) {
System.out.println(l);
}
}
}
返回结果集的不同 List<map>
? 还是 List<book>
? (案例)
一,定义构造方法
// 3.1 使用resultMap返回自定义类型集合
List<Book> list1();
// 3.2 使用resultType返回List<T>
List<Book> list2();
// 3.3 使用resultType返回单个对象
Book list3(BookVo bookVo);
// 3.4 使用resultType返回List<Map>,适用于多表查询返回结果集
List<Map> list4(Map map);
// 3.5 使用resultType返回Map<String,Object>,适用于多表查询返回单个结果集
Map list5(Map map);
二,写好sql语句
<select id="list1" resultMap="BaseResultMap">
select * from t_mvc_book
</select>
<select id="list2" resultType="com.liwangwang.model.Book">
select * from t_mvc_book
</select>
<select id="list3" resultType="com.liwangwang.model.Book" parameterType="com.liwangwang.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" parameterType="java.util.Map">
select * from t_mvc_book
<where>
<if test=" null != bname and bname !='' ">
and bname like #{bname}
</if>
</where>
</select>
<select id="list5" resultType="java.util.Map" parameterType="java.util.Map">
select * from t_mvc_book
<where>
<if test=" null != bid and bid !='' ">
and bid like #{bid}
</if>
</where>
</select>
三,开始测试
package com.liwangwang.test;
import com.liwangwang.mapper.BookMapper;
import com.liwangwang.model.Book;
import com.liwangwang.model.BookVo;
import com.liwangwang.service.BookService;
import com.liwangwang.service.impl.BookServiceImpl;
import com.liwangwang.util.PageBean;
import com.liwangwang.util.SessionUtil;
import com.liwangwang.util.StringUtils;
import org.apache.ibatis.session.SqlSession;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class BookTest {
private BookService bookService;
private SqlSession sqlSession;
@Before
public void setUp() throws Exception {
BookServiceImpl bookServiceImpl = new BookServiceImpl();
sqlSession = SessionUtil.openSession();
bookServiceImpl.setBookMapper(sqlSession.getMapper(BookMapper.class));
this.bookService = bookServiceImpl;
}
@After
public void tearDown() throws Exception {
sqlSession.commit();
sqlSession.close();
}
@Test
public void list1() {
List<Book> ls = this.bookService.list1();
for (Book l : ls) {
System.out.println(l);
}
}
@Test
public void list2() {
List<Book> ls = this.bookService.list2();
for (Book l : ls) {
System.out.println(l);
}
}
@Test
public void list3() {
BookVo bookVo = new BookVo();
List ls = new ArrayList();
ls.add(27);
bookVo.setBookIds(ls);
Book book = this.bookService.list3(bookVo);
System.out.println(book);
}
@Test
public void list4() {
Map<String,Object> m = new HashMap<>();
m.put("bname",StringUtils.SetSelectLike("圣墟"));
List<Map> ls = this.bookService.list4(m);
for (Map l : ls) {
System.out.println(l);
}
}
@Test
public void list5() {
Map<String,Object> m = new HashMap<>();
m.put("bid","27");
Map ls = this.bookService.list5(m);
System.out.println(ls);
}
}
分页查询
安装PageHelpe插件
-
为什么要重写mybatis的分页?
- Mybatis的分页功能很弱,它是基于内存的分页(查出所有记录再按偏移量offset和边界limit取结果),在大数据量的情况下这样的分页基本上是没有用的
一,下载依赖
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper</artifactId>
<version>5.1.2</version>
</dependency>
二,在mybatis.cfg.xml中配置拦截器
注意!!!
必须放到enviroments的上面
<plugins>
<!-- 配置分页插件PageHelper, 4.0.0以后的版本支持自动识别使用的数据库 -->
<plugin interceptor="com.github.pagehelper.PageInterceptor">
</plugin>
</plugins>
三,写简单的分页代码
BookService
//分页
List<Map> listPager(Map map, PageBean pageBean);
BookServiceImpl
@Override
public List<Map> listPager(Map map, PageBean pageBean) {
if(pageBean!=null && pageBean.isPagination()){
PageHelper.startPage(pageBean.getPage(),pageBean.getRows());
}
List<Map> m = bookMapper.list4(map);
if(pageBean!=null && pageBean.isPagination()){
PageInfo pageInfo = new PageInfo(m);
System.out.println("分页的总页数:"+pageInfo.getTotal());
System.out.println("此时的页码:"+pageInfo.getPageNum());
System.out.println("页数据量:"+pageInfo.getPageSize());
pageBean.setTotal(pageInfo.getTotal()+"");
}
return m;
}
四,测试
package com.liwangwang.test;
import com.liwangwang.mapper.BookMapper;
import com.liwangwang.model.Book;
import com.liwangwang.model.BookVo;
import com.liwangwang.service.BookService;
import com.liwangwang.service.impl.BookServiceImpl;
import com.liwangwang.util.PageBean;
import com.liwangwang.util.SessionUtil;
import com.liwangwang.util.StringUtils;
import org.apache.ibatis.session.SqlSession;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class BookTest {
private BookService bookService;
private SqlSession sqlSession;
@Before
public void setUp() throws Exception {
BookServiceImpl bookServiceImpl = new BookServiceImpl();
sqlSession = SessionUtil.openSession();
bookServiceImpl.setBookMapper(sqlSession.getMapper(BookMapper.class));
this.bookService = bookServiceImpl;
}
@After
public void tearDown() throws Exception {
sqlSession.commit();
sqlSession.close();
}
@Test
public void listPager() {
Map<String,Object> m = new HashMap<>();
m.put("bname",StringUtils.SetSelectLike("圣墟"));
PageBean pageBean = new PageBean();
List<Map> ls = this.bookService.listPager(m, pageBean);
for (Map l : ls) {
System.out.println(l);
}
}
}
特殊符号
为什么会有这个的概念呢,
其实很简单,就是你有时候会写这样的代码:where price >20 and 30<price
但是因为我们使用的是标签<if>where price >20 and 30<price</if>
这很显然会报错,因为我们都分不清。
所以有两种解决方式:
一,
以前 | 现在 |
---|---|
> | > |
< | < |
或者直接抱住