当前位置: 首页 > news >正文

Mybatis -- resultMap以及分页

查询为null问题
要解决的问题:属性名和字段名不一致
环境:新建一个项目,将之前的项目拷贝过来
1、查看数据库的字段名
2、Java中的实体类设计

public class User {
private int id; //id
private String name; //姓名
private String password; //密码和数据库不一样!数据库中字段名为pwd
//构造
//set/get
//toString()
}

3、接口
//根据id查询用户

User selectUserById(int id);

4、mapper映射文件

select * from user where id = #{id}

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 ; 【自动映射】
解决方案
方案一:为列名指定别名 , 别名和java实体类的属性名一致 .

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

方案二:使用结果集映射->ResultMap 【推荐】

<resultMap id="UserMap" type="User">
<!-- id为主键 -->
<id column="id" property="id"/>
<!-- column是数据库表的列名 , 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 的设计思想是,对于简单的语句根本不需要配置显式的结果映射,而对于复杂一点的语句只需要描述它们的关
系就行了。
你已经见过简单映射语句的示例了,但并没有显式指定 resultMap。比如:

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

上述语句只是简单地将所有的列映射到 HashMap 的键上,这由 resultType 属性指定。虽然在大部分情况下都够用,但
是 HashMap 不是一个很好的模型。你的程序更可能会使用 JavaBean 或 POJO(Plain Old Java Objects,普通老式
Java 对象)作为模型。
ResultMap 最优秀的地方在于,虽然你已经对它相当了解了,但是根本就不需要显式地用到他们。
手动映射
1、返回值类型为resultMap

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

2、编写resultMap,实现手动映射!

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

之后会使用到一些高级的结果集映射,association,collection这些

日志工厂

思考:我们在测试SQL的时候,要是能够在控制台输出 SQL 的话,是不是就能够有更快的排错效率?
如果一个 数据库相关的操作出现了问题,我们可以根据输出的SQL语句快速排查问题。
对于以往的开发过程,我们会经常使用到debug模式来调节,跟踪我们的代码执行过程。但是现在使用Mybatis是基于接口,配置文件的源代码执行过程。因此,我们必须选择日志工具来作为我们开发,调节程序的工具。
Mybatis内置的日志工厂提供日志功能,具体的日志实现有以下几种工具:

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

标准日志实现

指定 MyBatis 应该使用哪个日志记录实现。如果此设置不存在,则会自动发现日志记录实现。

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

注意:名字一定不要写错,注意不要加无关的空格
测试,可以看到控制台有大量的输出!我们可以通过这些输出来判断程序到底哪里出了Bug

使用Log4j

1、导入log4j的包

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

2、配置文件编写
#将等级为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、在程序中使用Log4j进行输出!
//注意导包:org.apache.log4j.Logger
static Logger logger = Logger.getLogger(MyTest.class);

@Test
public void selectUser() {
logger.info("info:进入selectUser方法");
logger.debug("debug:进入selectUser方法");
logger.error("error: 进入selectUser方法");
SqlSession session = MybatisUtils.getSession();
UserMapper mapper = session.getMapper(UserMapper.class);
List<User> users = mapper.selectUser();
for (User user: users){
System.out.println(user);
}
session.close();
}

5、测试,看控制台输出!

limit实现分页

原因:查询大量数据的时候,我们往往使用分页进行查询,也就是每次处理小部分数据,这样对数据库压力就在可控范围内。
使用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文件

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

2、Mapper接口,参数为map
//选择全部用户实现分页
List selectUser(Map<String,Integer> map);
3、在测试类中传入参数测试
起始位置 = (当前页面 - 1 ) * 页面大小

//分页查询 , 两个参数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);
}
session.close();
}

RowBounds分页

我们除了使用Limit在SQL层面实现分页,也可以使用RowBounds在Java代码层面实现分页,当然此种方式作为了解即
可。
步骤:
1、mapper接口
//选择全部用户RowBounds实现分页
List getUserByRowBounds();
2、mapper文件

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

3、测试类
在这里,我们需要使用RowBounds类

@Test
public void testUserByRowBounds() {
SqlSession session = MybatisUtils.getSession();
int currentPage = 2; //第几页
int pageSize = 2; //每页显示几个
RowBounds rowBounds = new RowBounds((currentPage-1)*pageSize,pageSize);
//通过session.**方法进行传递rowBounds,[此种方式现在已经不推荐使用了]
List<User> users = session.selectList("com.kuang.mapper.UserMapper.getUserByRowBounds", null, rowBounds);
for (User user: users){
System.out.println(user);
}
session.close();
}

PageHelper

相关文章:

Mybatis -- resultMap以及分页

