目录
提示:在使用idea时,同一个项目,尽量避免多个model中同样的类名
在配置文件中做if的拼接,不需要将条件写在代码中
"insertSelective" parameterType="com.javaxl.model.Book" > - insert into t_oa_permission
-
"(" suffix=")" suffixOverrides="," > - <if test="id != null" >
- id,
- if>
- <if test="name != null" >
- name,
- if>
- <if test="description != null" >
- description,
- if>
- <if test="url != null" >
- url,
- if>
- <if test="pid != null" >
- pid,
- if>
- <if test="ismenu != null" >
- ismenu,
- if>
- <if test="displayno != null" >
- displayno,
- if>
-
- <trim prefix="values (" suffix=")" suffixOverrides="," >
- <if test="id != null" >
- #{id,jdbcType=BIGINT},
- if>
- <if test="name != null" >
- #{name,jdbcType=VARCHAR},
- if>
- <if test="description != null" >
- #{description,jdbcType=VARCHAR},
- if>
- <if test="url != null" >
- #{url,jdbcType=VARCHAR},
- if>
- <if test="pid != null" >
- #{pid,jdbcType=BIGINT},
- if>
- <if test="ismenu != null" >
- #{ismenu,jdbcType=INTEGER},
- if>
- <if test="displayno != null" >
- #{displayno,jdbcType=BIGINT},
- if>
- trim>
-
foreach标签的主要作用,自动拼接字符串
《代码演示》
- select * from t_mvc_book where bid in
-
"bookIds" open="(" close=")" separator="," item="bid"> - #{bid}
-
-
实现层(impl)
- package com.javaxl.Biz.impl;
-
- import com.javaxl.Biz.BookBiz;
- import com.javaxl.mapper.BookMapper;
- import com.javaxl.model.Book;
- import com.javaxl.model.BookVo;
- import com.javaxl.util.PageBean;
-
- import java.text.Bidi;
- import java.util.List;
- import java.util.Map;
-
- /**
- * @author dxy
- * @site www.javadxy.com
- * @company ds公司
- * @create 2022-08-11 20:07
- */
- public class BookBizImpl implements BookBiz {
- private BookMapper bookMapper;
-
- public BookMapper getBookMapper() {
- return bookMapper;
- }
-
- public void setBookMapper(BookMapper bookMapper) {
- this.bookMapper = bookMapper;
- }
-
- @Override
- public List<Book> selectByIn(List bookIds) {
- return bookMapper.selectByIn(bookIds);
- }
-
- }
与配置文件中相对应的接口类
通过in关键字查询 ,讲解foreach标签的使用
如果说参数 是 非实体类(book order,...),name记得加上注解 @param,@Param("bookIds")对应的是collection的属性
- package com.javaxl.mapper;
-
- import com.javaxl.model.Book;
- import com.javaxl.model.BookVo;
- import com.javaxl.util.PageBean;
- import org.apache.ibatis.annotations.Param;
-
- import java.util.List;
- import java.util.Map;
-
- public interface BookMapper {
- int deleteByPrimaryKey(Long id);
-
-
- List<Book> selectByIn(@Param("bookIds") List bookIds);
-
-
- }
在业务逻辑层写上相对应的代码 (是个接口类)
- package com.javaxl.Biz;
-
- import com.javaxl.model.Book;
- import com.javaxl.model.BookVo;
- import com.javaxl.util.PageBean;
-
- import java.util.List;
- import java.util.Map;
-
- /**
- * @author dxy
- * @site www.javadxy.com
- * @company ds公司
- * @create 2022-08-11 20:02
- */
- public interface BookBiz {
- int deleteByPrimaryKey(Long id);
-
- int insert(Book record);
-
-
- Book selectByPrimaryKey(Long id);
-
- List<Book> selectByIn(List bookIds);
-
- public List<Book> selectBooksLike1(String bname);
-
- public List<Book> selectBooksLike2(String bname);
-
- public List<Book> selectBooksLike3(String bname);
-
- List<Book> list1();
- List<Book> list2();
- List<Map> list3(BookVo vo);
- List<Map> list4();
- Map list5(Map map);
-
- List<Map> listPager(Map map,PageBean pageBean);
- }
代码写完后,进行测试
- @Test
- public void selectByIn() {
- List<Integer> bookIds = Arrays.asList(new Integer[]{31, 32, 33, 34});
- bookBiz.selectByIn(bookIds).forEach(System.out::println);
- }
效果图如下

