首页 > 数据库 >Mybatis07 - SQL语句的返回结果

Mybatis07 - SQL语句的返回结果

时间:2023-02-13 21:12:19浏览次数:46  
标签:语句 salary 实体类 Map emp SQL Mybatis07 id

数据输出

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

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

1、返回单个简单类型数据

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

}

2、返回实体类对象

①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>

3、返回Map类型

查询结果为多条记录,方法一: 一条数据对应一个map,多条数据使用List集合存储map集合 List<Map<String, Object>>

  • List<Map<String, Object>> getAllUserToMap();
    

查询结果为多条记录,方法二: @MapKey( 指定字段作为键 ),因为Map是键值对,每条记录的map是value,需要指定key,才能将多条记录的map存放在Map集合中

  • @MapKey("id")
    Map<String, Object> getAllUserToMap();
    

适用于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);

  }

}

4、返回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);

  }

}

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

①别名

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

<!-- 编写具体的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去掉,首字母小写。

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

在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>

③使用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>

标签:语句,salary,实体类,Map,emp,SQL,Mybatis07,id
From: https://www.cnblogs.com/Ashen-/p/17117807.html

相关文章

  • Mybatis08 - 特殊SQL
    模糊查询,不确定结果数量使用List<实体类>publicinterfaceSpecialSQLMapper{//通过用户名模糊查询用户信息List<User>getUserByLike(@Param("mohu")Stri......
  • SQL 快速入门
    1.Sql:跟关联式资料库管理系统(用表格做关联)沟通的语言2.KeyPrimarykey主键:唯一的表示每一笔资料(某一属性无法唯一的表示时,可以设定2个或两个以上的主键,不能为NUALL)......
  • sql 记录
    --查询‘张老师’教师,代课总课时的sql语句。selectSUM(courseHour)fromteachert,Timetablet2,coursecwheret.id=t2.teacherandc.id=t2.courseandt.namelike......
  • while 循环判断语句比循环操作多执行一遍
    inti,b,k=0;for(i=1;i<=5;i++){b=i%2;while(b-->=0){printf("%d\t",b);k++;}......
  • node mysql 增删改查 demo
    前端原生jsJquery后端Node数据库MySQL​​​http://hongbin.xyz:8080/​​​​github仓库​​​​演示视频地址​​node增删改查TODO:删除用户数据库需要触发器将......
  • 关于我忘记MySQL root 密码那件事
    登录MySQL时,忘记密码,百度一番找到合适的方法问题已解决,记录一下。该篇文章仅做学习用,方便自己下次查找。1、先把MySQL的服务为停了,可以直接按win键搜服务,找到MySQL服务,......
  • mysql查询语句case及时间操作
    1、获取系统当前时间戳SELECT unix_timestamp(now())*1000 --乘以1000,为了得到毫秒时间戳   2、时间戳转年月日SELECTFROM_UNIXTIME(1676280033000/1000,......
  • sql中 exists的用法
    现有:班级表(A_CLASS) 学生表(STUDENT)注:学生表(STUDENT)的classId关联班级表(A_CLASS)的主键ID  代码:select*fromSTUDENTsWHEREexists(select1fromA_ClA......
  • mysql怎么删除重复数据并且保留其中一条
    现在有张加班表,一个人同一天只允许申请一次加班,就是加班日期和userid相同的数据应该只有一条,但是现在由于之前没有做限制,导致很多数据重复怎么通过sql删掉重复数据思路:......
  • SQL执行慢的原因分析以及调优手段
    目录开发规范※谨慎使用MySQL分区表※经常一起使用的列放到一个表中※禁止在数据库中存储文件(比如图片)这类大的二进制数据所有表必须使用InnoDB存储引擎数据库和表的字......