
Mybatis优化,添加日志,给实体类起别名,联表查询,xml特殊字符
发布日期:2021-05-08 03:02:08
浏览次数:24
分类:精选文章
本文共 6093 字,大约阅读时间需要 20 分钟。
Mybatis优化,添加日志,给实体类起别名,联表查询,xml特殊字符
Mybatis优化
可以把数据源的信息抽取到db.properties文件中。
db.properties文件 jdbc.driverName:jdbc驱动 jdbc.url:数据库的路径 jdbc.userName:数据库用户的账户 jdbc.passWord:数据库用户的密码 ///代表localhost:3306 以下两种写法是一个意思jdbc.url=jdbc:mysql:///mybatis?characterEncoding=utf8&useUnicode=true&useOldAliasMetadataBehavior=true&useSSL=falsejdbc.url=jdbc:mysql://localhost:3306/mybatis?characterEncoding=utf8&useUnicode=true&useOldAliasMetadataBehavior=true&useSSL=false
db.properties文件
jdbc.driverName=com.mysql.jdbc.Driverjdbc.url=jdbc:mysql:///mybatis?characterEncoding=utf8&useUnicode=true&useOldAliasMetadataBehavior=true&useSSL=falsejdbc.userName=rootjdbc.passWord=root
再db.properties文件中引入mybatis-config.xml文件中
注意:这里的value要用${},中间写引入db.properties文件的属性,如下:
整体mybatis-config.xml文件内容如下:
添加日志
(1)在pom.xml中引入log4j文件
log4j log4j 1.2.17
(2)创建日志的配置文件 log4j.properties
log4j.rootLogger=DEBUG, Console#Consolelog4j.appender.Console=org.apache.log4j.ConsoleAppenderlog4j.appender.Console.layout=org.apache.log4j.PatternLayoutlog4j.appender.Console.layout.ConversionPattern=%d [%t] %-5p [%c] - %m%nlog4j.logger.java.sql.ResultSet=INFOlog4j.logger.org.apache=INFOlog4j.logger.java.sql.Connection=DEBUGlog4j.logger.java.sql.Statement=DEBUGlog4j.logger.java.sql.PreparedStatement=DEBUG
控制台输出如下:
2021-03-22 10:03:25,494 [main] DEBUG [com.zz.dao.ClassDao.findClassById] - ==> Preparing: SELECT * from class c, teacher t ,student s where c.teacher_id=t.t_id and c.c_id=s.class_id and c.c_id=1 2021-03-22 10:03:25,514 [main] DEBUG [com.zz.dao.ClassDao.findClassById] - ==> Parameters: 2021-03-22 10:03:25,534 [main] DEBUG [com.zz.dao.ClassDao.findClassById] - <== Total: 3Clazz(cid=1, cname=bj_a, teacher=Teacher(tid=1, tName=LS1), students=[Student(sid=1, sName=xs_A, classId=1), Student(sid=2, sName=xs_B, classId=1), Student(sid=3, sName=xs_C, classId=1)])
解决属性名和字段名不一致的情况
为实体类起别名(不建议使用)
1.在mybatis-config.xml
(1)给单个类起别名(2)给指定包下的所有类起别名,类名就是别名
resultType中填的就是mybatis-config.xml中 alias="User"的User2.在mapper.xml映射文件中
resultType中填的就是该类resultType中填的就是该类
实体的属性和数据库表的字段不一致
(1)为查询的结果起别名-----与属性名一致。
(2)使用resultMap来创建属性与字段的映射关系
id:代表主键 result:代表其他字段 column:代表数据库字段 property:映射数据库列的字段或属性(代表实体类字段) resultMap 里面的id代表它的标识,type代表使用哪种类作为其映射的类,可以是别名或者全限定名 resultMap 里面的type代表使用哪种类作为其映射的类,可以是别名或者全限定名。(java实体类的类型) resultMap 与resultType两者只能用一个联表查询
多对一
(1)表与表之间的关系------->外键【逻辑外键】
数据库表teacherCREATE TABLE teacher(t_id INT PRIMARY KEY AUTO_INCREMENT,t_name VARCHAR(20));//teacher class 一对多CREATE TABLE class(c_id INT PRIMARY KEY AUTO_INCREMENT,c_name VARCHAR(20),teacher_id INT -- 外键);ALTER TABLE class ADD CONSTRAINT fk_teacher_id FOREIGN KEY (teacher_id)REFERENCES teacher(t_id); INSERT INTO teacher(t_name) VALUES('LS1');INSERT INTO teacher(t_name) VALUES('LS2');INSERT INTO class(c_name, teacher_id) VALUES('bj_a', 1);INSERT INTO class(c_name, teacher_id) VALUES('bj_b', 2);
(2)java实体类如何维持这种关系。
Teacher {tid, tname}Class {cid,cname,Teacher teacher}-->class 只包含老师id号。 多对一 可以在多的实体中添加一的实体类对象。
(3)要求根据班级号 查询班级信息并带上老师的信息。
创建对应的实体类
(1)Clazz实体类
@Data@AllArgsConstructor@NoArgsConstructorpublic class Clazz { private int cid; private String cname;// 该班级对应的老师信息 private Teacher teacher; // 表示该班级下所有的学生信息 private Liststudent;}
Teacher实体类
@Data@AllArgsConstructor@NoArgsConstructorpublic class Teacher { private int tid; private String tname;}
映射文件
(1)第一种方法:联表查询只要引用的是对象就用resultMap
引入的是对象就用association association :表示一对一关系 association 里面的property代表映射数据库列的字段或属性(代表实体类字段) association 里面的javaType代表返回类型,跟resultType一个意思 mapper.xml中(2)两条sql进行查询
mapper.xml中 其中association 多加了两个属性 column:所对应的外键字段名称(数据库字段)把第一次查询的某一个作为第二次查询的值 select:把column列值交给select这个查询语句,填的是第二个查询语句的id,使用另一个查询封装的结果 第二条sql中就不能写resultMap了,写resultType一对多
数据库表student
CREATE TABLE student(s_id INT PRIMARY KEY AUTO_INCREMENT,s_name VARCHAR(20),class_id INT);INSERT INTO student(s_name, class_id) VALUES('xs_A', 1);INSERT INTO student(s_name, class_id) VALUES('xs_B', 1);INSERT INTO student(s_name, class_id) VALUES('xs_C', 1);INSERT INTO student(s_name, class_id) VALUES('xs_D', 2);INSERT INTO student(s_name, class_id) VALUES('xs_E', 2);INSERT INTO student(s_name, class_id) VALUES('xs_F', 2);
要求 根据班级id查询班级信息以及该班级下所有的学生信息。
Student 实体类@Data@NoArgsConstructor@AllArgsConstructorpublic class Student { private Integer sid; private String sName; private String classId;}
mapper.xml中
collection 表示一对多 collection 里面的property代表映射数据库列的字段或属性(代表实体类字段) collection 里面的ofType代表返回类型,跟resultType一个意思xml碰到特殊字符如何处理
(1)可以使用转移字符

(2)使用CDATA
<![CDATA[sql]]> mapper.xml中发表评论
最新留言
做的很好,不错不错
[***.243.131.199]2025年03月31日 12时51分20秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
[网站公告]3月10日23:00-4:00阿里云SLB升级,会有4-8次连接闪断
2021-05-09
.NET跨平台之旅:借助ASP.NET 5 Beta5的新特性显示CLR与操作系统信息
2021-05-09
上周热点回顾(7.27-8.2)
2021-05-09
上周热点回顾(9.28-10.4)
2021-05-09
上周热点回顾(3.28-4.3)
2021-05-09
上周热点回顾(5.2-5.8)
2021-05-09
上周热点回顾(5.9-5.15)
2021-05-09
上周热点回顾(8.8-8.14)
2021-05-09
.NET跨平台之旅:将示例站点升级至 .NET Core 1.1 Preview 1
2021-05-09
上周热点回顾(1.16-1.22)
2021-05-09
上周热点回顾(1.23-1.29)
2021-05-09
上周热点回顾(3.20-3.26)
2021-05-09
上周热点回顾(4.24-4.30)
2021-05-09
[故障公告]博客站点1台负载均衡遭遇流量攻击,造成联通与移动用户无法正常访问
2021-05-09
上周热点回顾(5.1-5.7)
2021-05-09
上周热点回顾(5.29-6.4)
2021-05-09
上周热点回顾(6.19-6.25)
2021-05-09
云计算之路-阿里云上:docker swarm 集群故障与异常
2021-05-09
上周热点回顾(2.19-2.25)
2021-05-09