配置文件代码展示
- select * from t_mvc_book where bid in
-
"bookIds" open="(" close=")" separator="," item="bid"> - #{bid}
-
MyBatis中#和$的区别
注意:#{...}自带引号,${...}有sql注入的风险
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. 一般能用#的就别用$.自定义mvc中的
baseDao
executeQQuery - > list
单表查询 -》Mybatis中的ResultType executeQQuery - > list
结论:如果是单表的情况下,ResultType与ResultMap都可以使用
《代码演示》
select * from t_mvc_book <select id="list5" resultType="java.util.Map" parameterType="java.util.Map"> select * from t_mvc_book where bid = #{bid} select>解释:说明了不管返回1条数据,还是多条数据,都应该用java.util.Map进行接受
如果是1条数据,那么返回值是Map
如果是多条数据,那么返回值list
相对应接口代码
public List<Book> selectBooksLike1(@Param("bname") String bname);
对应业务逻辑层接口代码
- package com.javaxl.Biz;
-
- import com.javaxl.model.Book;
- import com.javaxl.model.BookVo;
- import com.javaxl.util.PageBean;
-
- import java.util.List;
- import java.util.Map;
-
- /**
- * @author dxy
- * @site www.javadxy.com
- * @company ds公司
- * @create 2022-08-11 20:02
- */
- public interface BookBiz {
-
- public List<Book> selectBooksLike1(String bname);
-
-
- }
接口实现类
- package com.javaxl.Biz.impl;
-
- import com.javaxl.Biz.BookBiz;
- import com.javaxl.mapper.BookMapper;
- import com.javaxl.model.Book;
- import com.javaxl.model.BookVo;
- import com.javaxl.util.PageBean;
-
- import java.text.Bidi;
- import java.util.List;
- import java.util.Map;
-
- /**
- * @author dxy
- * @site www.javadxy.com
- * @company ds公司
- * @create 2022-08-11 20:07
- */
- public class BookBizImpl implements BookBiz {
-
- public List<Book> selectByIn(List bookIds) {
- return bookMapper.selectByIn(bookIds);
- }
- }
测试代码
- @Test
- public void selectBooksLike1() {
- bookBiz.selectBooksLike1("%圣墟%").forEach(System.out::println);
- }
-
- select * from t_mvc_book where bname like '${bname}'
对应的接口代码
public List<Book> selectBooksLike2(@Param("bname") String bname);
相对应的业务逻辑接口代码
- package com.javaxl.Biz;
-
- import com.javaxl.model.Book;
- import com.javaxl.model.BookVo;
- import com.javaxl.util.PageBean;
-
- import java.util.List;
- import java.util.Map;
-
- /**
- * @author dxy
- * @site www.javadxy.com
- * @company ds公司
- * @create 2022-08-11 20:02
- */
- public interface BookBiz {
-
- public List<Book> selectBooksLike2(String bname);
-
-
- }
接口实现类
- public List<Book> selectBooksLike2(String bname){
- return bookMapper.selectBooksLike2(bname);
- }
方法测试
- @Test
- public void selectBooksLike2() {
- bookBiz.selectBooksLike2("%圣墟%").forEach(System.out::println);
- }
最终测试结果对比:
#{...}用的是占位符
${...}防SQL注入
《效果图》

