atwood-pan

 

MyBatis03——ResultMap和分页相关

ResultMap和分页相关

当属性名和字段名不一致的时候

解决方法
1、数据库中创建user表
字段 id、name、pwd
2、Java中的实体类

@Data
public class User {

   private int id;  //id
   private String name;   //姓名
   private String password;   //密码和数据库不一样!
}

3、接口以及方法

User selectUserById(int id);

4、在Mapper.xml中编写sql

<select id="selectUserById" resultType="user">
  select * from user where id = #{id}
</select>

5、测试

@Test
public void testSelectUserById() {
   SqlSession session = MybatisUtils.getSession();  //获取SqlSession连接
   UserMapper mapper = session.getMapper(UserMapper.class);
   User user = mapper.selectUserById(1);
   System.out.println(user);
   session.close();
}

测试结果:

  • User{id=1, name=‘盼盼’, password=‘null’}
  • 我们通过查询发现password字段反馈结果为空,这就说明我们的代码是有错误的

分析:

  • select * from user where id = #{id}可以看成
    select id,name,pwd from user where id = #{id}
  • 这儿我们了解到,在Mybatis中有自动映射机制,即根据查询的列名去对应的实体类中查找相应列名的set方法设值,由于找不到setPwd(),所以password返回NULL

解决方案

1、为列名起别名(用as),这里的别名和Java实体类中的属性名一致

<select id="selectUserById" resultType="User">
	select id,name,pwd as password from user where id =#{id}
</select>

2、使用结果集映射>>>>ResultMap
强烈推荐

<resultMap id="UserMap" type="User">
	<!-- id为主键-->
	<id column = "id" property = "id"/>
	<!--cloumn是数据库的列名,property是实体类的属性名-->
	<result column = "name" property = "name"/>
	<result column = "pwd" property = password/>
</resultMap>

<select id = "selectUserById" resultMap = "UserMap">
	select id,name,pwd from user where id = #{id}
</select>

ResultMap

自动映射

  • resultMap元素是MyBatis中最重要最强大的元素。他可以让你从90%的JDBC(ResultSets)数据提取代码中解放出来。
  • 实际上,在为一些比如链接的复杂语句编写映射代码的时候,一份resultMap能够代替实现同等功能的代码。
  • ResultMap的设计思想是,对于简单的语句根本不需要配置显式的结果映射,而对于复杂一点的语句只需要描述他们的关系就行了。

日志工厂

日志实现工具:

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

标准日志实现

通过在setting中设置,指定应该使用那个日志记录实现。

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

Log4j

使用步骤

1、导入log4j相关jar包

<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/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、settin指定日志实现

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

分页实现

limit实现分页

# 语法
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)* 页面大小
植入mapper

步骤

1、 修改Mapper

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

2、Mapper接口,参数为map

List<User> selectUser(Map<String,Integer> map);

3、测试

//分页查询 , 两个参数startIndex , pageSize
@Test
public void testSelectUser() {
   SqlSession session = MybatisUtils.getSession();
   UserMapper mapper = session.getMapper(UserMapper.class);

   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);

   for (User user: users){
       System.out.println(user);
  }
}

posted on 2021-04-13 14:43  JavaCoderPan  阅读(17)  评论(0编辑  收藏  举报  来源

导航