二、MyBatis(2)

一、 日志

日志

1.1 日志工厂

如果一个数据库操作,出现了异常,我们需要排错。日志就是最好的助手!

曾经:sout、debug
现在:日志工厂

在这里插入图片描述

SLF4J
LOG4J(<font color="red">掌握</font>)
LOG4J2
JDK_LOGGING
COMMONS_LOGGING
STDOUT_LOGGING(<font color="red">掌握</font>)
NO_LOGGING

在mybatis中具体使用哪一个日志实现,在设置中设定!

1.2 STDOUT_LOGGING 标准日志输出

(1)创建子模块 mybatis-04
在这里插入图片描述
(2) copy相应代码

pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>com.zql</artifactId>
        <groupId>com.zql</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>mybatis-04</artifactId>

    <!--在build中配置resources,来防止我们资源导出失败的问题-->
    <build>
        <resources>
            <resource>
                <directory>src/main/java</directory>
                <includes>
                    <include>**/*.xml</include>
                    <include>**/*.properties</include>
                </includes>
            </resource>

            <resource>
                <directory>src/main/resources</directory>
                <includes>
                    <include>**/*.xml</include>
                    <include>**/*.properties</include>
                </includes>
            </resource>
        </resources>
    </build>
</project>

MybatisUtils.java

package com.zql.utils;

import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

import java.io.InputStream;

public class MybatisUtils {

    private static  SqlSessionFactory sqlSessionFactory;

    static {
        try {
        String resource = "mybatis-config.xml";
        InputStream inputStream = Resources.getResourceAsStream(resource);
        sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);

        } catch (Exception e) {
            e.printStackTrace();
        }

    }
    public static SqlSession getSqlSession(){

        return sqlSessionFactory.openSession();
    }
}

mybatis-config.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-config.dtd">
<!--核心配置文件-->
<configuration>

    <properties resource="db.properties"/>
    <!--类型别名2-->
    <typeAliases>
        <package name="com.zql.pojo"></package>
    </typeAliases>

    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                <property name="driver" value="${driver}"/>
                <property name="url" value="${url}"/>
                <property name="username" value="${username}"/>
                <property name="password" value="${password}"/>
            </dataSource>
        </environment>
    </environments>
    <mappers>
        <!--每一个mapper.xml都需要在Mybatis核心配置文件中注册!-->
        <mapper resource="com/zql/dao/UserMapper.xml"></mapper>
    </mappers>
</configuration>

db.properties

driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/mybatis?useSSL=true&useUnicode=true&characterEncoding=UTF-8&serverTimezone=GMT%2B8
username=root
password=root

User.java

package com.zql.pojo;

import java.io.Serializable;

public class User implements Serializable {

    private int id;
    private String name;
    private String password;

    public User() {
    }

    public User(int id, String name, String password) {
        this.id = id;
        this.name = name;
        this.password = password;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", password='" + password + '\'' +
                '}';
    }
}

UserMapper.java

package com.zql.dao;

import com.zql.pojo.User;

public interface UserMapper {
        //通过id查询单个用户
        User getUserById(int id);
}

UserMapper.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!--相当于Java进阶中的接口实现类  namespace绑定mapper或dao接口  -->
<mapper namespace="com.zql.dao.UserMapper" >

    <!--结果集映射  column 数据库中的字段  property 实体类中的属性 -->
    <resultMap id="userMap" type="user">
        <!--<result  column="id" property="id"></result>

        <result  column="name" property="name"></result>-->

        <result  column="pwd" property="password"></result>

    </resultMap>

    <!--通过id查询一条用户-->
    <select id="getUserById" parameterType="int" resultMap="userMap">
        select * from mybatis.user where id=#{id}
    </select>

</mapper>

UserDaoTest.java

package com.zql.dao;

import com.zql.pojo.User;
import com.zql.utils.MybatisUtils;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;

public class UserDaoTest {

    //通过id查询单个
    @Test
    public void getUserById(){

        SqlSession sqlSession = MybatisUtils.getSqlSession();

        UserMapper userMapper = sqlSession.getMapper(UserMapper.class);

        User id = userMapper.getUserById(1);

        System.out.println(id);

        sqlSession.close();
    }
}

测试得(没有日志):
在这里插入图片描述
日志配置:👇🏾

在mybatis-config.xml

