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

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


参考: 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 idid int(20)用户ID
String namename varchar(30)用户名
String pwdpwd 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为主键 -->
   <id column="id" property="id"/>
   <!-- column是数据库表的列名 , property是对应实体类的属性名 -->
   <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>log4j</groupId>
   <artifactId>log4j</artifactId>
   <version>1.2.17</version>
</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<User> selectUser(Map<String,Integer> 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<User> getUserByRowBounds();

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

<select id="getUserByRowBounds"resultType="user">
  select * from user;
</select>

获取sqlsession后测试UserMapper接口

   int currentPage = 2;  //第几页
   int pageSize = 2;  //每页显示几个
   RowBounds rowBounds = new RowBounds((currentPage-1)*pageSize,pageSize);

   //通过session.**方法进行传递rowBounds,[此种方式现在已经不推荐使用了]
List<User> users = sqlsession.selectList("com.piao.mapper.UserMapper.getUserByRowBounds", null, rowBounds);
3.3 第三方插件PageHelper(推荐使用⚡️)

官方网址: https://pagehelper.github.io/

官方教程(很详细!👍): https://pagehelper.github.io/docs/howtouse/

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值