首页 > 其他分享 >08. MyBatis的查询专题

08. MyBatis的查询专题

时间:2022-10-14 21:45:35浏览次数:46  
标签:empId mapper 专题 08 sex sqlSession emp MyBatis public

一、环境的搭建

1.1、数据的准备

CREATE DATABASE IF NOT EXISTS db_test;
USE db_test;

CREATE TABLE IF NOT EXISTS t_emp(
	emp_id INT PRIMARY KEY auto_increment,
	emp_name VARCHAR(20),
	age INT,
	sex VARCHAR(10),
	salary DOUBLE
);

INSERT INTO t_emp(emp_id,emp_name,age,sex,salary)
VALUES (null,'Sakura',10,"女",7300),
    (null,'Mikoto',14,"女",7000),
    (null,'Shana',15,'女',7100),
    (null,'Kikyō',18,'女',6700),
    (null,'Kagome',15,'女',6500);

1.2、导入jar包

  通过 maven 的方式导入 jar包,打包方式设置为 jar 包即可。

<dependency>
    <groupId>org.mybatis</groupId>
    <artifactId>mybatis</artifactId>
    <version>3.5.7</version>
</dependency>

<!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>8.0.29</version>
</dependency>

<!-- junit 测试程序 -->
<dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>4.12</version>
    <scope>test</scope>
</dependency>

1.3、创建核心配置文件

  创建 MyBatis 的核心配置文件,习惯上命名为 mybatis-config.xml,这个文件名仅仅只是建议,并非强制要求。配置 MyBatis 的核心配置文件中的标签必须按照固定的顺序:

properties --> settings --> typeAliases --> typeHandlers --> objectFactory --> objectWrapperFactory --> reflectorFactory --> plugins --> environments --> databaseIdProvider --> mappers

<?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="jdbc.properties"/>

    <!-- settings标签的内容是MyBatis极为重要的调整设置,它们会改变MyBatis的运行时行为 -->
    <settings>
        <!-- 指定MyBatis所有日志的具体实现,未指定时将自动查找 -->
        <setting name="logImpl" value="STDOUT_LOGGING"/>
    </settings>

    <typeAliases>
        <!-- 将这个包下的所有的类全部起别名,别名就是类简名,不区分大小写 -->
        <package name="star.light.pojo"/>
    </typeAliases>

    <!-- environments:配置多个连接数据库环境 -->
    <environments default="development">
        <!-- environment:配置某个具体的环境 -->
        <environment id="development">
            <!-- 设置事务管理方式 -->
            <transactionManager type="JDBC"/>
            <!-- 配置数据源 -->
            <dataSource type="POOLED">
                <!-- 设置连接数据库的驱动 -->
                <property name="driver" value="${jdbc.driver}"/>
                <!-- 设置连接数据库的地址 -->
                <property name="url" value="${jdbc.url}"/>
                <!-- 设置连接数据库的用户名 -->
                <property name="username" value="${jdbc.username}"/>
                <!-- 设置连接数据库的密码 -->
                <property name="password" value="${jdbc.password}"/>
            </dataSource>
        </environment>
    </environments>

    <!--引入映射文件-->
    <mappers>
        <!-- 从Mapper接口所在的包的路径中加载 -->
        <package name="star.light.mapper"/>
    </mappers>
</configuration>

  数据库连接信息的配置文件:jdbc.properties

jdbc.driver=com.mysql.cj.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/db_test
jdbc.username=root
jdbc.password=abc123

1.4、创建MyBatis映射文件

  MyBatis 的映射文件存放的目录要与 Mapper 接口的路径一致。

<?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">
<!--
    namespace用来指定命名空间的,防止id重复
    如果在多个Mapper文件中,SQL语句的id重复,这时可以在Java程序中写namespace.id
    实质上,本质上,MyBatis中的SQLId的完整写法为namespace.id
-->
<mapper namespace="star.light.mapper.EmpMapper">

</mapper>

1.5、创建Mapper接口

  接口的名字可以随便起,这里只是根据习惯取 XxxMapper。

package star.light.mapper;

public interface EmpMapper {
  