在这里插入图片描述

<!--日志配置  标准的日志工厂格式-->
<settings>
    <setting name="logImpl" value="STDOUT_LOGGING"/>
</settings>

测试得(有日志):

在这里插入图片描述

1.3 log4j

1.3.1 什么是 log4j

在这里插入图片描述

  1. Log4j是Apache的一个开源项目,通过使用Log4j,我们可以控制日志信息输送的目的地是控制台、文件、GUI组件
  2. 我们也可以控制每一条日志的输出格式
  3. 通过定义每一条日志信息的级别,我们能够更加细致地控制日志的生成过程
  4. 通过一个配置文件来灵活地进行配置,而不需要修改应用的代码。

1.3.2 log4j的配置

(1)第一步 导包|| 依赖

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

(2) 第二步 在CLASSPATH下建立log4j.properties。内容如下:

Log4j比较全面的配置
Log4j配置文件实现了输出到控制台、文件、回滚文件、发送日志邮件、输出到数据库日志表、自定义标签等全套功能。

### 设置###
log4j.rootLogger = debug,stdout,D,E

### 输出信息到控制抬 ###
log4j.appender.stdout = org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target = System.out
log4j.appender.stdout.layout = org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern = [%-5p] %d{yyyy-MM-dd HH:mm:ss,SSS} method:%l%n%m%n

### 输出DEBUG 级别以上的日志到=E://logs/error.log ###
log4j.appender.D = org.apache.log4j.DailyRollingFileAppender
log4j.appender.D.File = E://logs/log.log
log4j.appender.D.Append = true
log4j.appender.D.Threshold = DEBUG 
log4j.appender.D.layout = org.apache.log4j.PatternLayout
log4j.appender.D.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss}  [ %t:%r ] - [ %p ]  %m%n

### 输出ERROR 级别以上的日志到=E://logs/error.log ###
log4j.appender.E = org.apache.log4j.DailyRollingFileAppender
log4j.appender.E.File =E://logs/error.log 
log4j.appender.E.Append = true
log4j.appender.E.Threshold = ERROR 
log4j.appender.E.layout = org.apache.log4j.PatternLayout
log4j.appender.E.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss}  [ %t:%r ] - [ %p ]  %m%n

(3)第三步 在mybatis-config.xml中配置log4j为日志的实现

<!--日志配置-->
<settings>
    <setting name="logImpl" value="LOG4J"/>
</settings>

(4)log4j的使用。直接运行刚才1.1 中的测试查询

在这里插入图片描述

(5)最后发现也生成一个日志:

在这里插入图片描述

1.4 log4j简单使用

  1. 在要使用的log4j的类中,导入包 import org.apache.log4j.Logger;

可以直接在UserDaoTest.java中做简单使用

UserDaoTest.java

package com.zql.dao;

import com.zql.pojo.User;
import com.zql.utils.MybatisUtils;
import org.apache.ibatis.session.SqlSession;
import org.apache.log4j.Logger;
import org.junit.Test;


public class UserDaoTest {

    static Logger logger = Logger.getLogger(UserDaoTest.class);

    //通过id查询单个
    @Test
    public void getUserById(){

        SqlSession sqlSession = MybatisUtils.getSqlSession();

        UserMapper userMapper = sqlSession.getMapper(UserMapper.class);

        User id = userMapper.getUserById(1);

        System.out.println(id);

        sqlSession.close();
    }

    @Test
    public void log4jTest(){
        logger.info("info 进入了 log4jTest");
        logger.debug("debug进入了log4jTest");
        logger.error("error进入了log4jTest");
    }
}

  1. 日志对象,参数为当前类的class
 static Logger logger = Logger.getLogger(UserDaoTest.class);

3.日志级别

 logger.info("info 进入了 log4jTest");
 logger.debug("debug进入了log4jTest");
 logger.error("error进入了log4jTest");

二、分页

2.1 limit实现分页

为什么要分页? 减少数据的处理量

2.1.1 使用limit分页

回顾limit分页

select * from user limit startIndex,pageSize;

select * from user limit 3;   # limit 0,3

2.1.2 使用Mybatis实现分页,核心SQL

(1) 接口 UserDao.java

 //分页
 List<User> getUserByLimit(Map<String,Integer> map);

