MyBatis优化和联表查询

1、MyBatis优化

1、1 可以把数据源里面的信息抽取到properties文件中

在这里插入图片描述

1、2 创建db.properties文件

在这里插入图片描述

1、3 将属性文件引入到配置文件中

在这里插入图片描述

1、4 添加日志信息

1、4、1 引入日志jar包

在这里插入图片描述

1、4、2 创建日志配置文件log4j.properties

log4j.rootLogger=DEBUG, Console
#Console
log4j.appender.Console=org.apache.log4j.ConsoleAppender
log4j.appender.Console.layout=org.apache.log4j.PatternLayout
log4j.appender.Console.layout.ConversionPattern=%d [%t] %-5p [%c] - %m%n
log4j.logger.java.sql.ResultSet=INFO
log4j.logger.org.apache=INFO
log4j.logger.java.sql.Connection=DEBUG
log4j.logger.java.sql.Statement=DEBUG
log4j.logger.java.sql.PreparedStatement=DEBUG

1、4、3 进行测试

在这里插入图片描述

2、 为实体类起别名

2、1 在bybatis配置文件中设置别名

在这里插入图片描述

2、1 在映射文件文件中使用别名

在这里插入图片描述

3、 实体类的属性和数据库字段不一致的解决方法

在某些时候,数据库中的列名带有_这类的,在实体类起名不方便,所以使用别名

3、1 为查询的结果起别名====与属性名一致

在这里插入图片描述

3、2 使用resultMap来创建属性与字段的映射关系

在这里插入图片描述

4、mybatis联表查询

4、1 多对一

4、1、1先创建数据库表

CREATE 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);

4、1、2创建对应的实体类

@Data
@NoArgsConstructor
@AllArgsConstructor
public class Teacher {
    
    
    private int tid;
    private String tname;
}
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Clazz {
    
    

    private int cid;
    private String cname;
    private Teacher teacher; //该班级对应的老师信息
}

4、1、3映射文件

在这里插入图片描述

4、2 一对多

4、2、1 创建数据库表

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);

4、2、2 创建实体类

@Data
@AllArgsConstructor
@NoArgsConstructor
public class Student {
    
    
    private int sid;
    private String sname;
    private int classid;
}

4、2、2 获取所有学生信息

要求 根据班级id查询班级信息以及该班级下所有的学生信息。

在这里插入图片描述

4、2、3 配置映射文件

<!--一对多-->
    <resultMap id="ClazzMap" type="Clazz">
        <!--id:主键
            column:表示字段
            property:实体类的属性
        -->
        <id column="c_id" property="cid"></id>
        <result column="c_name" property="cname"></result>

        <!--association 多对一的映射   javaType:表示属性名对应的java实体类类型-->
        <association property="teacher" javaType="Teacher">
            <id column="t_id" property="tid"></id>
            <result column="t_name" property="tname"></result>
        </association>

        <!--ofType:表示集合的泛型-->
        <collection property="students" ofType="Student">
            <id column="s_id" property="sid"></id>
            <result column="s_name" property="sname"></result>
        </collection>
    </resultMap>

    <!--resultMap:创建属性和字段的映射关系
        resultType:返回类型
    -->
    <select id="findClassById" resultMap="ClazzMap">
        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=#{
    
    cid}
    </select>

4、2、4 测试

public class Test {
    
    
    public static void main(String[] args) throws Exception {
    
    
        Reader reader = Resources.getResourceAsReader("config.xml");
        //获取到工厂
       SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);
       //通过工厂获取到sqlsession
        SqlSession session = sqlSessionFactory.openSession();
        //通过session可以创建实现类
        ClazzDao mapper = session.getMapper(ClazzDao.class);
        //一对多
        List<Clazz> byId = mapper.findClassById(1);
        System.out.println(byId);
    }
}

运行结果

2021-03-22 15:47:43,855 [main] DEBUG [com.aaa.qy129.dao.ClazzDao.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=?
2021-03-22 15:47:43,883 [main] DEBUG [com.aaa.qy129.dao.ClazzDao.findClassById] - ==> Parameters: 1(Integer)
2021-03-22 15:47:43,905 [main] DEBUG [com.aaa.qy129.dao.ClazzDao.findClassById] - <==      Total: 3
[Clazz(cid=1, cname=bj_a, teacher=Teacher(tid=1, tname=LS1), students=[Student(sid=1, sname=xs_A, classid=0), Student(sid=2, sname=xs_B, classid=0), Student(sid=3, sname=xs_C, classid=0)])]

Process finished with exit code 0

猜你喜欢

转载自blog.csdn.net/weixin_43451430/article/details/115066070