查询为null问题 要解决的问题&#xff1a;属性名和字段名不一致 环境&#xff1a;新建一个项目&#xff0c;将之前的项目拷贝过来 1、查看数据库的字段名 2、Java中的实体类设计 public class User { private int id; //id private String name; //姓名 private String passwo…...

Linux之进程

一.冯诺依曼体系 在计算机中&#xff0c;CPU&#xff08;中央处理器&#xff09;是不直接跟外部设备直接进行通信的&#xff0c;因为CPU处理速度太快了&#xff0c;而设备的数据读取和输入有太慢&#xff0c;而是CPU以及外设直接跟存储器&#xff08;内存&#xff09;打交道&am…...

结构体——“C”

各位CSDN的uu们你们好呀&#xff0c;今天&#xff0c;小雅兰的内容是结构体噢&#xff0c;之前我们在初始C语言中其实就已经学习过了结构体的知识&#xff0c;但是不是很全面&#xff0c;这次&#xff0c;我们也只是稍微详细一点&#xff0c;敬请期待小雅兰之后的博客&#xff…...

CCNP350-401学习笔记(51-100题)

51、Which statement about a fabric access point is true?A. It is in local mode and must be connected directly to the fabric edge switch. B. It is in local mode and must be connected directly to the fabric border node C. It is in FlexConnect mode and must …...

C语言学习_DAY_4_判断语句if_else和分支语句switch_case【C语言学习笔记】

高质量博主&#xff0c;点个关注不迷路&#x1f338;&#x1f338;&#x1f338;&#xff01; 目录 1.案例引入 2.if判断语句的语法与注意事项 3.switch多分支语句的语法与注意事项 前言: 书接上回&#xff0c;我们已经学习了所有的数据类型、运算符&#xff0c;并且可以书写…...

实验07 赫夫曼编码及综合2022(带程序填空)

A. 【程序填空】赫夫曼编码题目描述给定n个叶子的权值&#xff0c;根据这些权值构造huffman树&#xff0c;并输出huffman编码参考课本第6.6节的算法6.12&#xff0c;注意算法中数组访问是从位置1开始赫夫曼构建中&#xff0c;默认左孩子权值不大于右孩子权值如果遇到两个孩子权…...

分布式 CAP BASE理论

文章目录CAP简介不是所谓的“3 选 2”CAP 实际应用案例BASE简介BASE 理论的核心思想总结CAP 简介 在理论计算机科学中&#xff0c;CAP 定理&#xff08;CAP theorem&#xff09;指出对于一个分布式系统来说&#xff0c;当设计读写操作时&#xff0c;只能同时满足以下三点中的…...

三调地类筛选器,Arcgis地类筛选

三调地类在使用是&#xff0c;需要分类统计&#xff0c;这个可以用于筛选&#xff1b; 标准地类筛选 农用地&#xff1a; DLBM IN(0303,0304,0306,0402,0101,0102,0103,0201,0201K,0202,0202K,0203,0203K,0204,0204K,0301,0301K,0302,0302K,0305,0307,0307K,0401,0403,0403K…...

华为OD机试 - 密室逃生游戏(Python)

密室逃生游戏 题目 小强增在参加《密室逃生》游戏,当前关卡要求找到符合给定 密码 K(升序的不重复小写字母组成) 的箱子, 并给出箱子编号,箱子编号为 1~N 。 每个箱子中都有一个 字符串 s ,字符串由大写字母、小写字母、数字、标点符号、空格组成, 需要在这些字符串中…...

白话C#之委托

一、什么是委托&#xff1f; 书本上是这样来定义委托的&#xff1a; 委托是一种动态调用方法的类型&#xff0c;属于引用型。委托是对方法的抽象和封装。委托对象实质上代表了方法的引用&#xff08;即内存地址&#xff09;。委托通常是委托某个方法来实现具体的功能。当我们调…...

jsp高校教职工管理系统Myeclipse开发mysql数据库web结构java编程计算机网页项目

一、源码特点 jsp 高校教职工管理系统 是一套完善的web设计系统&#xff0c;对理解JSP java编程开发语言有帮助mvc模式 serlvetdaobean方式开发&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式 开发。开发环境为TOMCAT7.0,Myeclipse8.5开发&#…...

2023年数学建模美赛A题(A drought stricken plant communities)分析与编程

2023年数学建模美赛A题&#xff08;A drought stricken plant communities&#xff09;分析与编程 2023年数学建模美赛D题&#xff08;Prioritizing the UN Sustainability Goals&#xff09;分析与编程 特别提示&#xff1a; 1 本文介绍2023年美赛题目&#xff0c;进行深入分析…...

Delphi 中自定义鼠标指针图像