(2)UserMapper.xml

 <select id="getUserByLimit" parameterType="map" resultMap="userMap" >
     select * from mybatis.user limit #{startIndex},#{pageSize}
 </select>

(3)测试(UserDaoTest.java)

//分页
@Test
public void getUserByLimit(){

    SqlSession sqlSession = MybatisUtils.getSqlSession();

    UserMapper mapper = sqlSession.getMapper(UserMapper.class);

    Map<String, Integer> map = new HashMap<>();

    map.put("startIndex",0);
    map.put("pageSize",2);

    List<User> userByLimit = mapper.getUserByLimit(map);

    for (User user : userByLimit) {

        System.out.println(user);

    }
}

最终测试:
在这里插入图片描述

2.2 RowBounds实现分页(拓展:有的老公司在用)

不再使用SQL实现分页

(1)接口(UserMapper.java)

 //分页2
 List<User> getUserRowBounds();

(2) Mapper.xml(UserMapper.xml)

<select id="getUserRowBounds"   resultType="user">
    select * from  mybatis.user;
</select>

(3)测试(UserDaoTest.java )

    //分页2
    @Test
    public void getUserRowBounds(){

        SqlSession sqlSession = MybatisUtils.getSqlSession();

        RowBounds rowBounds = new RowBounds(1,2);

        //通过java代码层面实现分页
        List<User> userList = sqlSession.selectList("com.zql.dao.UserMapper.getUserRowBounds",null,rowBounds);

        for (User user : userList) {

            System.out.println(user);

        }
    }

测试结果:
在这里插入图片描述

2.3 Mybatis分页插件(后面Spring里面总结)

Mybatis分页插件
在这里插入图片描述

三、注解(Mybatis)

3.1 注解入门开发

注解开发

在这里插入图片描述

1.创建子模块mybatis-05
2.导入pom.xml依赖
pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>com.zql</artifactId>
        <groupId>com.zql</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>mybatis-05</artifactId>

    <!--在build中配置resources,来防止我们资源导出失败的问题-->
    <build>
        <resources>
            <resource>
                <directory>src/main/java</directory>
                <includes>
                    <include>**/*.xml</include>
                    <include>**/*.properties</include>
                </includes>
            </resource>

            <resource>
                <directory>src/main/resources</directory>
                <includes>
                    <include>**/*.xml</include>
                    <include>**/*.properties</include>
                </includes>
            </resource>
        </resources>
    </build>
</project>

3.工具类(MybatisUtils.java) resources文件(mybatis-config.xml,db.properties)实体(User.java)同上

4.接口
UserMapper.java

package com.zql.dao;

import com.zql.pojo.User;
import org.apache.ibatis.annotations.Select;

import java.util.List;

public interface UserMapper {

        //通过id查询单个用户
        @Select("select * from user")
        List<User> getUserList();
}

5.测试类
UserDaoTest.java

package com.zql.dao;

import com.zql.pojo.User;
import com.zql.utils.MybatisUtils;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;

import java.util.ArrayList;
import java.util.List;

public class UserDaoTest {

    //通过id查询单个
    @Test
    public void getUserById(){

        SqlSession sqlSession = MybatisUtils.getSqlSession();

        UserMapper userMapper = sqlSession.getMapper(UserMapper.class);

        List<User> userList = userMapper.getUserList();

        for (User user : userList) {

            System.out.println(user);

        }

        sqlSession.close();
    }
}

最终测试:
在这里插入图片描述

3.2 剖析Mybatis的执行流程

可参考

在这里插入图片描述

通过代码剖析Mybatis执行流程:👇🏾

package com.zql.utils;

import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

import java.io.InputStream;

public class MybatisUtils {

    private static  SqlSessionFactory sqlSessionFactory;

    static {
        try {
        String resource = "mybatis-config.xml";
        InputStream inputStream = Resources.getResourceAsStream(resource);
        //1.Resources获取加载全局配置文件
        sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
            //2.实例化SqlSessionFactoryBuilder构造器
            /**
             * (1)解析配置文件流 XMLConfigBuilder
             *(2)解析配置所有的Configuration所有的配置信息
             */
            //3.sqlSessionFactory 实例化
            //4.事务管理
        } catch (Exception e) {
            e.printStackTrace();
        }

    }
    public static SqlSession getSqlSession(){
        return sqlSessionFactory.openSession();
    }
}

