Mybatis-04——【Mybatis的resultMap说明、log4j、以及分页的使用】

5、解决属性名与字段名不一至的问题

1、问题

测试

数据库字段

id  name  pwd

实体类属性

public class User {
    private Integer id;
    private String name;
    private String password;
}

发现实体类和数据库字段属性不一致、

测试

@org.junit.Test
public void getUserList(){
  //第一步:通过工具了获取sqlSession对象
  SqlSession sqlSession = MybatisUtils.getSqlSession();
  //通过getMapper里面传递接口的class
  UserMapper mapper = sqlSession.getMapper(UserMapper.class);
  //如何使用得出的对象点方法、就可以得出结果
  User user = mapper.getUserById(1);
  System.out.println(user);
  //关闭sqlSession
  sqlSession.close();
}

测试结果

User(id=1, name=小明, password=null)

测试结果发现password的值null、原因就是数据库字段和实体类属性名不一致、导致类型处理器找不到对应属性字段、结果为null

解决方法1:

  • 通过设置SQL设置字段别名、和实体类一致

    sqlselect * from user where id = #{id}sqlselect id,name,pwd as password from user where id = #{id}
    

    测试结果:

    User(id=1, name=小明, password=123456)
    

解决方法2

2、resultMap

resultMap :结果集映射。

数据库字段: id  name  pwd
实体类属性: id  name  password

xml映射文件(编写SQL的xml)

   <!--  结果集映射  -->
<resultMap id="getUser" type="user">
  <!--
    column : 字段、数据库中对的字段
    property : 属性、实体类中的属性
  -->
  <result column="pwd" property="password"/>
</resultMap>
<select id="getUserById" resultMap="getUser">
  select * from user where id = #{id}
</select>

xml映射文件属性名对应的值说明

标签:

  • resultMap:结果集映射
  • result:结果
  • select: 查询结果

属性:

  • select标签中的resultMap属性对应的值是为了绑定resultMap标签中的id属性的值
  • type:映射的结果类型
  • column:字段、数据库中对的字段、
  • property:属性、实体类中的属性

总结:

  • resultMap :结果集映射、一般用于复杂的SQL、简单的SQL用不上、
  • select标签中的resultMap 的值要和resultMap标签中id属性值对应上、相当于就是把他们两绑定在一起。
  • columnproperty的作用是、在数据库字段和实体类属性不一致的情况下使用、什么属性名不一样就绑上对应的实体类属性名、和数据库字段名

6、日志

6.1、日志工厂

mybatis中设置的日志实现

SLF4J | LOG4J | LOG4J2 | JDK_LOGGING | COMMONS_LOGGING | STDOUT_LOGGING | NO_LOGGING

在mybatis中具体选择哪一个实现日志、看在mybatis的核心配置文件中设置

  • STDOUT_LOGGING : 标准日志输出

在mybatis的核心配置文件配置默认日志实现

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

6.2、Log4j

什么是Log4j?

  • Log4j是apache的一个开源项目、通过使用log4j、我们可以控制日志输送的目的地是控制台、文件、GUI组件
  • 我们可以控制每一条日志的输出格式、
  • 通过定义每一条日志信息的级别、我们能够更加细致地控制日志的生成过程。
  • 通过一个配置文件来灵活的进行配置、而不需要修改应用代码。

Log4j的使用

1、先导Log4j的包

<!-- log4j日志 -->
<dependency>
  <groupId>log4j</groupId>
  <artifactId>log4j</artifactId>
  <version>1.2.17</version>
</dependency>

2、log4j.properties文件

#将等级为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/log.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 HH:mm:ss}][%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、配置log4j为日志的实现

<settings>
  <!-- 标准的日志实现  -->
  <setting name="logImpl" value="LOG4J"/>
</settings>

简单使用:

1、在要使用log4j的类、导入包 import org.apache.log4j.Logger; 注意不要导错、

2、使用

// 创建日志对象
private static Logger logger = Logger.getLogger(Test.class);
@org.junit.Test
  public void  a() {
  // 使用日志级别
  logger.info("info...");
  logger.debug("debug...");
  logger.error("error...");
}

7、分页

为什么要使用分页?

  • 减少数据的处理量、
  • 避免一次查询大量数据

使用limit实现分页

sql语法: select * from 表名 limit startIndex,pageSize;
-- 这种传递一个参数的就是查询0到3的数据
select * from 表名 limit 3;0,N】

7.1、使用mybatis做基本的分页

1、接口

 //分页
List<User> getUserByLimit(Map<String,Integer> map);

2、xxxxxmapper.xml

<!-- 分页   -->
<select id="getUserByLimit" parameterType="map" resultType="user">
	select * from user limit #{startIndex},#{pageSize}
</select>

3、测试

@org.junit.Test
public void getUserByLimit() {
    SqlSession sqlSession = MybatisUtils.getSqlSession();
    UserMapper mapper = sqlSession.getMapper(UserMapper.class);

    Map<String, Integer> map = new HashMap<>();
    map.put("startIndex",0);
    map.put("pageSize",3);
    List<User> userByLimit = mapper.getUserByLimit(map);
    for (User user : userByLimit) {
    System.out.println(user);
    }
    sqlSession.close();
}

7.2、RowBounds分页

1、接口

//分页2
List<User> getUserByRowBounds();

2、xxxmapper.xml

<!-- 分页2   -->
<select id="getUserByRowBounds" resultType="user">
   select * from user;
</select>

3、测试

@org.junit.Test
public void getUserByRowBounds() {
     SqlSession sqlSession = MybatisUtils.getSqlSession();
  
     RowBounds rowBounds = new RowBounds(0,2);
      List<User> list = sqlSession.selectList("com.wei.mapper.UserMapper.getUserByRowBounds",null,rowBounds);
       for (User user : list) {
         logger.info(user);
       }
  
     sqlSession.close();
}

这种分页是查询全部数据、然后通过RowBounds对象中的值来去数据库的数据0-几条数据

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值