视频原作者CSDN: https://blog.csdn.net/qq_33369905
这篇是自己整理了一下,以便自己复习。
以下这一段文字摘自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 id | id int(20) | 用户ID |
String name | name varchar(30) | 用户名 |
String pwd | pwd 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 为空,这时候就需要手动映射了。
在UserMapper.xml修改如下,添加ResultMap
(resultMap标签中的type可使用alias设置的类别名)
<resultMap id="UserMap" type="com.piao.pojo.User">
<id column="id" property="id"/>
<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'}
MyBatis日志作用:如果一个 数据库相关的操作出现了问题,我们可以根据输出的SQL语句快速排查问题。
Mybatis内置的日志工厂提供日志功能,具体的日志实现有以下几种工具:
具体选择哪个日志实现工具由MyBatis的内置日志工厂确定。它会使用最先找到的(按上文列举的顺序查找)。如果一个都未找到,日志功能就会被禁用。
<dependency>
<groupId>log4jgroupId>
<artifactId>log4jartifactId>
<version>1.2.17version>
dependency>
详细可参考这位大佬的博客
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打印到控制台
<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之后。
导包:import org.apache.log4j.Loggerstatic
实例化Logger Logger logger = Logger.getLogger(MyTest.class);
使用logger输出不同级别的日志
之后便可在控制台或者配置好的日志文件中看到输出的日志信息。
分页查询目的:缓解数据库压力(数据库),提升用户体验(前端显示)
可参考之前的MySQL笔记: MySQL学习笔记(5)——JOIN联表查询,自连接查询,分页和排序,子查询与嵌套查询
--下标从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
这样的分页,需要传递两个参数:开始的下标startIndex和页面大小pageSize
mapper接口(片段)
//选择全部用户实现分页
List selectUser(Map 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即可。
了解即可
UserMapper接口(片段)
//选择全部用户实现分页
List getUserByRowBounds();
UserMapper.xml(片段) 直接查询所有
获取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);
官方网址: https://pagehelper.github.io/
官方教程(很详细!): https://pagehelper.github.io/docs/howtouse/