MyBatis笔记(三)——ResultMap结果集映射,日志,分页的多种实现方式

MyBatis笔记(三)——ResultMap结果集映射,日志,分页的多种实现方式

文章目录

  • MyBatis笔记(三)——ResultMap结果集映射,日志,分页的多种实现方式
      • 1.ResultMap(结果集映射)
        • 1.1 ResultMap自动映射
        • 1.2 ResultMap手动映射:zap:
      • 2.MyBatis与日志
        • 2.1 导入log4j依赖:
        • 2.2 编写配置文件log4j.properties
        • 2.3在mybatis-config.xml 配置日志
        • 2.4 使用log4j在Java中输出日志信息
      • 3.分页的多种实现方式
        • 3.1 SQL语句实现分页(limit关键字)
        • 3.2 MyBatis中Sqlsession+RowBounds实现分页(不推荐用)
        • 3.3 第三方插件PageHelper(推荐使用:zap:)

参考: https://www.bilibili.com/video/BV1NE411Q7Nx

视频原作者CSDN: https://blog.csdn.net/qq_33369905

这篇是自己整理了一下,以便自己复习。

1.ResultMap(结果集映射)

1.1 ResultMap自动映射

以下这一段文字摘自MyBatis 自动映射及原理https://blog.csdn.net/fageweiketang/article/details/80919716

在 MyBatis 的映射配置文件中,select 标签查询配置结果集时使用过 resultType 属性,当在 resultType 中定义一个 Java 包装类时,如果 sql 语句查询的结果中有列名与该 Java 包装类中的属性名一致,则该字段就会被映射到该属性上。这里用到的就是 MyBatis 的自动映射功能,当 sql 语句查询出结果时**,如果对应输出配置的 Java 包装类中有相同名称的属性,且拥有 set 方法,则该结果就会被自动映射**。

在第一篇笔记中User类和数据库中得user表的字段一一对应,如下表,MyBatis已经用ResultMap帮我们自动映射了实体类与user表(命名规则满足驼峰命名规则即可)。

User类 user表 说明
int id id int(20) 用户ID
String name name varchar(30) 用户名
String pwd pwd varchar(30) 密码

UserMapper接口类

public interface UserMapper {
    //查询所有User
    List<User> selectUser();
}

UserMapper.xml(片段)

    <select id="selectUser" resultType="com.piao.pojo.User">
      select id,name,pwd from user
    select>

将User类当中的pwd属性名改为password之后再测试查找user的方法时, 查询出来发现 password 为null

//查询所有用户结果
User{id=2, name='张三', pasword='null'}
User{id=3, name='李四', password='null'}
User{id=5, name='赵六', password='null'}

因为MyBatis ResultMap自动映射是找User类中名为pwd的属性和对应的set方法,没找到,所以password 为空,这时候就需要手动映射了。

1.2 ResultMap手动映射⚡️

在UserMapper.xml修改如下,添加ResultMap

(resultMap标签中的type可使用alias设置的类别名)

<resultMap id="UserMap" type="com.piao.pojo.User">
   
   <id column="id" property="id"/>
   
   <result column="name" property="name"/>
   <result column="pwd" property="password"/>
resultMap>

<select id="selectUser" resultMap="UserMap">
    select id,name,pwd from user
select>

select标签中的 resultType=“com.piao.pojo.User” 就可以替换成 resultMap="UserMap"

再次测试查询所有用户,结果如下:

User{id=2, name='张三', password='abcdef'}
User{id=3, name='李四', password='987654'}
User{id=5, name='赵六', password='13100'}

2.MyBatis与日志

MyBatis日志作用:如果一个 数据库相关的操作出现了问题,我们可以根据输出的SQL语句快速排查问题。

Mybatis内置的日志工厂提供日志功能,具体的日志实现有以下几种工具:

  • SLF4J
  • Apache Commons Logging
  • Log4j 2
  • Log4j
  • JDK logging

具体选择哪个日志实现工具由MyBatis的内置日志工厂确定。它会使用最先找到的(按上文列举的顺序查找)。如果一个都未找到,日志功能就会被禁用。