    /**
     * MyBatis 面向接口编程的两个一致:
     *  1、映射文件的 namespace 要和 mapper 接口的全类名保持一致
     *  2、映射文件中 SQL 语句的 id 要和 mapper 接口中方法名一致
     */

}

1.6、创建实体类

package star.light.pojo;

public class Employee {
    private Integer empId;
    private String empName;
    private Integer age;
    private String sex;
    private Double salary;

    public Employee() {
    }

    public Employee(Integer empId, String empName, Integer age, String sex, Double salary) {
        this.empId = empId;
        this.empName = empName;
        this.age = age;
        this.sex = sex;
        this.salary = salary;
    }

    public Integer getEmpId() {
        return empId;
    }

    public void setEmpId(Integer empId) {
        this.empId = empId;
    }

    public String getEmpName() {
        return empName;
    }

    public void setEmpName(String empName) {
        this.empName = empName;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    public String getSex() {
        return sex;
    }

    public void setSex(String sex) {
        this.sex = sex;
    }

    public Double getSalary() {
        return salary;
    }

    public void setSalary(Double salary) {
        this.salary = salary;
    }

    @Override
    public String toString() {
        return "Employee{" +
                "empId=" + empId +
                ", empName='" + empName + '\'' +
                ", age=" + age +
                ", sex='" + sex + '\'' +
                ", salary=" + salary +
                '}';
    }
}

1.7、封装SqlSessionUtil工具类

package star.light.util;

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.IOException;

public class SqlSessionUtil {
    private static SqlSessionFactory sqlSessionFactory;

    // 为了防止new对象,工具类的构造方法一般都是私有的
    // 工具类中所有的方法都是静态的,直接采用类型即可调用,不需要new对象
    private SqlSessionUtil(){}

    // 静态代码块在类加载的时候执行
    // SqlSesionUtil工具类在进行第一次加载的时候,解析MyBatis和核心配置文件,创建SqlSessionFactory对象
    static {
        try {
            sqlSessionFactory = new SqlSessionFactoryBuilder().build(Resources.getResourceAsStream("mybatis-config.xml"));
        } catch (IOException e) {
            e.printStackTrace();
            throw new RuntimeException(e);
        }
    }

    /**
     * 获取会话对象
     * @return 会话对象
     */
    public static SqlSession getSqlSession(){
        return sqlSessionFactory.openSession();
    }
}

二、返回一个Pojo

在 Mapper 接口中添加如下内容

Employee selectEmpByEmpId(int empId);	                    // 根据empId查询员工信息,返回一个Pojo对象

在 MyBatis 映射文件添加如下内容

<!-- Employee selectEmpByEmpId(int empId); -->
<select id="selectEmpByEmpId" resultType="Employee">
    select
        emp_id as empId,
        emp_name as empName,
        age, sex, salary
    from t_emp
    where emp_id = #{empId}
</select>

测试程序

package star.light.test;

import org.apache.ibatis.session.SqlSession;
import org.junit.Test;
import star.light.mapper.EmpMapper;
import star.light.pojo.Employee;
import star.light.util.SqlSessionUtil;

public class EmpMapperTest {

