微信狂神说公众号笔记03-07
狂神说网站05-11
解决一个问题:实体类成员变量名称和数据库查询名称不一致。
自动映射:
实体类成员变量名称和数据库查询名称一样会自动映射。
核心配置文件设置,默认是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)
联表查询方法
优点:代码行少。association参数少。通过SQL可以检查。
缺点:对SQL语句要求高。要取别名。
对比上面两种形式,子查询相当于通过select的结果来把内容和结构注入association,联表查询相当于通过再定义result来说明结构和映射内容。
一对多
一个老师对应多个学生。一个老师有一个学生集合。
子查询方法
理解:把property映射成一个集合collection,传入参数colunm,返回类型是javaType
代码形式理解:
property= javaType
students = ArrayList
ofType相当于泛型类型。
联表查询
小不同:集合-联表查询要填的是ofType,关联-联表查询要填的是JavaType。可能是collection可以自动推断javaType是某个List。
collection下面的result相当于进一步构造student的结构和映射内容。
实验发现:集合-联表查询比集合-子查询要多说明一个
正常:
屏蔽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
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。
用户访问流程:先问二级缓存,再问一级缓存。