在这里插入图片描述

在这里插入图片描述

3.3 使用注解完成CRUD

工具类创建的时候自动提交事务(源码可看到auto…)

在这里插入图片描述

关于@Param()注解

  1. 基本类型的参数或者String类型,需要加上
  2. 引用类型不需要加
  3. 如果只有一个基本类型的话,可以忽略,但是建议都加上!
    我们在SQL中引用的就是我们这里的@Param()中设定的属性名!

(1)MybatisUtils.java

package com.zql.utils;

import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

import java.io.InputStream;

public class MybatisUtils {

    private static  SqlSessionFactory sqlSessionFactory;

    static {
        try {
        String resource = "mybatis-config.xml";
        InputStream inputStream = Resources.getResourceAsStream(resource);
        //1.Resources获取加载全局配置文件
        sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);

        } catch (Exception e) {
            e.printStackTrace();
        }

    }
    public static SqlSession getSqlSession(){
        return sqlSessionFactory.openSession(true);//true自动提交事务
    }
}

(2)UserMapper.java

package com.zql.dao;

import com.zql.pojo.User;
import org.apache.ibatis.annotations.*;

import java.util.List;

public interface UserMapper {

        //查询单个用户
        @Select("select * from user")
        List<User> getUserList();

        //通过id查询指定用户
        @Select("select * from user where id=#{id}")
        User getUserById(@Param("id") int id);
         //通过id和name查询用户
     /*   @Select("select * from user where id=#{id},name=#{name}")
        User getUserById(@Param("id") int id,@Param("name") String name);*/

        //添加
        @Insert("insert into user (id,name,pwd) values (#{id},#{name},#{pwd})")
        int addUser(User user);

        //修改
        @Update("update user set name=#{name},pwd=#{pwd} where id= #{id}")
        int updateUser(User user);

        //删除
        @Delete("delete from user where id=#{id}")
         int  deleteUser(int id);
}

(3)UserDaoTest.java

package com.zql.dao;

import com.zql.pojo.User;
import com.zql.utils.MybatisUtils;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;

import java.util.List;

public class UserDaoTest {

    //查询
    @Test
    public void getUser(){

        SqlSession sqlSession = MybatisUtils.getSqlSession();

        UserMapper userMapper = sqlSession.getMapper(UserMapper.class);

        List<User> userList = userMapper.getUserList();

        for (User user : userList) {

            System.out.println(user);

        }

        sqlSession.close();
    }

    //通过id查询
    @Test
    public void getUserById(){

        SqlSession sqlSession = MybatisUtils.getSqlSession();

        UserMapper mapper = sqlSession.getMapper(UserMapper.class);

        User userById = mapper.getUserById(2);

        System.out.println(userById);

        sqlSession.close();
    }

    //添加
    @Test
    public void addUser(){

        SqlSession sqlSession = MybatisUtils.getSqlSession();

        UserMapper mapper = sqlSession.getMapper(UserMapper.class);

        mapper.addUser(new User(5,"笑话","234"));

        System.out.println("添加成功");

        sqlSession.close();
    }

    //修改
    @Test
    public void updateUser(){

        SqlSession sqlSession = MybatisUtils.getSqlSession();

        UserMapper mapper = sqlSession.getMapper(UserMapper.class);

        mapper.updateUser(new User(4,"guoguo","2345"));

        System.out.println("修改成功");

        sqlSession.close();
    }

    @Test
    public void deleteUser(){
        SqlSession sqlSession = MybatisUtils.getSqlSession();

        UserMapper mapper = sqlSession.getMapper(UserMapper.class);

        mapper.deleteUser(4);

        System.out.println("删除成功");

        sqlSession.close();
    }
}

四、Lombok

Lombok的使用👉🏾👉🏾戳我

五、复杂查询

5.1 多对一(子查询,联表查询)

在这里插入图片描述

  • 多个学生,对应一个老师
  • 对于学生这边而言,关联…多个学生,关联一个老师【多对一】
  • 对于老师而言,集合,一个老师,有很多学生【一对多】

5.1.1 测试环境搭建

(1)导入sql:
在这里插入图片描述