    @Test
    public void testSelectEmpByEmpId(){
        SqlSession sqlSession = SqlSessionUtil.getSqlSession();
        EmpMapper mapper = sqlSession.getMapper(EmpMapper.class);
        Employee employee = mapper.selectEmpByEmpId(1);
        System.out.println(employee);
        sqlSession.close();
    }
}

三、返回多个Pojo

在 Mapper 接口中添加如下内容

List<Employee> selectEmpByEmpName(String empName);      // 根据empName查询员工信息,返回多个Pojo对象

在 MyBatis 映射文件添加如下内容

<!-- List<Employee> selectEmpByEmpName(String empName); -->
<select id="selectEmpByEmpName" resultType="Employee">
    select
        emp_id as empId,
        emp_name as empName,
        age, sex, salary
    from t_emp
    where emp_name = #{empName}
</select>

在测试程序中添加如下测试方法

@Test
public void testSelectEmpByEmpName(){
    SqlSession sqlSession = SqlSessionUtil.getSqlSession();
    EmpMapper mapper = sqlSession.getMapper(EmpMapper.class);
    List<Employee> employees = mapper.selectEmpByEmpName("Sakura");
    employees.forEach(System.out::println);
    sqlSession.close();
}

如果查询数据库返回多条记录,但是你使用单个对象来接收,那么会发生 TooManyResultsException 异常;

如果查询数据库只返回一条记录,可是使用 List 集合接收;

四、返回一个Map

在 Mapper 接口中添加如下内容

Map<String,Object> selectEmpByEmpIdReturnMap(int empId);                // 根据empId查询员工信息,返回一个Map集合

在 MyBatis 映射文件添加如下内容

<!--
    Map<String,Object> selectEmpByEmpIdReturnMap(int empId);
    resultType="java.util.Map",有别名map
    Map集合的key为数据库表中的字段名,value为数据路表中的字段值
-->
<select id="selectEmpByEmpIdReturnMap" resultType="map">
    select emp_id, emp_name, age, sex, salary from t_emp where emp_id = #{empId}
</select>

在测试程序中添加如下测试方法

@Test
public void testSelectEmpByEmpIdReturnMap(){
    SqlSession sqlSession = SqlSessionUtil.getSqlSession();
    EmpMapper mapper = sqlSession.getMapper(EmpMapper.class);
    Map<String, Object> map = mapper.selectEmpByEmpIdReturnMap(1);
    System.out.println(map);
    sqlSession.close();
}

五、返回多个Map

在 Mapper 接口中添加如下内容

List<Map<String,Object>> selectAllEmpReturnListMap();                   // 查询所有员工信息,返回多个Map集合

在 MyBatis 映射文件添加如下内容

<!--
    List<Map<String,Object>> selectAllEmpReturnListMap();
    resultType="java.util.Map",有别名map
    Map集合的key为查询结果集的列的名字(别名),value为数据路表中的字段值
-->
<select id="selectAllEmpReturnListMap" resultType="map">
    select
        emp_id as empId,
        emp_name as empName,
        age, sex, salary
    from t_emp
</select>

在测试程序中添加如下测试方法

@Test
public void testSelectAllEmpReturnListMap(){
    SqlSession sqlSession = SqlSessionUtil.getSqlSession();
    EmpMapper mapper = sqlSession.getMapper(EmpMapper.class);
    List<Map<String, Object>> maps = mapper.selectAllEmpReturnListMap();
    maps.forEach(System.out::println);
    sqlSession.close();
}

六、返回大Map

在 Mapper 接口中添加如下内容

@MapKey("emp_id")                                                       // 将查询结果的id值作为这个大Map集合的key
Map<Integer,Map<String,Object>> selectAllEmpReturnMap();                // 查询所有员工信息,返回大Map集合

在 MyBatis 映射文件添加如下内容

<!--
    @MapKey("emp_id")
    Map<Integer,Map<String,Object>> selectAllEmpReturnMap();
    Map集合的key是每条记录的主键值
    Map集合的value是每条记录
    -->
<select id="selectAllEmpReturnMap" resultType="map">
    select emp_id, emp_name, age, sex, salary from t_emp
</select>

在测试程序中添加如下测试方法

@Test
public void testSelectAllEmpReturnMap(){
    SqlSession sqlSession = SqlSessionUtil.getSqlSession();
    EmpMapper mapper = sqlSession.getMapper(EmpMapper.class);
    Map<Integer, Map<String, Object>> map = mapper.selectAllEmpReturnMap();
    System.out.println(map);
    sqlSession.close();
}

七、resultMap结果映射

在 Mapper 接口中添加如下内容

List<Employee> selectAllEmpByResultMap();                               // 查询所有员工信息,使用resultMap标签进行结果映射

在 MyBatis 映射文件添加如下内容

<!--
    专门定义一个结果映射,在这个结果映射映射当中指明数据库表中的字段名和Java类的属性名的对应关系
        id属性:指定resultMap的唯一标识,这个id将来在select标签中使用
        type属性:用来指定Pojo类的类型,可以使用别名
-->
<resultMap id="empResultMap" type="star.light.pojo.Employee">
    <!--
        id标签:设置主键的映射关系
            column属性:数据库表的字段名
            property属性:Pojo类的属性名
    -->
    <id column="emp_id" property="empId"></id>
    <!--
        result标签:设置普通字段的映射关系
            column属性:数据库表的字段名
            property属性:Pojo类的属性名
        如果column与property是一致的,可以省略
    -->
    <result column="emp_name" property="empName"></result>
</resultMap>

<!--
    List<Employee> selectAllEmpByResultMap();
    select标签的resultMap属性,用来指定使用哪个结果映射,resultMap后面的值是resultMap的id
    -->
<select id="selectAllEmpByResultMap" resultMap="empResultMap">
    select emp_id, emp_name, age, sex, salary from t_emp
</select>

在测试程序中添加如下测试方法

@Test
public void testSelectAllEmpByResultMap(){
    SqlSession sqlSession = SqlSessionUtil.getSqlSession();
    EmpMapper mapper = sqlSession.getMapper(EmpMapper.class);
    List<Employee> employees = mapper.selectAllEmpByResultMap();
    employees.forEach(System.out::println);
    sqlSession.close();
}

八、返回总记录条数

在 Mapper 接口中添加如下内容

int getTotalEmployee();                                                 // 获取员工的总记录条数

在 MyBatis 映射文件添加如下内容

<!-- int getTotalEmployee(); -->
<select id="getTotalEmployee" resultType="int">
    select count(*) from t_emp
</select>

在测试程序中添加如下测试方法

@Test
public void testGetTotalEmployee(){
    SqlSession sqlSession = SqlSessionUtil.getSqlSession();
    EmpMapper mapper = sqlSession.getMapper(EmpMapper.class);
    int total = mapper.getTotalEmployee();
    System.out.println("总记录条数:" + total);
    sqlSession.close();
}

标签:empId,mapper,专题,08,sex,sqlSession,emp,MyBatis,public
From: https://www.cnblogs.com/nanoha/p/16793124.html

相关文章

