1、建库建表
create table emp (empNo varchar(10) null,empName varchar(100) null,sal int null,deptno varchar(10) null );
2、pom.xml
<dependencies><dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId></dependency><!-- MySQL驱动 mybatis底层依赖jdbc驱动实现,本次不需要导入连接池,mybatis自带! --><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId></dependency><!--junit5测试--><dependency><groupId>org.junit.jupiter</groupId><artifactId>junit-jupiter-api</artifactId></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></dependency></dependencies>
3、Emp.java
package com.atguigu.mybatis.pojo; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; @Data @NoArgsConstructor @AllArgsConstructor public class Emp {private String empNo;private String empName;private Integer sal;private String deptno; }
4、EmpMapper.java
package com.atguigu.mybatis.mapper; import java.util.List; import java.util.Map; public interface EmpMapper {List<Map<String, Object>> getAvgSal(); }
5、mybatis-config.xml(mybatis的总配置文件)
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE configurationPUBLIC "-//mybatis.org//DTD Config 3.0//EN""http://mybatis.org/dtd/mybatis-3-config.dtd"> <configuration><!-- 具体配置 --><!-- 从org.apache.ibatis.session.Configuration类中可以查看能使用的配置项 --><!-- 将mapUnderscoreToCamelCase属性配置为true,表示开启自动映射驼峰式命名规则 --><!-- 规则要求数据库表字段命名方式:单词_单词 --><!-- 规则要求Java实体类属性名命名方式:首字母小写的驼峰式命名 --><settings><setting name="mapUnderscoreToCamelCase" value="true"/></settings><typeAliases><!--<typeAlias type="com.atguigu.mybatis.pojo.Employee" alias="emp"/>--><package name="com.atguigu.mybatis.pojo"/></typeAliases><!-- environments表示配置Mybatis的开发环境,可以配置多个环境,在众多具体环境中,使用default属性指定实际运行时使用的环境。default属性的取值是environment标签的id属性的值。 --><environments default="development"><!-- environment表示配置Mybatis的一个具体的环境 --><environment id="development"><!-- Mybatis的内置的事务管理器 --><transactionManager type="JDBC"/><!-- 配置数据源 --><dataSource type="POOLED"><!-- 建立数据库连接的具体信息 --><property name="driver" value="com.mysql.cj.jdbc.Driver"/><property name="url" value="jdbc:mysql://localhost:3306/mybatis-example"/><property name="username" value="root"/><property name="password" value="123456"/></dataSource></environment></environments><mappers><!-- Mapper注册:指定Mybatis映射文件的具体位置 --><!-- mapper标签:配置一个具体的Mapper映射文件 --><!-- resource属性:指定Mapper映射文件的实际存储位置,这里需要使用一个以类路径根目录为基准的相对路径 --><!-- 对Maven工程的目录结构来说,resources目录下的内容会直接放入类路径,所以这里我们可以以resources目录为基准 --><mapper resource="mapper/EmpMapper.xml"/></mappers></configuration>
6、EmpMapper.xml
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""https://mybatis.org/dtd/mybatis-3-mapper.dtd"> <!-- namespace等于mapper接口类的全限定名,这样实现对应 --> <mapper namespace="com.atguigu.mybatis.mapper.EmpMapper"><!--演示输出数据类型--><select id="getAvgSal" resultMap="avgSalResultMap">select deptno,avg(sal) as avgSql from emp group by deptno</select><resultMap id="avgSalResultMap" type="map"><result property="deptno" column="deptno"/><result property="avgSal" column="avgSal"/></resultMap></mapper>
7、MybatisTest.java
package com.atguigu.mybatis; import com.atguigu.mybatis.mapper.EmpMapper; 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 org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import java.io.IOException; import java.io.InputStream; import java.util.Map; public class MybatisTest {SqlSessionFactory sqlSessionFactory;SqlSession sqlSession;EmpMapper empMapper;@BeforeEachpublic void setup() throws IOException {// 获取资源流,读取"mybatis-config.xml"文件InputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml");// 使用资源流创建SqlSessionFactorysqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);// 使用SqlSessionFactory打开一个SessionsqlSession = sqlSessionFactory.openSession();//基于Mapper接口编程empMapper = sqlSession.getMapper(EmpMapper.class);}// 在每个测试用例之后执行的清理方法@AfterEachpublic void teardown() {sqlSession.commit(); // 提交事务sqlSession.close(); // 关闭SqlSession}@Testpublic void test01() {// 遍历 empMapper.getAvgSal() 方法返回的每一个 map 对象for (Map<String, Object> stringObjectMap : empMapper.getAvgSal()) {// 遍历当前 map 对象的每个键值对stringObjectMap.forEach((k,v) -> {// 打印键值对的键和值System.out.println(k + "->" + v);});}} }
8、resultMap
看起来你正在使用MyBatis框架,这段代码是MyBatis中的resultMap。这段代码定义了一个名为"avgSalResultMap"的结果映射,它把数据库中的字段映射到Java对象(在这个例子中是一个Map)的属性上。
这段代码的意思是:
id="avgSalResultMap"
:定义了这个resultMap的唯一标识符。type="map"
:指定了这个resultMap的返回类型是Map。<result property="deptno" column="deptno"/>
:表示将数据库中的"deptno"字段映射到Java对象(在这个例子中是Map)的"deptno"属性。<result property="avgSal" column="avgSal"/>
:表示将数据库中的"avgSal"字段映射到Java对象(在这个例子中是Map)的"avgSal"属性。如果你的目的是从数据库查询部门编号(deptno)和平均工资(avgSal),并将结果存储在一个Map中,那么这个resultMap的定义是正确的。这个Map的键是部门编号,值是平均工资。
然后你可以在你的MyBatis SQL语句中使用这个resultMap,例如:
<select id="selectDepartmentAverageSalary" resultMap="avgSalResultMap"> SELECT deptno, avgSal FROM department </select>
这个SQL语句会查询department表中的所有记录,然后使用"avgSalResultMap"这个resultMap来将查询结果映射到一个Map中。