一、环境的搭建
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