Dephi中的鼠标指针是可以自由定义的&#xff0c;如果是使用系统提供的图标&#xff0c;那么直接通过可视控件的Cursor属性赋值就可以。例如设置Form的鼠标为 crHourGlass 沙漏&#xff1a;Form1.Cursor : crHourGlass;也可以在设计期&#xff08;IDE环境中&#xff09;直接更改…...

【计算机网络】物理层

文章目录物理层的基本概念传输媒体同轴电缆双绞线光纤电力线电磁波红外线可见光传输方式串行传输和并行传输同步传输和异步传输单工&#xff0c;半双工​以及全双工通信编码与调制常用编码不归零编码归零编码曼彻斯特编码差分曼彻斯特编码基本调制混合调制信道的极限容量奈氏准…...

华为OD机试 - 最少停车数(Python)

最少停车数 题目 特定大小的停车场 数组cars表示 其中1表示有车0表示没车 车辆大小不一,小车占一个车位(长度1) 货车占两个车位(长度2) 卡车占三个车位(长度3) 统计停车场最少可以停多少辆车 返回具体的数目 输入 整型字符串数组cars 其中1表示有车0表示没车 数组长度 <…...

面试题-前端开发JavaScript篇上(答案超详细)

文章目录 闭包说一下类的创建和继承如何解决异步回调地狱说说前端中的事件流如何让事件先冒泡后捕获说一下事件委托说一下图片的懒加载和预加载mouseover 和 mouseenter 的区别JS 的 new 操作符做了哪些事改变函数内部 this 指针的指向函数(bind,apply,call 的区别)JS 的各种…...

【计算机网络】运输层

文章目录运输层概述运输层端口号、复用与分用的概念UDP和TCP的对比TCP的流量控制TCP的拥塞控制TCP超时重传时间的选择TCP可靠传输的实现TCP的运输连接管理TCP的连接建立(3次握手)TCP的连接释放(4次挥手)TCP报文段的首部格式运输层概述 这里我们对运输层进行概述&#xff0c;之…...

20222023华为OD机试 - 基站维修工程师(Python)

基站维修工程师 题目 小王是一名基站维护工程师,负责某区域的基站维护。 某地方有 n 个基站( 1<n<10 ),已知各基站之间的距离 s( 0<s<500 ), 并且基站 x 到基站 y 的距离,与基站 y 到 基站 x 的距离并不一定会相同。 小王从基站 1 出发,途经每个基站 1 …...

21. 合并两个有序链表

题目链接&#xff1a;解题思路&#xff1a;遍历&#xff0c;双指针&#xff1a;因为两个链表有序&#xff0c;所以只需要依次比较两个元素的大小&#xff0c;然后添加到新的链表中即可first指针指向第一个链表l1&#xff0c;second指针指向第二个链表l2&#xff0c;answer保存合…...

产品经理知识体系:5.如何做好产品数据分析?

数据分析 思考 笔记 数据分析 思路 基于用户路径&#xff1a;用户的活动路径&#xff0c;操作流程等行为数据。 基于产品节点&#xff1a;转化率、占比 分析类型 先定性&#xff1a;先抛出问题、提出假设 再定量&#xff1a;数据验证问题、验证假设 先定性、再定量、最后得…...

详解垃圾回收算法,优缺点是什么?|金三银四系列

本文详细介绍了在 JVM 中如何判断哪些对象是需要回收的&#xff0c;以及不同的垃圾回收算法以及优缺点。点击上方“后端开发技术”&#xff0c;选择“设为星标” &#xff0c;优质资源及时送达上篇文章详细介绍了 JVM 的结构以及其内存结构&#xff0c;需要阅读请移步。本文主要…...

Android 虚拟 A/B 详解(七) SnapshotManager 之标识文件

本文为洛奇看世界(guyongqiangx)原创,转载请注明出处。 原文链接:https://blog.csdn.net/guyongqiangx/article/details/129098176 Android 虚拟 A/B 分区《Android 虚拟 A/B 分区》系列,更新中,文章列表: Android 虚拟 A/B 详解(一) 参考资料推荐Android 虚拟 A/B 详解(二…...

LA@生成子空间@范数@衡量矩阵大小@正交化

文章目录线性组合与线性方程组生成子空间范数LpL^pLp范数向量点积用范数表示ref衡量矩阵大小特殊类型矩阵和向量对角阵向量长度性质单位向量向量单位化(正规化)正交向量正交正交向量组标准正交基正交化(schmidt)正交矩阵矩阵是正交矩阵的充要条件对称矩阵正交相似概念区分&…...

MT2012_竹鼠的白色季节

竹鼠的白色季节 #include<bits/stdc.h> #include<algorithm> using namespace std;/*思路&#xff1a;从小到大排序&#xff0c;然后依次往后遍历即可*/ int main( ) {int n,d;cin>>n>>d; int tmp;vector<int>nums;for(int i0;i<n;i){cin&…...

