栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

【狂神说MyBatis x--end】ResultMap&其他

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

【狂神说MyBatis x--end】ResultMap&其他

微信狂神说公众号笔记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.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

使用日志输出

    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。
用户访问流程:先问二级缓存,再问一级缓存。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/728019.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号