CREATE TABLE `teacher` (
  `id` INT(10) NOT NULL,
  `name` VARCHAR(30) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=INNODB DEFAULT CHARSET=utf8

INSERT INTO teacher(`id`, `name`) VALUES (1, '王老师'); 

CREATE TABLE `student` (
  `id` INT(10) NOT NULL,
  `name` VARCHAR(30) DEFAULT NULL,
  `tid` INT(10) DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `fktid` (`tid`),
  CONSTRAINT `fktid` FOREIGN KEY (`tid`) REFERENCES `teacher` (`id`)
) ENGINE=INNODB DEFAULT CHARSET=utf8
INSERT INTO `student` (`id`, `name`, `tid`) VALUES ('1', '小明', '1'); 
INSERT INTO `student` (`id`, `name`, `tid`) VALUES ('2', '小红', '1'); 
INSERT INTO `student` (`id`, `name`, `tid`) VALUES ('3', '小张', '1'); 
INSERT INTO `student` (`id`, `name`, `tid`) VALUES ('4', '小李', '1'); 
INSERT INTO `student` (`id`, `name`, `tid`) VALUES ('5', '小王', '1');

(2) 创建子模块mybatis-06

在这里插入图片描述

(3)pom.xml

    <!--lombok-->
    <dependencies>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.24</version>
        </dependency>
    </dependencies>

    <!--在build中配置resources,来防止我们资源导出失败的问题-->
    <build>
        <resources>
            <resource>
                <directory>src/main/java</directory>
                <includes>
                    <include>**/*.xml</include>
                    <include>**/*.properties</include>
                </includes>
            </resource>

            <resource>
                <directory>src/main/resources</directory>
                <includes>
                    <include>**/*.xml</include>
                    <include>**/*.properties</include>
                </includes>
            </resource>
        </resources>
    </build>

(4) 工具类(MybatisUtils.java) resources(db.properties,mybatis-config.xml)

MybatisUtils.java

package com.zql.utils;

import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

import java.io.InputStream;

public class MybatisUtils {

    private static  SqlSessionFactory sqlSessionFactory;

    static {
        try {
        String resource = "mybatis-config.xml";
        InputStream inputStream = Resources.getResourceAsStream(resource);
        //1.Resources获取加载全局配置文件
        sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);

        } catch (Exception e) {
            e.printStackTrace();
        }

    }
    public static SqlSession getSqlSession(){
        return sqlSessionFactory.openSession(true);//true自动提交事务
    }
}

db.properties

driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/mybatis?\
  useSSL=true&useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC
username=root
password=root

mybatis-config.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>

    <properties resource="db.properties"/>
    
    <settings>
        <setting name="logImpl" value="STDOUT_LOGGING"/>
    </settings>

    <typeAliases>
        <package name="com.zql.pojo"></package>
    </typeAliases>

    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                <property name="driver" value="${driver}"/>
                <property name="url" value="${url}"/>
                <property name="username" value="${username}"/>
                <property name="password" value="${password}"/>
            </dataSource>
        </environment>
    </environments>
    <mappers>
     <mapper class="com.zql.dao.TeachMapper"/>
     <mapper class="com.zql.dao.StudentMapper"/>
    </mappers>
</configuration>

(5) 实体类

Student.java

package com.zql.pojo;

import lombok.Data;

import java.io.Serializable;

/**
 * @Author:Daniel
 * @Version 1.0
 */

@Data
public class Student implements Serializable {

    private  int id;

    private String name;

    private Teacher teacher;
}

Teach.java

package com.zql.pojo;

import lombok.Data;

import java.io.Serializable;

/**
 * @Author:Daniel
 * @Version 1.0
 */

@Data
public class Teacher implements Serializable {

    private int id;

    private String name;
}

(5) 接口实现

StudentMapper.java

package com.zql.dao;

/**
 * @Author:Daniel
 * @Version 1.0
 */
public interface StudentMapper {

}

TeacherMapper.java

package com.zql.dao;

import com.zql.pojo.Teacher;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;

/**
 * @Author:Daniel
 * @Version 1.0
 */
public interface TeachMapper {

        @Select("select * from teacher where id=#{tid}")
        Teacher getTeachById(@Param("tid") int id);
}

(6) Mapper.xml实现

StudentMapper.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.zql.dao.StudentMapper">

</mapper>

TeacherMapper.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.zql.dao.TeachMapper">
    
</mapper>

(7)测试类实现

MyTest.java

package com.zql.dao;

