[编辑 测试结果](#编辑 测试结果)
[mybatis中的#与有是什么区别](#与有是什么区别)
[编辑 Bookmapper](#编辑 Bookmapper)
面试题:使用mybatis的各种场景,返回的结果是多样的,resultType/resultMap有什么区别
一.什么是Mybatis动态分页
MyBatis是Java中一种持久层框架,它提供了许多数据库操作的便利性。在使用MyBatis进行数据查询时,动态分页是一种常见的需求。
动态分页是指根据用户的请求动态生成数据库查询语句,以满足不同的分页需求。具体来说,动态分页通过在查询语句中添加limit和offset来实现。limit表示每页查询的记录数,offset表示查询结果的偏移量。
在MyBatis中,可以使用动态SQL语句来实现动态分页。动态SQL语句是一种可以根据条件决定是否包含某一段SQL语句的技术。MyBatis提供了一些标签和函数来支持动态SQL语句的编写,比如if、choose、when、otherwise等。
使用MyBatis实现动态分页的步骤如下:
- 在SQL映射文件中定义查询语句,根据需要使用动态SQL语句。
- 在查询语句中使用limit和offset来实现分页。
- 在Java代码中调用MyBatis的分页方法,传入分页参数。
- MyBatis会根据传入的分页参数动态生成查询语句,返回分页结果。
总结来说,MyBatis的动态分页可以根据用户的需求动态生成查询语句,实现灵活的数据分页操作。
二.mybatis中的动态SQL
MyBatis的动态SQL在实际开发中具有一些优势和一些潜在的弊端。下面是它们的一些特点:
优势:
- 灵活性高:动态SQL允许根据不同的条件动态生成SQL语句,使得查询更加灵活,可以根据实际需求调整查询逻辑。
- 可读性好:使用动态SQL可以根据条件自动拼接SQL语句,并且不会引入过多的冗余代码,提高了SQL语句的可读性。
- 性能优化:动态SQL可以根据实际情况动态生成查询语句,避免不必要的查询,提高查询性能。
弊端:
- 学习成本较高:动态SQL需要了解和掌握MyBatis的动态SQL标签和语法,相对于普通的静态SQL语句,学习成本较高。
- 可维护性差:对于复杂的动态SQL语句,难以维护和调试,因为SQL语句的生成逻辑可能会有较多的条件判断和嵌套。
- 可能存在安全隐患:动态SQL中直接拼接参数可能存在SQL注入的风险。因此,应该始终使用参数绑定方式,而不是直接在SQL语句中拼接参数。
需要注意的是,虽然动态SQL在某些情况下能提高查询性能,但当动态SQL变得过于复杂时,可能会导致查询的性能下降。因此,在实际开发中应根据实际情况综合考虑,权衡优势和弊端,选择最适合的方案。
在BookMaaper.xml中写sql
BookMapper
java
package com.zking.mapper;
import com.zking.model.Book;
import org.apache.ibatis.annotations.Param;
import java.util.List;
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);
List<Book> selectByBids(@Param("bids") List bids);
}
BookBiz接口类
java
package com.zking.biz;
import com.zking.model.Book;
import org.apache.ibatis.annotations.Param;
import java.util.List;
public interface BookBiz {
int deleteByPrimaryKey(Integer bid);
int insert(Book record);
int insertSelective(Book record);
Book selectByPrimaryKey(Integer bid);
int updateByPrimaryKeySelective(Book record);
int updateByPrimaryKey(Book record);
List<Book> selectByBids(List bids);
}
BookBizImpl实现接口类
java
package com.zking.biz.impl;
import com.zking.biz.BookBiz;
import com.zking.mapper.BookMapper;
import com.zking.model.Book;
import java.util.List;
/**
* @author bing人
* @site
* @company xy集团
* @create 2023-08-21 10:16
*/
public class BookBizimpl implements BookBiz {
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.updateByPrimaryKeySelective(record);
}
@Override
public List<Book> selectByBids(List bids) {
return bookMapper.selectByBids(bids);
}
}
demo测试类
测试结果
三.mybatis中的模糊查询
这是一个面试题:
mybatis中的#与$有是什么区别
resulrType:对应的返回类型
resultMap:对应的是返回映射关系,值得是实体类与数据表字段的关系
通常而言,单表查询,以及返回单例,返回多表查询结果,使用resulrType
如果查询的结果,需要有关联属性的体现,那么用resultMap
1.$是占位符传参,#是预处理SQL2.外在形式,$传参不带引号,#传参自带引号
3.$传参存在sql注入,#不存在
4.$可以用来做动态列,完成动态sql开发
预处理SQL
$只是传参是占位符的形式
在BookMapper.xml里面建立三个模糊查询
Bookmapper
BookBiz接口类
BookBizImpl实现接口类
java
package com.zking.biz.impl;
import com.zking.biz.BookBiz;
import com.zking.mapper.BookMapper;
import com.zking.model.Book;
import java.util.List;
/**
* @author bing人
* @site
* @company xy集团
* @create 2023-08-21 10:16
*/
public class BookBizimpl implements BookBiz {
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.updateByPrimaryKeySelective(record);
}
@Override
public List<Book> selectByBids(List bids) {
return bookMapper.selectByBids(bids);
}
@Override
public List<Book> like1(String bname) {
return bookMapper.like1(bname);
}
@Override
public List<Book> like2(String bname) {
return bookMapper.like2(bname);
}
@Override
public List<Book> like3(String bname) {
return bookMapper.like3(bname);
}
}
demo测试类
java
package com.zking.demo;
import com.zking.biz.BookBiz;
import com.zking.biz.impl.BookBizimpl;
import com.zking.mapper.BookMapper;
import com.zking.model.Book;
import com.zking.utils.SessionUtil;
import org.apache.ibatis.session.SqlSession;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import java.util.Arrays;
import java.util.List;
/**
* @author bing人
* @site
* @company xy集团
* @create 2023-08-21 10:28
*/
public class Demo1 {
private BookBiz bookBiz;
private SqlSession sqlSession;
@Before
public void a(){
System.out.println("执行测试方法之前会执行的初始化代码块方法");
this.sqlSession = SessionUtil.openSession();
BookBizimpl book = new BookBizimpl();
BookMapper mapper = this.sqlSession.getMapper(BookMapper.class);
book.setBookMapper(mapper);
this.bookBiz = book;
}
@After
public void b(){
System.out.println("执行测试方法之后的后执行的方法");
//提交事务
this.sqlSession.commit();
}
@Test
public void text1(){
System.out.println("测试查询方法方法..");
Book book = bookBiz.selectByPrimaryKey(33);
System.out.println(book);
}
@Test
public void text2(){
System.out.println("删除的方法");
int insert = bookBiz.deleteByPrimaryKey(1);
}
@Test
public void testById(){
List<Integer> bids = Arrays.asList(new Integer[]{ 45, 46, 47,48,49});
//jdk1.8的新特性
bookBiz.selectByBids(bids).forEach(System.out::println);
//上面一行代码抵三行代码
// for (Book selectByBid : bookBiz.selectByBids(bids)){
// System.out.println(selectByBid);
// }
}
@Test
public void testlike1(){
bookBiz.like1("%圣墟%").forEach(System.out::println);
}
@Test
public void testlike2(){
bookBiz.like2("%圣墟%").forEach(System.out::println);
}
}
测试结果
四.mybatis中结果映射
面试题:使用mybatis的各种场景,返回的结果是多样的,resultType/resultMap有什么区别
1.返回单表的对应的实体类,仅有一个查询结果,可以使用resultType/resultMap
实例演示
使用resultType:
测试结果:
使用resultMap:
输出结果:
2.返回单表的对应的实体类,有多个查询结果,可以使用resultType/resultMap
测试结果:
resultType:
resultMap:
3.返回多表对应的结果,仅有一个查询结果,通常用resultType,也可以用resultMap
测试结果:
4.返回多表对应的结果,有多个查询结果,通常用resultType,也可以用resultMap
5.返回单个列段,仅有一个查询结果,就用resultType
测试结果:
6.返回单个列段,有多个查询结果,就用resultType
测试结果: