首页 > 其他分享 >MyBatis基本使用(数据输出)

MyBatis基本使用(数据输出)

时间:2024-10-16 20:53:30浏览次数:3  
标签:基本 输出 实体类 别名 类型 emp MyBatis 语句 id

导言

        上期讲了一部分关于mybatis的基本使用知识点,本期继续整理mybatis基本使用知识点(数据输出)上期内容:MyBatis基本使用(上)_mybatis的配置文件使用**settings标签**设置-CSDN博客

输出概述

数据输出总体上有两种形式:

- 增删改操作返回的受影响行数:直接使用 int 或 long 类型接收即可
- 查询操作的查询结果

我们需要做的是,指定查询的输出数据类型即可!

并且插入场景下,实现主键数据回显示!

单个简单类型

Mapper接口中的抽象方法

int selectEmpCount();

SQL语句

<select id="selectEmpCount" resultType="int">
  select count(*) from t_emp
</select>

> Mybatis 内部给常用的数据类型设定了很多别名。 以 int 类型为例,可以写的名称有:int、integer、Integer、java.lang.Integer、Int、INT、INTEGER 等等。

junit测试

@Test

public void testEmpCount() {

  EmployeeMapper employeeMapper = session.getMapper(EmployeeMapper.class);

  int count = employeeMapper.selectEmpCount();

  log.info("count = " + count);

}

**细节解释:**

  select标签,通过resultType指定查询返回值类型!

  resultType = "全限定符 | 别名 | 如果是返回集合类型,写范型类型即可"

别名问题:

类型别名可为 Java 类型设置一个缩写名字。 它仅用于 XML 配置,意在降低冗余的全限定类名书写。例如:

<typeAliases>
  <typeAlias alias="Author" type="domain.blog.Author"/>
  <typeAlias alias="Blog" type="domain.blog.Blog"/>
</typeAliases>

当这样配置时,`Blog` 可以用在任何使用 `domain.blog.Blog` 的地方。

也可以指定一个包名,MyBatis 会在包名下面搜索需要的 Java Bean,比如:

<typeAliases> <package name="domain.blog"/> </typeAliases>

每一个在包 domain.blog 中的 Java Bean,在没有注解的情况下,会使用 Bean 的首字母小写的非限定类名来作为它的别名。 比如 domain.blog.Author 的别名为 author;若有注解,则别名为其注解值。见下面的例子:

@Alias("author")
public class Author {
    ...
}

下面是Mybatis为常见的 Java 类型内建的类型别名。它们都是不区分大小写的,注意,为了应对原始类型的命名重复,采取了特殊的命名风格。

别名映射的类型
_bytebyte
_char (since 3.5.10)char
_character (since 3.5.10)char
_longlong
_shortshort
_intint
_integerint
_doubledouble
_floatfloat
_booleanboolean
stringString
byteByte
char (since 3.5.10)Character
character (since 3.5.10)Character
longLong
shortShort
intInteger
integerInteger
doubleDouble
floatFloat
booleanBoolean
dateDate
decimalBigDecimal
bigdecimalBigDecimal
bigintegerBigInteger
objectObject
object[]Object[]
mapMap
hashmapHashMap
listList
arraylistArrayList
collectionCollection

返回实体类对象

Mapper接口的抽象方法

Employee selectEmployee(Integer empId);

SQL语句

<!-- 编写具体的SQL语句,使用id属性唯一的标记一条SQL语句 -->
<!-- resultType属性:指定封装查询结果的Java实体类的全类名 -->
<select id="selectEmployee" resultType="com.atguigu.mybatis.entity.Employee">

  <!-- Mybatis负责把SQL语句中的#{}部分替换成“?”占位符 -->
  <!-- 给每一个字段设置一个别名,让别名和Java实体类中属性名一致 -->
  select emp_id empId,emp_name empName,emp_salary empSalary from t_emp where emp_id=#{maomi}

</select>

通过给数据库表字段加别名,让查询结果的每一列都和Java实体类中属性对应起来。

增加全局配置自动识别对应关系

在 Mybatis 全局配置文件中,做了下面的配置,select语句中可以不给字段设置别名

<!-- 在全局范围内对Mybatis进行配置 -->
<settings>

  <!-- 具体配置 -->
  <!-- 从org.apache.ibatis.session.Configuration类中可以查看能使用的配置项 -->
  <!-- 将mapUnderscoreToCamelCase属性配置为true,表示开启自动映射驼峰式命名规则 -->
  <!-- 规则要求数据库表字段命名方式:单词_单词 -->
  <!-- 规则要求Java实体类属性名命名方式:首字母小写的驼峰式命名 -->
  <setting name="mapUnderscoreToCamelCase" value="true"/>

</settings>

返回Map类型

适用于SQL查询返回的各个字段综合起来并不和任何一个现有的实体类对应,没法封装到实体类对象中。能够封装成实体类类型的,就不使用Map类型。

Mapper接口的抽象方法

Map<String,Object> selectEmpNameAndMaxSalary();

SQL语句

<!-- Map<String,Object> selectEmpNameAndMaxSalary(); -->
<!-- 返回工资最高的员工的姓名和他的工资 -->
<select id="selectEmpNameAndMaxSalary" resultType="map">
  SELECT
    emp_name 员工姓名,
    emp_salary 员工工资,
    (SELECT AVG(emp_salary) FROM t_emp) 部门平均工资
  FROM t_emp WHERE emp_salary=(
    SELECT MAX(emp_salary) FROM t_emp
  )
</select>

JUnit测试

@Test
public void testQueryEmpNameAndSalary() {

  EmployeeMapper employeeMapper = session.getMapper(EmployeeMapper.class);

  Map<String, Object> resultMap = employeeMapper.selectEmpNameAndMaxSalary();

  Set<Map.Entry<String, Object>> entrySet = resultMap.entrySet();

  for (Map.Entry<String, Object> entry : entrySet) {

    String key = entry.getKey();

    Object value = entry.getValue();

    log.info(key + "=" + value);

  }
}

返回List类型

查询结果返回多个实体类对象,希望把多个实体类对象放在List集合中返回。此时不需要任何特殊处理,在resultType属性中还是设置实体类类型即可。

Mapper接口中抽象方法

List<Employee> selectAll();

SQL语句

<!-- List<Employee> selectAll(); -->
<select id="selectAll" resultType="com.atguigu.mybatis.entity.Employee">
  select emp_id empId,emp_name empName,emp_salary empSalary
  from t_emp
</select>

JUnit测试

@Test
public void testSelectAll() {
  EmployeeMapper employeeMapper = session.getMapper(EmployeeMapper.class);
  List<Employee> employeeList = employeeMapper.selectAll();
  for (Employee employee : employeeList) {
    log.info("employee = " + employee);
  }
}

返回主键值

1.自增长类型主键

Mapper接口中的抽象方法

int insertEmployee(Employee employee);

SQL语句

<!-- int insertEmployee(Employee employee); -->
<!-- useGeneratedKeys属性字面意思就是“使用生成的主键” -->
<!-- keyProperty属性可以指定主键在实体类对象中对应的属性名,Mybatis会将拿到的主键值存入这个属性 -->
<insert id="insertEmployee" useGeneratedKeys="true" keyProperty="empId">
  insert into t_emp(emp_name,emp_salary)
  values(#{empName},#{empSalary})
</insert>

JUnit测试

@Test
public void testSaveEmp() {
  EmployeeMapper employeeMapper = session.getMapper(EmployeeMapper.class);
  Employee employee = new Employee();
  employee.setEmpName("john");
  employee.setEmpSalary(666.66);
  employeeMapper.insertEmployee(employee);
  log.info("employee.getEmpId() = " + employee.getEmpId());
}

 

注意

Mybatis是将自增主键的值设置到实体类对象中,而不是以Mapper接口方法返回值的形式返回。

2.非自增长类型主键

而对于不支持自增型主键的数据库(例如 Oracle)或者字符串类型主键,则可以使用 selectKey 子元素:selectKey 元素将会首先运行,id 会被设置,然后插入语句会被调用!

使用 `selectKey` 帮助插入UUID作为字符串类型主键示例:

<insert id="insertUser" parameterType="User">
    <selectKey keyProperty="id" resultType="java.lang.String"
        order="BEFORE">
        SELECT UUID() as id
    </selectKey>
    INSERT INTO user (id, username, password) 
    VALUES (
        #{id},
        #{username},
        #{password}
    )
</insert>

在上例中,我们定义了一个 `insertUser` 的插入语句来将 `User` 对象插入到 `user` 表中。我们使用 `selectKey` 来查询 UUID 并设置到 `id` 字段中。

通过 `keyProperty` 属性来指定查询到的 UUID 赋值给对象中的 `id` 属性,而 `resultType` 属性指定了 UUID 的类型为 `java.lang.String`。

需要注意的是,我们将 `selectKey` 放在了插入语句的前面,这是因为 MySQL 在 `insert` 语句中只支持一个 `select` 子句,而 `selectKey` 中查询 UUID 的语句就是一个 `select` 子句,因此我们需要将其放在前面。

最后,在将 `User` 对象插入到 `user` 表中时,我们直接使用对象中的 `id` 属性来插入主键值。

使用这种方式,我们可以方便地插入 UUID 作为字符串类型主键。当然,还有其他插入方式可以使用,如使用Java代码生成UUID并在类中显式设置值等。需要根据具体应用场景和需求选择合适的插入方式。

实体类属性和数据库字段对应关系

1.别名对应

将字段的别名设置成和实体类属性一致。

<!-- 编写具体的SQL语句,使用id属性唯一的标记一条SQL语句 -->
<!-- resultType属性:指定封装查询结果的Java实体类的全类名 -->
<select id="selectEmployee" resultType="com.atguigu.mybatis.entity.Employee">

  <!-- Mybatis负责把SQL语句中的#{}部分替换成“?”占位符 -->
  <!-- 给每一个字段设置一个别名,让别名和Java实体类中属性名一致 -->
  select emp_id empId,emp_name empName,emp_salary empSalary from t_emp where emp_id=#{maomi}

</select>

关于实体类属性的约定:

getXxx()方法、setXxx()方法把方法名中的get或set去掉,首字母小写。

2.全局配置自动识别驼峰式命名规则

在Mybatis全局配置文件加入如下配置:

<!-- 使用settings对Mybatis全局进行设置 -->
<settings>

  <!-- 将xxx_xxx这样的列名自动映射到xxXxx这样驼峰式命名的属性名 -->
  <setting name="mapUnderscoreToCamelCase" value="true"/>

</settings>

SQL语句中可以不使用别名

<!-- Employee selectEmployee(Integer empId); -->
<select id="selectEmployee" resultType="com.atguigu.mybatis.entity.Employee">

  select emp_id,emp_name,emp_salary from t_emp where emp_id=#{empId}

</select>

3.使用resultMap

使用resultMap标签定义对应关系,再在后面的SQL语句中引用这个对应关系

<!-- 专门声明一个resultMap设定column到property之间的对应关系 -->
<resultMap id="selectEmployeeByRMResultMap" type="com.atguigu.mybatis.entity.Employee">

  <!-- 使用id标签设置主键列和主键属性之间的对应关系 -->
  <!-- column属性用于指定字段名;property属性用于指定Java实体类属性名 -->
  <id column="emp_id" property="empId"/>

  <!-- 使用result标签设置普通字段和Java实体类属性之间的关系 -->
  <result column="emp_name" property="empName"/>

  <result column="emp_salary" property="empSalary"/>

</resultMap>

<!-- Employee selectEmployeeByRM(Integer empId); -->
<select id="selectEmployeeByRM" resultMap="selectEmployeeByRMResultMap">

  select emp_id,emp_name,emp_salary from t_emp where emp_id=#{empId}

</select>

结尾

各位佬佬如果想了解更多知识,可以持续关注哟!!!想知道上期内容也可以点击此链接进行观看

MyBatis基本使用(上)_mybatis的配置文件使用**settings标签**设置-CSDN博客

标签:基本,输出,实体类,别名,类型,emp,MyBatis,语句,id
From: https://blog.csdn.net/2401_82689064/article/details/142990887

相关文章

  • 变量与数据类型:程序的基本构建块!
    Java入门之旅:变量与数据类型的奥秘在编程的世界里,变量就像是每个程序员的好伙伴,它们在代码中存储着各种信息,帮助我们在计算机中执行复杂的逻辑。而数据类型则是对这些变量的基本属性定义,影响着它们的行为和存储方式。今天,就让我们一起探索Java中的变量和数据类型,揭开它们的......
  • [独家原创]基于深度混合核极限学习机(DHKELM)的数据多输出回归预测 Matlab (多输入多
    [独家原创]基于深度混合核极限学习机(DHKELM)的数据多输出回归预测(多输入多输出)每个输出都有以下线性拟合图等四张图!!!具体看图,独家图像!!!程序已经调试好,替换数据集根据输出个数修改outdim值即可运行!!!数据格式为excel!(如下)你先用你就是创新!!!1.也可以定制添加优化算法!2.将多项......
  • 【Linux】解锁线程基本概念和线程控制,步入多线程学习的大门
    目录1、线程初识1.1线程的概念1.2.关于线程和进程的进一步理解1.3.线程的设计理念1.4.进程vs线程(图解)1.5地址空间的第四谈2.线程的控制:2.1.关于线程控制的前置知识2.2创建线程的系统调用:这个几号手册具体代表的什么含义?2.3.线程终止我们怎么没有像进程一样获取线程......
  • Thread类的基本用法
    一、线程创建1.继承Thread,重写runpackagedemo1;//继承Thread,重写runclassMyThreadextendsThread{@Overridepublicvoidrun(){System.out.println("继承Thread,重写run");}}publicclassDemo1{publicstaticvoidmain(Str......
  • VOSK实现语音输出
    以下代码读取麦克风输入并输出中文:#encoding:utf-8importwaveimporttimeimportjsonimportthreadingfromvoskimportModel,KaldiRecognizer,SetLogLevel#禁止日志输出SetLogLevel(-1)model_path="models/vosk-model-cn-0.1"model=Model(model_path)defre......
  • cisco nexus7000 基本系统配置及OTV
    cisconexus7000基本系统配置1.开启cdpcdpenablecdpformatdevice-idsystem-name默认是对端设备的设备名2.ntp开启普通vdc2下开启ntp同步,先在defaultvdc上打上clockprotocolntpvdc2DC1-N7K-2(config)#ntpserver10.1.1.1use-vrfmannagementDC1-N7K-2(config)#ntpso......
  • Java Stream基本用法
    介绍JavaStream是Java8中引入的一个新的抽象概念,它允许以声明式的方式处理数据集合。Stream将要处理的元素集合视为一种流,在流的过程中,可以利用StreamAPI对元素进行各种操作,如筛选、排序、聚合等。Stream操作可以分为中间操作和终端操作,中间操作每次返回一个新的流,可以有多......
  • STM32开发————定时器的基本配置
    一、将定时器相关的.c和.h添加到新建的工程中添加文件路径:二、对.c和.h文件进行代码编写打开timer.h文件,写一下防止重复包含的宏定义#ifndef__TIMER_H#define__TIMER_H#endif打开timer.c文件,包含一下STM32的头文件:“右键单机”--->Insert'#includefi......
  • Mybatis-plus 3.5.4 的AOP问题 java.lang.ClassCastException: class org.springfram
    报错,然后我把mapper上的@repository删掉就好了,为什么ChatGPT说:ChatGPT删除@Repository注解后问题解决,可能是与SpringAOP代理机制和MyBatisPlus结合时的一些细节有关。以下是原因分析:@Repository和SpringAOP代理的影响@Repository注解的主要作用是将类标记为持......
  • 基于SpringBoot + mybatis + logback + shiro的仓库管理系统(完美运行、数据库源代码、
    文章目录前言一、系统功能模块二、开发环境三、部分功能模块展示3.1登录模块3.2后台首页3.3客户管理3.4供应商管理3.5商品管理3.6商品进货3.7商品退货查询3.8商品销售3.9销售退货查询3.10部门管理3.11菜单管理3.12权限管理3.13角色管理3.14用户管理3.15图......