笔记

1. mybatis回顾

0.maven 3.5.0

  1. mybatis 作用: 帮你封装查询的结果以及占位符的赋值。 替换JDBC。
  2. 搭建mybatis的步骤。
    (1)引入依赖jar
    (2)创建对应的实体类。
    (3)配置mybatis的配置文件。
    (4) 创建mybatis的映射文件。[写sql语句]
    (5)把映射文件放入到配置文件中。
  3. 开发环境使用映射文件结合DAO接口
    (1)映射文件的namespace必须和接口名对应。
    (2)映射文件中的id必须接口的方法对应。

2. 正文

1. mybatis的一些优化
2. 解决属性名和字段名不一致的情况。
3. 联表查询 。
4. 动态sql语句。

3. mybatis的一些优化

(1) 可以把数据源的信息抽取到properties文件中。

创建一个属性文件内容如下

jdbc.driverName=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/数据库名?useSSL=false&amp&useUnicode=true&amp&characterEncoding=utf8
jdbc.username=root
jdbc.password=root

再配置文件中引入属性文件

<properties resource="db.properties"/>
    <!--为实体类起别名-->
    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC" />
            <dataSource type="POOLED">
                <!--引入属性文件的内容-->
                <property name="driver" value="${jdbc.driverName}" />
                <property name="url" value="${jdbc.url}" />
                <property name="username" value="${jdbc.username}" />
                <property name="password" value="${jdbc.password}" />
            </dataSource>
        </environment>
    </environments>

3.2 添加日志信息—打印sql语句。

(1)引入日志jar文件

<dependency>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
            <version>1.2.12</version>
</dependency>

(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

(3)测试

2021-03-22 14:17:35,533 [main] DEBUG [com.aaa.dao.ClazzDao.findClassBetweenIds] - ==>  Preparing: select * from class where c_id >=? and c_id <=?
2021-03-22 14:17:35,560 [main] DEBUG [com.aaa.dao.ClazzDao.findClassBetweenIds] - ==> Parameters: 1(Integer), 3(Integer)
2021-03-22 14:17:35,576 [main] DEBUG [com.aaa.dao.ClazzDao.findClassBetweenIds] - <==      Total: 2

3.3 为实体类起别名(不建议大家使用)

(1)在mybatis配置文件中设置别名

    <typeAliases>
        <!--为单个类起别名-->
        <!-- <typeAlias type="com.entity.Users" alias="u"/>-->
        <!--为指定包下的类起别名 就是类的名称-->
        <package name="com.entity"/>
    </typeAliases>

4. 实体的属性和数据库表的字段不一致

(1)为查询的结果起别名-----与属性名一致。

    <select id="findClassByid" resultMap="ClazzMap">
        select * from class c,teacher t where c.teacher_id=t.t_id
            and c.c_id=#{id}
    </select>

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


    <resultMap id="ClazzMap"  type="com.entity.Clazz">
        <id column="c_id" property="cid"/>
        <result column="c_name" property="cname"/>

        <association property="teacher" javaType="com.entity.Teacher">
            <id column="t_id" property="tid"/>
            <result column="t_name" property="tname"/>
        </association>
        
        <collection property="students" ofType="com.entity.Student">
            <id column="s_id" property="sid"/>
            <result column="s_name" property="sname"/>
        </collection>
    </resultMap>
    <select id="findClassByid" resultMap="ClazzMap">
        select * from class c,teacher t where c.teacher_id=t.t_id
            and c.c_id=#{id}
    </select>

5. mybatis联表查询

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

(2)java实体类如何维持这种关系。

Teacher {tid, tname}

Class {cid,cname,Teacher teacher}---->class 只包含老师id号。 多对一 可以在多的实体中添加一的实体类对象。

(1)要求根据班级号 查询班级信息并带上老师的信息。

5.2 一对多。

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查询班级信息以及该班级下所有的学生信息。

@Data
@NoArgsConstructor
@AllArgsConstructor
public class Clazz {
    private int cid;
    private String cname;
    private Teacher teacher;
    private List<Student> students;
}

总结:

  1. mybatis的优化 1.数据源信息 2.加入了日志 3.实体类别名

  2. 字段和属性不一致 (1)为查询的列起别名—属性名一致 (2)使用resultMap

  3. mybatis关联查询。
    一对一。
    一对多。

xml 碰到特殊字符如何处理:

(1)可以使用转移字符;笔记
(2)使用CDATA

<![CDATA[sql]]>
<![CDATA[select * from class where c_id >=#{minId}  and c_id <=#{maxId}]]>
上一篇:java--组合类的实现


下一篇:调用数据库函数(SQLAlchemy所写),传入参数查询,二次调用参数为第一次传入参数