MySQL是什么?它有什么优势?

随着时间的推移&#xff0c;开源数据库在中低端应用中逐渐流行起来&#xff0c;占据了很大的市场份额。开源数据库具有免费使用、配置简单、稳定性好、性能优良等特点&#xff0c;而 MySQL 数据库正是开源数据库中的杰出代表。 开源全称为“开放源代码”。很多人认为开源软件最…...

基础篇—CSS padding(填充\内边距)解析

CSS padding(填充) CSS padding(填充)是一个简写属性,定义元素边框与元素内容之间的空间,即上下左右的内边距。 属性说明padding使用简写属性设置在一个声明中的所有填充属性padding-bottom设置元素的底部填充padding-left设置元素的左部填充padding-right设置元素的右部…...

二进制枚举

一、左移&#xff1a;用来将一个数的各二进制位全部左移n位&#xff0c;低位以0补充&#xff0c;高位越界后舍弃。n左移1位&#xff0c;n<<1&#xff0c;相当于2*n1左移n位&#xff0c;1<<n&#xff0c;相当于2^n二、右移&#xff1a;将一个数的各二进制位右移N位&…...

2|数据挖掘|聚类分析|k-means/k-均值算法

k-means算法k-means算法&#xff0c;也被称为k-平均或k-均值&#xff0c;是一种得到最广泛应用的聚类算法。算法首先随机选择k个对象&#xff0c;每个对象初始地代表了一个簇的平均值或中心。对剩余的每个对象根据其与各个簇中心的距离&#xff0c;将它赋给最近的簇。然后重新计…...

使用和制作动、静态库

文章目录什么是库&#xff1f;静态库打包方式使用方式生成并执行可执行程序粗暴方式优化方式动态库不一样的.o文件打包方式使用方式生成可执行程序运行可执行程序无法运行时的解决方案动静态库与动静态链接什么是库&#xff1f; 从一开始的helloworld&#xff0c;到现在熟练使…...

【Java基础】023 -- 集合进阶(List、Set、泛型、树)

目录 一、集合的体系结构 1、单列集合&#xff08;Collection&#xff09; 二、Collection集合 1、Collection常见方法 ①、代码实现&#xff1a; ②、contains方法重写equals方法示例&#xff1a;&#xff08;idea可自动重写&#xff09; 2、Collection的遍历方式&#xff08;…...

福州建设厅官方网站/国产系统2345

CSMA/CD&#xff08;CarrierSenseMultipleAccesswithCollisionDetection&#xff09;即带冲突检测的载波监听多路访问技术(载波监听多点接入/碰撞检测)。在传统的共享以太网中&#xff0c;所有的节点共享传输介质。如何保证传输介质有序、高效地为许多节点提供传输服务&#xf…...

新乡模板建站/天津seo优化排名

2019独角兽企业重金招聘Python工程师标准>>> Github 转载于:https://my.oschina.net/u/612750/blog/3019795...

如何自己做网站发布到服务器上面/河南靠谱seo电话

前边有一篇记录过不使用spring&#xff0c;直接在java代码中连接和操作mongodb数据库&#xff0c;这里就紧随其后记录一下使用spring的情况下&#xff0c;在java中简单操作mongodb。maven导包配置&#xff1a;因为涉及了sping以及springmvc&#xff0c;因此也需要导入它们相关的…...

上海知名网站建设公司排名/杭州专业seo

Shell基本概念及编程这个系统写了很多东西&#xff0c;但实际上还没有真正的写过一个脚本。那么为什么没写呢&#xff1f;因为SHELL脚本程序基实就是Shell 命令语句的集合&#xff0c;保存成以sh后缀的文件文件&#xff0c;执行时需要执行权限。通常一个标准的SHELL脚本包含如下…...

商城网站建设是什么/东莞做网站的联系电话

1.状态栏状态栏一般高度为20像素&#xff0c;在打手机或者显示消息时会放大到40像素高&#xff0c;注意&#xff0c;两倍高度的状态栏在好像只能在纵向的模式下使用。如下图用户可以隐藏状态栏&#xff0c;也可以将状态栏设置为灰色&#xff0c;黑色或者半透明的黑色。如果需要…...

wordpress动漫图片主题/做seo网页价格

最近有朋友在咨询天兴工作室zblogphp调用某个栏目内的文章怎么调用&#xff1f;调用后想第一篇文章和后面的用不同的显示界面怎么搞&#xff1f;本文就来上示例代码并尝试解释下。先上代码&#xff1a; {foreach Getlist(10,2,null,null,null,null,array(has_subcate>true))…...