2.1 导入log4j依赖:

<dependency>
   <groupId>log4jgroupId>
   <artifactId>log4jartifactId>
   <version>1.2.17version>
dependency>

2.2 编写配置文件log4j.properties

详细可参考这位大佬的博客

Log4j框架配置文件log4j.properties配置使用详解

在应用的类路径中创建一个名为 log4j.properties 的文件,文件的具体内容如下:

# 全局日志配置
log4j.rootLogger=ERROR, stdout
# MyBatis 日志配置
log4j.logger.com.piao.dao.BlogMapper=TRACE
# 控制台输出
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n

#上述配置将使 Log4J 详细打印 com.piao.dao.BlogMapper 的日志,对于应用的其它部分,只打印错误信息。
#会将SQL打印到控制台

2.3在mybatis-config.xml 配置日志

<settings>
   <setting name="logImpl" value="LOG4J"/>
settings>

配置文件规定的配置顺序:

The content of element type “configuration” must match “(properties?,settings?,typeAliases?,typeHandlers?,objectFactory?,objectWrapperFactory?,reflectorFactory?,plugins?,environments?,databaseIdProvider?,mappers?)”.

所以settings应该写在properties之后。

2.4 使用log4j在Java中输出日志信息

导包:import org.apache.log4j.Loggerstatic

实例化Logger Logger logger = Logger.getLogger(MyTest.class);

使用logger输出不同级别的日志

  • logger.info(“info:xxxx”);
  • logger.debug(“debug:xxxxx”);
  • logger.error(“error: xxxxx”);

之后便可在控制台或者配置好的日志文件中看到输出的日志信息。

3.分页的多种实现方式

分页查询目的:缓解数据库压力(数据库),提升用户体验(前端显示)

3.1 SQL语句实现分页(limit关键字)

可参考之前的MySQL笔记: MySQL学习笔记(5)——JOIN联表查询,自连接查询,分页和排序,子查询与嵌套查询

  • LIMIT 起始值,每页的大小
--下标从0开始 LIMIT 0,3  [0,3)即0,1,2 不包括3
-- 分页  每页3个
SELECT majorname,number FROM major LIMIT 2;  -- 前两个条数据
SELECT majorname,number FROM major LIMIT 0,3;  -- 第一页  第一1到第三3条数据
SELECT majorname,number FROM major LIMIT 3,3;  -- 第二页  第一4到第一6条数据
SELECT majorname,number FROM major LIMIT 6,3;  -- 第三页  第一7到第一9条数据

-- 查询某条数据之后的所有数据,可指定第二数为-1 
SELECT * FROM table LIMIT 10,-1; // 检索记录行 下标为10的数据到最后一条  

-- LIMIT n 等价于 LIMIT 0,n。

公式:SELECT 字段 FROM 表 ... LIMIT (n-1)*pageSize,pageSize

  • 参数:n:当前页
  • pagesize:页面大小
  • (n-1)*pageSize:起始值
  • 总页数=数据总数/页面大小

这样的分页,需要传递两个参数:开始的下标startIndex和页面大小pageSize

mapper接口(片段)

//选择全部用户实现分页
List selectUser(Map map);

UserMapper.xml(片段)

<select id="selectUser" parameterType="map" resultType="user">
  select * from user limit #{startIndex},#{pageSize}
select>

测试:

起始下标startIndex = (currentPage-1)*pageSize

   int currentPage = 1;  //第几页
   int pageSize = 2;  //页面大小
   Map<String,Integer> map = new HashMap<String,Integer>();
   map.put("startIndex",(currentPage-1)*pageSize);
   map.put("pageSize",pageSize);

   List<User> users = mapper.selectUser(map);

查询第n页时,currentPage传递n即可。

3.2 MyBatis中Sqlsession+RowBounds实现分页(不推荐用)

了解即可

UserMapper接口(片段)

//选择全部用户实现分页
List getUserByRowBounds();

UserMapper.xml(片段) 直接查询所有