import com.zql.pojo.Teacher;
import com.zql.utils.MybatisUtils;
import org.apache.ibatis.session.SqlSession;

/**
 * @Author:Daniel
 * @Version 1.0
 */
public class MyTest {

    public static void main(String[] args) {

        SqlSession sqlSession = MybatisUtils.getSqlSession();

        TeachMapper mapper = sqlSession.getMapper(TeachMapper.class);

        Teacher id = mapper.getTeachById(1);

        System.out.println(id);

		sqlSession.close();
        
    }
}

搭建成功测试得✌✌:
在这里插入图片描述

5.1.2 按照查询嵌套处理

StudentMapper.java

package com.zql.dao;

import com.zql.pojo.Student;

import java.util.List;

/**
 * @Author:Daniel
 * @Version 1.0
 */
public interface StudentMapper {

    //查询所有学生  和对应得老师
    List<Student> getStudent();
}

StudentMapper.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.zql.dao.StudentMapper">

    <!--按照查询嵌套处理
        思路:
            1.查询所有得学生信息
            2.根据查询出来得学生tid,寻找对应得老师!  子查询
    -->

    <select id="getStudent"  resultMap="studentTeacher">
        select * from student
    </select>

    <resultMap id="studentTeacher" type="Student">
        <result property="id" column="id"/>
        <result property="name"  column="name"/>
        <!--复杂得属性,需要单独得处理  对象:association  集合:collection -->
        <association property="teacher"  column="tid" javaType="Teacher"  select="getTeacher" />
    </resultMap>

    <select id="getTeacher"  resultType="Teacher">
        select * from teacher where id=#{id}
    </select>

</mapper>

MyTest.java

    @Test
    public void getStudent(){

        SqlSession sqlSession = MybatisUtils.getSqlSession();

        StudentMapper mapper = sqlSession.getMapper(StudentMapper.class);

        List<Student> student = mapper.getStudent();

        for (Student student1 : student) {
            
            System.out.println(student1);
        }
    }

在这里插入图片描述

5.1.3 按照结果嵌套处理

StudentMapper.java

List<Student>  getStudent2();

StudentMapper.xml

    <!--按照查询结果处理-->
    <select id="getStudent2"  resultMap="studentTeacher2">
        select s.id sid,s.name sname,t.name tname from student s,teacher t where s.tid = t.id
    </select>

    <resultMap id="studentTeacher2" type="Student">
        <result property="id" column="sid"></result>
        <result  property="name" column="sname"></result>
        <association property="teacher" javaType="Teacher">
            <result  property="name"  column="tname"></result>
        </association>
    </resultMap>

MyTest.java

  @Test
  public void getStudent2(){

      SqlSession sqlSession = MybatisUtils.getSqlSession();

      StudentMapper mapper = sqlSession.getMapper(StudentMapper.class);

      List<Student> student2 = mapper.getStudent2();

      for (Student student : student2) {

          System.out.println(student);

      }
  }

在这里插入图片描述

5.2 一对多(子查询,联表查询)

5.2.1 测试环境搭建

在这里插入图片描述

pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>com.zql</artifactId>
        <groupId>com.zql</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>Mybatis-07</artifactId>

    <!--lombok-->
    <dependencies>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.24</version>
        </dependency>
    </dependencies>

    <!--在build中配置resources,来防止我们资源导出失败的问题-->
    <build>
        <resources>
            <resource>
                <directory>src/main/java</directory>
                <includes>
                    <include>**/*.xml</include>
                    <include>**/*.properties</include>
                </includes>
            </resource>

            <resource>
                <directory>src/main/resources</directory>
                <includes>
                    <include>**/*.xml</include>
                    <include>**/*.properties</include>
                </includes>
            </resource>
        </resources>
    </build>

</project>

resources(db.properties,mybatis-config.xml)(同5.1)
Student.java

package com.zql.pojo;

import lombok.Data;

import java.io.Serializable;

/**
 * @Author:Daniel
 * @Version 1.0
 */

@Data
public class Student implements Serializable {

    private int id;
    private String name;
    private int tid;

}

Teacher.java

package com.zql.pojo;

import lombok.Data;

import java.io.Serializable;
import java.util.List;

/**
 * @Author:Daniel
 * @Version 1.0
 */

@Data
public class Teacher implements Serializable {

    private int id;
    private String name;