配置文件代码
-
- select * from t_mvc_book where bname like concat(concat('%',#{bname}),'%')
对应接口代码
- public List<Book> selectBooksLike3(@Param("bname") String bname);
-
对应的业务逻辑层接口代码(biz)
public List<Book> selectBooksLike3(String bname);
接口实现类
- public List<Book> selectBooksLike3(String bname){
- return bookMapper.selectBooksLike3(bname);
- }
代码测试
- @Test
- public void selectBooksLike3() {
- bookBiz.selectBooksLike3("%圣墟%").forEach(System.out::println);
- }
《效果图》
得出结论:
常用的方法为concat ------> concat(concat('%',?),'%')----->%?%
#{...}自带引号,用占位符赋值,${...}有SQL注入的风险
1.resultMap
适合使用返回值是自定义实体类的情况
2.resultType
适合使用返回值的数据类型是非自定义的,即jdk的提供的类型
注意事项:
使用resultMap返回自定义类型集合
使用resultType返回List
使用resultType返回单个对象
使用resultType返回List
使用resultType返回Map
,适用于多表查询返回单个结果集
《代码演示》
配置文件
-
- select * from t_mvc_book
- <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>
接口类
- //list1 list2的结论是 ,对于单表查询而言,可以用resultmap/resultType接收,但是多表必须用resultmap接收
- List
list1(); - List
list2(); - //如果要传入多个查询参数,必须以对象的方式进行传递
- List
list3(BookVo vo); - // 使用resultType返回List
- List<Map> list4();
- // 使用resultType返回Map
,适用于多表查询返回单个结果集 - Map list5(Map map);
- //利用第三方插件进行分页
- List<Map> listPager(Map map);
业务逻辑层接口类
- List
list1(); - List
list2(); - List
list3(BookVo vo); - List<Map> list4();
- Map list5(Map map);
接口实现类
- @Override
- public List
list1(){ - return bookMapper.list1();
- }
-
- @Override
- public List
list2(){ - return bookMapper.list2();
- }
-
- @Override
- public List
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
- 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文件依赖
- <groupId>com.github.pagehelpergroupId>
- <artifactId>pagehelperartifactId>
- <version>5.1.2version>
MyBatis.cfg.xml配置拦截器
-
- <plugin interceptor="com.github.pagehelper.PageInterceptor">
- plugin>
使用分页插件
- select * from t_mvc_book where bname like concat(concat('%',#{bname}),'%')
接口类
List<Map> listPager(Map map);
业务逻辑层接口类
List<Map> listPager(Map map, PageBean pageBean);
接口实现类
- @Override
- public List<Map> listPager(Map map, PageBean pageBean) {
- if(pageBean != null && pageBean.isPagination()){
- PageHelper.startPage(pageBean.getPage(),pageBean.getRows());
- }
- List<Map> list = bookMapper.listPager(map);
- if(pageBean != null && pageBean.isPagination()){
- PageInfo pageInfo = new PageInfo(list);
- System.out.println("页码:"+pageInfo.getPageNum());
- System.out.println("页大小:"+pageInfo.getPageSize());
- System.out.println("总记录:"+pageInfo.getTotal());
- pageBean.setTotal(pageInfo.getTotal()+"");
- }
- return list;
- }
例如:
>(>)
<(<)
&(&)
空格( )
配置代码
- select * from t_mvc_book
-
- <if test="null != min and min != ''">
-
- if>
- <if test="null != max and max != ''">
- price ]]>
- if>
-
-
- <select id="list7" resultType="com.javaxl.model.Book" parameterType="com.javaxl.model.BookVo">
- select * from t_mvc_book
- <where>
- <if test="null != min and min != ''">
- and #{min} < price
- if>
- <if test="null != max and max != ''">
- and #{max} > price
- if>
- where>
- select>
字符处理代码
- /**
- * 处理特殊字符
- * @param bookVo
- * @return
- */
- List<Book> list6(BookVo bookVo);
-
-
- /**
- * 处理特殊字符
- * @param bookVo
- * @return
- */
- List<Book> list7(BookVo bookVo);