欢迎您访问365答案网,请分享给你的朋友!
生活常识 学习资料

【狂神说MyBatisx--end】ResultMap&其他

时间:2023-07-30

微信狂神说公众号笔记03-07
狂神说网站05-11

1.resultMap【重点实验内容】

解决一个问题:实体类成员变量名称和数据库查询名称不一致。

自动映射:
实体类成员变量名称和数据库查询名称一样会自动映射。
核心配置文件设置,默认是PARTIAL,对嵌套结果不会自动映射。开启FULL则对相同名称的字段自动映射。


普通手动映射
property 实体类成员变量名
column 数据库查询的字段名(或别名)

多对一
多个学生对应一个老师。每一个学生关联到一个老师。

子查询方法:
先找到每个学生。再根据学生的tid(老师ID)外键去找老师。
优点:SQL简单,分步复合常规思维。
缺点:慢。映射参数稍微多一点。判断是否正确难。

1.指定父查询的resultMap的studentTeacher。不要弄成resultType了(报错过)。
2.resultMap。IDEA会自动补全填id(映射名)和type(返回类型)。
关联用association。
property 需映射的实体类属性名。
column 传入字段作为子查询的查询参数。可以指定多个参数{id=author_id,likename=author_name}。
javaType 说明返回类型。
select指定子查询方法。
整一个association标签可以这么想:关联关系,现在对property属性映射,传入column,返回javaType,通过select方法。
用代码说明的形式是:property = (javaType) select(column)

select * from teacher where id = #{tid}

联表查询方法
优点:代码行少。association参数少。通过SQL可以检查。
缺点:对SQL语句要求高。要取别名。

select * from teacher select t.id id,t.name name,s.id sid,s.name sname from teacher t join student s on( s.tid = t.id )

小不同:集合-联表查询要填的是ofType,关联-联表查询要填的是JavaType。可能是collection可以自动推断javaType是某个List。
collection下面的result相当于进一步构造student的结构和映射内容。
实验发现:集合-联表查询比集合-子查询要多说明一个或者才能获取理想结果(【一条】记录老师,里面的学生列表有【多个】),否则不加说明,结果就是SQL联表查询的【多条】记录。
正常:

屏蔽id后:

2.动态SQL
where 自动去头部and / or
if
set 自动去尾部,
choose-when
trim 自由度高
foreach(JAVA传入集合来遍历生成)
sql片段复用(select投影、where条件等)

3.日志
设置日志 log4j
logImpl还有标准日志
核心配置文件设置

resources添加一个log4j.properties

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

使用日志输出

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

4.分页
limit #{startIndex}, #{pageSize}
rowBounds 获取Mapper的第一种方法,selectList有重载方法,传入一个rowBounds对象来控制分页。了解。
有分页插件。知道。

5.利用注解开发
简单的增删改查,用相应英文的参数。
参数别名@Param(p1),在Dao/Mapper层写接口的参数中指定。在*Mapper.xml文件中#{p1}的参数对应起来。
似乎还有#{org0…n},#{param1…n}的下标来对应接口传入多参数的情况。
简单的注解无法适应复杂的结果映射。
实际上,狂神视频中没提到,ResultMap配置文件的操作有相应的注解实现,不过会显得接口代码很乱。

6.缓存
一级缓存,放在SqlSession,提供缓存给下一次查询。查询缓存后,如果发生增加、删除、更新,则缓存失效。SqlSession关闭,手动清除缓存,则缓存失效。
二级缓存,SqlSession关闭放到Mapper,提供缓存给其他SqlSession。
用户访问流程:先问二级缓存,再问一级缓存。

Copyright © 2016-2020 www.365daan.com All Rights Reserved. 365答案网 版权所有 备案号:

部分内容来自互联网,版权归原作者所有,如有冒犯请联系我们,我们将在三个工作时内妥善处理。