  • 2022-10-08 20:50:49 星期六
    感觉现在啥也不会了,洛谷的普及都要写甚久,有的还要需要看题解从csp-j出分并且知道自己这一次没有希望进普及到现在已经快半个月了感觉自己要是进了复赛也可能只是拿个二等奖......
  • 多项式专题
    最近accoders天天出多项式科技题,我一道都不会,场场罚坐。气死我了,我也要学科技。杂项Lagrange插值有\(n\)个点,我们试图确定一个\(n-1\)次多项式。设这\(n\)个......
  • 【2022-10-08】连岳摘抄
    23:59办一件事,假设只有40%的把握,如果停在那里不动,就会慢慢变成20%的把握,最后变成零。但积极争取,可以将其变成60%、70%,最后将事情办成。          ......
  • logback整合mybatis plus限制日志打印
    场景:定时任务连接websocket实时推送大量数据,导致打印的sql日志太多,占满服务器磁盘内存,想要减少这些定时任务打印的sql日志又不影响别的服务sql日志打印经反复调试得知myba......
  • Mybatis-plus学习
    Mybatis-plus学习自动填充功能实体类字段添加注解packagecom.hw.mpstart.entity;importcom.baomidou.mybatisplus.annotation.*;importjava.io.Serializable;......
  • mybatisplus generator
    <?xmlversion="1.0"encoding="UTF-8"?><projectxmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:sc......
  • spring整合mybatis
    1.pom.xml中添加依赖<dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>5.2.16.RELEASE</vers......
  • 【源码级】MyBatis缓存策略
    缓存就是内存中的数据,常常来自对数据库查询结果的保存。使用缓存,我们可以避免频繁的与数据库进行交互,进而提高响应速度MyBatis也提供了对缓存的支持,分为一级缓存和二级缓存......
  • React专题(1)-环境配置
    此节把开发react需要的所有可能的环境都先描述一下,以方便后面的开发。在react开发中主要依赖的是node,主要需要配置以下内容:nvm:需要单独安装,主要是对项目使用的node.js解释器......
  • UVA10820 Send a Table
    题目翻译你决定在考试的一道题中打表。该题要求你计算的是一个二元函数\(f(x,y)\),定义域为\(x,y\in[1,+\infty]\\x,y\in\mathbb{Z}^{+}\)。该函数有一个性质,就是......