    //一个老师拥有多个学生
    private List<Student> student;
}

StudentMapper.java

package com.zql.dao;

/**
 * @Author:Daniel
 * @Version 1.0
 */
public interface StudentMapper {

}

TeacherMapper.java

package com.zql.dao;

import com.zql.pojo.Teacher;

import java.util.List;

/**
 * @Author:Daniel
 * @Version 1.0
 */
public interface TeacherMapper {

    //查询老师
    List<Teacher> getTeacher();
}

StudentMapper.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.zql.dao.StudentMapper">

</mapper>

TeacherMapper.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.zql.dao.TeacherMapper">

    <select id="getTeacher" resultType="Teacher">
        select * from teacher
    </select>
</mapper>

MyTest.java

package com.zql.dao;

import com.zql.pojo.Teacher;
import com.zql.utils.MybatisUtils;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;

import java.util.List;


/**
 * @Author:Daniel
 * @Version 1.0
 */
public class MyTest {

        @Test
        public void getTeacher(){
            SqlSession sqlSession = MybatisUtils.getSqlSession();

            for (Teacher teacher : sqlSession.getMapper(TeacherMapper.class).getTeacher()) {

                System.out.println(teacher);

            }
             sqlSession.close();
        }
}

搭建成功测试得✌✌:

在这里插入图片描述

5.2.2 按照结果嵌套处理

TeacherMapper.java

 //按照结果嵌套查询
 Teacher getTeacher2(@Param("tid")int id);

TeacherMapper.xml

    <!--按照结果嵌套处理-->
    <select id="getTeacher2" resultMap="teacherStudent">
        select s.id sid,s.name sname,t.id tid,t.name tname
        from student s,teacher t where s.tid = t.id and t.id =#{tid}
    </select>

    <resultMap id="teacherStudent" type="Teacher">
        <result property="id" column="tid"></result>
        <result property="name" column="tname"></result>
        <!--复杂的属性,需要单独处理,对象: asssciation  集合collection
            javaType=""指定属性的类型!
            集合中的泛型信息,我们使用ofType获取
        -->
        <collection property="student" ofType="Student">
            <result property="id" column="sid"></result>
            <result property="name" column="sname"></result>
            <result property="tid" column="tid"></result>
        </collection>
    </resultMap>

MyTest.java

        @Test
        public void getTeacher2(){

            SqlSession sqlSession = MybatisUtils.getSqlSession();

            TeacherMapper mapper = sqlSession.getMapper(TeacherMapper.class);

            Teacher teacher2 = mapper.getTeacher2(1);

            System.out.println(teacher2);

            sqlSession.close();
        }

在这里插入图片描述

5.2.3 按照查询嵌套处理

TeacherMapper.java

 //按照查询嵌套处理
 Teacher getTeacher3(@Param("tid")int id);

TeacherMapper.xml

    <!--按照查询嵌套处理-->
    <select id="getTeacher3" resultMap="teacherStudent3">
        select * from teacher where id=#{tid}
    </select>

    <resultMap id="teacherStudent3" type="Teacher">
        <collection property="student" javaType="ArrayList" ofType="Student"  select="getTeacherByStudentById" column="id">

        </collection>
    </resultMap>

    <select id="getTeacherByStudentById" resultType="Student">
        select * from student where tid=#{tid}
    </select>

MyTest.java

 @Test
 public void getTeacher3(){
     SqlSession sqlSession = MybatisUtils.getSqlSession();

     TeacherMapper mapper = sqlSession.getMapper(TeacherMapper.class);

     Teacher teacher3 = mapper.getTeacher3(1);

     System.out.println(teacher3);
 }

在这里插入图片描述

5.3 总结:👇🏾👇🏾

  1. 关联 association【多对一】
  2. 集合 collection【一对多】
  3. javaType & ofType
    3. 1 javaType 用来指定实体类中属性的类型
    3. 2 ofType 用来指定映射到List或者集合中的pojo类型,泛型中的约束类型!

5.4 注意点:👇🏾👇🏾

  • 保证SQL的可读性,尽量保证通俗易懂
  • 注意一对多和多对一,属性名和字段的问题1
  • 如果问题不好排查错误,可以使用日志,建议使用Log4j

5.5 面试高频:👇🏾👇🏾

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Daniel521-Spark

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值