MyBatis篇(五)ResultMap、日志、分页

ResultMap 解决属性名和字段名不一致

说白了就是数据库的字段名与Java中的实体类设计不一致导致的问题
在这里插入图片描述
在这里插入图片描述
接口:

//根据用户ID查询用户
    User getUserByid(int id);

配置:

 <select id="getUserByid" resultType="com.ni.pojo.User" parameterType="int">
        select*from mybatis.user where id=#{id}
    </select>

测试:

  @Test
    public void Test(){
        //第一步 获取sqlsession对象
        SqlSession sqlsession = MyBatisUtils.getSession();
        //第二步,执行sql
        UserMapper userMapper = sqlsession.getMapper(UserMapper.class);
        User user = userMapper.getUserByid(3);
         System.out.println(user);
        //关闭sqlsession
        sqlsession.close();
    }

结果:
在这里插入图片描述
查询出来发现 password 为空 . 说明出现了问题!

分析

select * from user where id = #{id} 可以看做

select  id,name,pwd  from user where id = #{id}

mybatis会根据这些查询的列名(会将列名转化为小写,数据库不区分大小写) , 去对应的实体类中查找相应列名的set方法设值 , 由于找不到setPwd() , 所以password返回null ; 【自动映射】

解决方案一:起别名(暴力解法、简单)
思想:将pwd起一个别名password,它会自动通过别名进行查找

<select id="getUserByid" resultType="com.ni.pojo.User" parameterType="int">
        select id,name,pwd as password from mybatis.user where id=#{id}
    </select>

在这里插入图片描述
方案二:编写resultMap,实现手动映射
resultMap 元素是 MyBatis 中最重要最强大的元素。
ResultMap 的设计思想是,对简单的语句做到零配置,对于复杂一点的语句,只需要描述语句之间的关系就行了。

 <!--id代表的是接口里面定义的方法,resultType 返回类型 要写它的权限类名(一定要注意)-->
    <!--select查询语句-->
<!--结果集映射-->
    <!--id 对应<select 语句中resultMap中的id一定要一致-->
    <!--type就是原来resultType的类型,也就是说你准备返回什么样的类型就写什么样的-->
    <resultMap id="UserMap" type="User">
        <!--这里result 有两个属性column表示数据库中的字段 property 表示实体类中的属性,也就是你定义的和数据库一一对应的变量-->
        <result column="id" property="id"/>
        <result column="name" property="name"/>
        <result column="pwd" property="password"/>
    </resultMap>
    <select id="getUserByid"  resultMap="UserMap">
        select * from mybatis.user where id=#{id}
    </select>

日志

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

对于以往的开发过程,我们会经常使用到debug模式来调节,跟踪我们的代码执行过程。但是现在使用Mybatis是基于接口,配置文件的源代码执行过程。因此,我们必须选择日志工具来作为我们开发,调节程序的工具。
在这里插入图片描述
Mybatis内置的日志工厂提供日志功能,具体的日志实现有以下几种工具:

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

<!--外部配置文件,优先-->
 <properties resource="db.properties"/>

    <settings>
        <!--标准的日志工厂*注意空格-->
        <setting name="logImpl" value="STDOUT_LOGGING"/>
    </settings>

在这里插入图片描述
2.Log4j
2.1Log4j是什么?
Log4j是Apache的一个开源项目

通过使用Log4j,我们可以控制日志信息输送的目的地:控制台,文本,GUI组件…

我们也可以控制每一条日志的输出格式;

通过定义每一条日志信息的级别,我们能够更加细致地控制日志的生成过程。最令人感兴趣的就是,这些可以通过一个配置文件来灵活地进行配置,而不需要修改应用的代码。

2.2使用步骤

1、导入log4j的包

<dependency>
    <groupId>log4j</groupId>
    <artifactId>log4j</artifactId>
    <version>1.2.17</version>
</dependency>

2.配置文件编写 log4j.propertis

#将等级为DEBUG的日志信息输出到console和file这两个目的地,console和file的定义在下面的代码
log4j.rootLogger=DEBUG,console,file
 
#控制台输出的相关设置
log4j.appender.console = org.apache.log4j.ConsoleAppender
log4j.appender.console.Target = System.out
log4j.appender.console.Threshold=DEBUG
log4j.appender.console.layout = org.apache.log4j.PatternLayout
log4j.appender.console.layout.ConversionPattern=[%c]-%m%n
 
#文件输出的相关设置
log4j.appender.file = org.apache.log4j.RollingFileAppender
log4j.appender.file.File=./log/kuang.log
log4j.appender.file.MaxFileSize=10mb
log4j.appender.file.Threshold=DEBUG
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=[%p][%d{yy-MM-dd}][%c]%m%n
 
#日志输出级别
log4j.logger.org.mybatis=DEBUG
log4j.logger.java.sql=DEBUG
log4j.logger.java.sql.Statement=DEBUG
log4j.logger.java.sql.ResultSet=DEBUG
log4j.logger.java.sql.PreparedStatement=DEBUG

3、setting设置日志实现

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

4.直接测试
在这里插入图片描述

5、简单使用,在程序中使用Log4j进行输出!

 //获得当前类的反射对象
 public class UserMapperTest {

 static  Logger logger = Logger.getLogger(UserMapperTest.class);

    @Test
    public void testLog4j() {
        //logger.info 等价于System.out.println();
     logger.info("info:进入testLog4j");
     logger.debug("debug:进入testLog4j");
     logger.error("error:进入testLog4j");
//第一步 获取sqlsession对象
        SqlSession sqlsession = MyBatisUtils.getSession();
        //第二步,执行sql
        UserMapper userMapper = sqlsession.getMapper(UserMapper.class);
        User user = userMapper.getUserByid(3);
        System.out.println(user);
        //关闭sqlsession
        sqlsession.close();

        }
    }

在这里插入图片描述

分页

limit实现分页
为什么需要分页?
查询大量数据的时候,我们往往使用分页进行查询,也就是每次处理小部分数据,这样对数据库压力就在可控范围内。


#语法
stratIndex:起始位置
pageSize:页
SELECT * FROM table LIMIT stratIndex,pageSize

SELECT * FROM table LIMIT 5,10; // 检索记录行 6-15  
 
#为了检索从某一个偏移量到记录集的结束所有的记录行,可以指定第二个参数为 -1:   
SELECT * FROM table LIMIT 95,-1; // 检索记录行 96-last.  
 
#如果只给定一个参数,它表示返回最大的记录行数目:   
SELECT * FROM table LIMIT 5; //检索前 5 个记录行  
 
#换句话说,LIMIT n 等价于 LIMIT 0,n。 


在这里插入图片描述
在这里插入图片描述
步骤:
1、接口添加方法

 //分页查询
    List<User>selectUser(Map<String,Integer>map);

2.Mapper.xml修改配置

<!--分页查询-->
    <select id="selectUser" resultMap="UserMap" parameterType="map">
        select * from mybatis.user limit #{startIndex},#{pageSize}
    </select>

3.测试

@Test
    public void selectUser() {
        SqlSession sqlSession = MyBatisUtils.getSession();
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
        HashMap<String,Integer> map = new HashMap<>();
        map.put("startIndex",1);
        map.put("pageSize",3);
        List<User> userList = mapper.selectUser(map);
        for (User user: userList) {
            System.out.println(user);

        }
        sqlSession.close();


    }

4.结果
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小倪长头发啦

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值