最后
资料过多,篇幅有限
开源分享:【大厂前端面试题解析+核心总结学习笔记+真实项目实战+最新讲解视频】
自古成功在尝试。不尝试永远都不会成功。勇敢的尝试是成功的一半。
bookServiceImpl
bookServiceImplTest
二、模糊查询
BookMapper.xml
bookService和bookMapper一样
bookServiceImpl
bookServiceImplTest
三、查询返回结果集的处理
bookMapper.xml
bookService和bookMapper一致
BookVo
bookServiceImpl
bookServiceImplTest
四、分页查询
1.为什么要重写mybatis的分页?
2.使用分页插件步骤
导入pom依赖
Mybatis.cfg.xml配置拦截器
BookMapper.xml
BookMapper
BookService
BookServiceImpl
bookServiceImplTest
五、特殊字符处理
BookMapper.xml
BookMapper 和 BookService 一致
BookServiceImpl
bookServiceImplTest
一、mybatis动态SQL
==============
1.if
使用if的动态SQL语句,解决了修改需要传递所有列段的问题
BookMapper.xml
insert into t_mvc_book (bid, bname, price
)
values (#{bid,jdbcType=INTEGER}, #{bname,jdbcType=VARCHAR}, #{price,jdbcType=REAL}
)
insert into t_mvc_book
bid,
bname,
price,
#{bid,jdbcType=INTEGER},
#{bname,jdbcType=VARCHAR},
#{price,jdbcType=REAL},
update t_mvc_book
bname = #{bname,jdbcType=VARCHAR},
price = #{price,jdbcType=REAL},
where bid = #{bid,jdbcType=INTEGER}
update t_mvc_book
set bname = #{bname,jdbcType=VARCHAR},
price = #{price,jdbcType=REAL}
where bid = #{bid,jdbcType=INTEGER}
当接收参数时,进行if判断,判断每个列是否为空,如果为空就不增加该列段,否则就增加,
当我们进行修改时,如果只需要修改一个字段,就不要把其他字段传进来了,之前的方式是必须把其他字段传进来,否则修改之后没有传进来的参数就变为空了
2.foreach
解决后台循环拼接字符串的问题
BookMapper.xml
select * from t_mvc_book where bid in
#{bid}
**collection:集合的变量(相当于遍历里面的items)
open 自动补充的前缀
close 自动补充的后缀
separator 分隔符
item 集合变量当前元素的引用(相当于遍历里面的var)**
bookService
List selectBooksIn(List bookIds);
bookMapper
List selectBooksIn(@Param(“bookIds”) List bookIds);
bookServiceImpl
@Override
public List selectBooksIn(List bookIds) {
return bookMapper.selectBooksIn(bookIds);
}
bookServiceImplTest
@Test
public void testselectBooksIn() {
System.out.println("foreach标签");
List<Book> list = this.bookService.selectBooksIn(Arrays.asList(new Integer\[\]{67, 68, 69}));
list.forEach(System.out::println);
}
结果
二、模糊查询
========
BookMapper.xml
select * from t_mvc_book where bname like #{bname}
select * from t_mvc_book where bname like ‘${bname}’
select * from t_mvc_book where bname like concat(concat(‘%’,#{bname}),‘%’)
#{…}:自带引号,模糊查询时%要在后台自己拼接,通用的增删改查
${…}:有SQL注入的风险,模糊查询时%要在后台自己拼接,除了模糊查询不用其他都会用
concat:通过concat函数自动拼接%,不考虑通用的增删改查会用他
bookService和bookMapper一样
List selectBooksLike1(@Param(“bname”) String bname);
List selectBooksLike2(@Param(“bname”) String bname);
List selectBooksLike3(@Param(“bname”) String bname);
bookServiceImpl
@Override
public List selectBooksLike1(String bname) {
return bookMapper.selectBooksLike1(bname);
}
@Override
public List selectBooksLike2(String bname) {
return bookMapper.selectBooksLike2(bname);
}
@Override
public List selectBooksLike3(String bname) {
return bookMapper.selectBooksLike3(bname);
}
bookServiceImplTest
@Test
public void testselectBooksLike1() {
List<Book> list = this.bookService.selectBooksLike1("%圣%");
list.forEach(System.out::println);
}
@Test
public void testselectBooksLike2() {
List<Book> list = this.bookService.selectBooksLike2("%圣%");
list.forEach(System.out::println);
}@Test
public void testselectBooksLike3() {
List<Book> list = this.bookService.selectBooksLike3("圣");
list.forEach(System.out::println);
}
三、查询返回结果集的处理
=============
resultMap:适合使用返回值是自定义实体类的情况,适合多表,Mapper.xml中自定义集合
resultType:适合使用返回值的数据类型是非自定义的,即jdk的提供的类型,适合单表
bookMapper.xml
select * from t_mvc_book
select * from t_mvc_book
select * from t_mvc_book where bid in
#{bid}
select * from t_mvc_book
select * from t_mvc_book where bid = #{bid}
bookService和bookMapper一致
/**
* 使用resultMap返回自定义类型集合
* @return
*/
List list1();
/**
* 使用resultType返回List
* @return
*/
List list2();
/**
* 使用resultType返回单个对象
* @return
*/
Book list3(BookVo bookVo);
/**
* 使用resultType返回List
* @return
*/
List
/**
* 使用resultType返回Map<String,Object>,适用于多表查询返回单个结果集
* @return
*/
Map list5(Map book);
List
BookVo
package com.ltf.vo;
import com.ltf.model.Book;
import java.util.List;
public class BookVo extends Book {
private List<Integer> bookIds;
public List<Integer> getBookIds() {
return bookIds;
}
public void setBookIds(List<Integer> bookIds) {
this.bookIds = bookIds;
}
}
bookServiceImpl
@Override
public List list1() {
return bookMapper.list1();
}
@Override
public List list2() {
return bookMapper.list2();
}
@Override
public Book list3(BookVo bookVo) {
return bookMapper.list3(bookVo);
}
@Override
public List
return bookMapper.list4();
}
@Override
public Map list5(Map book) {
return bookMapper.list5(book);
}
list3如果传多个参数会报以下错误,因为他返回的是list类型,但是方法定义中是Book类型
bookServiceImplTest
@Test
后话
开源分享:【大厂前端面试题解析+核心总结学习笔记+真实项目实战+最新讲解视频】
对于面试,说几句个人观点。
面试,说到底是一种考试。正如我们一直批判应试教育脱离教育的本质,为了面试学习技术也脱离了技术的初心。但考试对于人才选拔的有效性是毋庸置疑的,几千年来一直如此。除非你有实力向公司证明你足够优秀,否则,还是得乖乖准备面试。这也并不妨碍你在通过面试之后按自己的方式学习。
其实在面试准备阶段,个人的收获是很大的,我也认为这是一种不错的学习方式。首先,面试问题大部分基础而且深入,这些是平时工作的基础。就好像我们之前一直不明白学习语文的意义,但它的意义就在每天的谈话间。
所谓面试造火箭,工作拧螺丝。面试往往有更高的要求,也迫使我们更专心更深入地去学习一些知识,也何尝不是一种好事。
如果传多个参数会报以下错误,因为他返回的是list类型,但是方法定义中是Book类型
bookServiceImplTest
@Test
后话
开源分享:【大厂前端面试题解析+核心总结学习笔记+真实项目实战+最新讲解视频】
对于面试,说几句个人观点。
面试,说到底是一种考试。正如我们一直批判应试教育脱离教育的本质,为了面试学习技术也脱离了技术的初心。但考试对于人才选拔的有效性是毋庸置疑的,几千年来一直如此。除非你有实力向公司证明你足够优秀,否则,还是得乖乖准备面试。这也并不妨碍你在通过面试之后按自己的方式学习。
其实在面试准备阶段,个人的收获是很大的,我也认为这是一种不错的学习方式。首先,面试问题大部分基础而且深入,这些是平时工作的基础。就好像我们之前一直不明白学习语文的意义,但它的意义就在每天的谈话间。
所谓面试造火箭,工作拧螺丝。面试往往有更高的要求,也迫使我们更专心更深入地去学习一些知识,也何尝不是一种好事。