## 一、mapper代理接口 #### 1、创建Util单例类与持久化对象类 在`com.域名.项目.util`包下创建`Util.java`单例类 ```java package com.doooog.mybatis.util; import org.apache.ibatis.io.Resources; import org.apache.ibatis.session.SqlSessionFactory; import org.apache.ibatis.session.SqlSessionFactoryBuilder; import java.io.IOException; import java.io.InputStream; public class Util { private static final SqlSessionFactory sqlSessionFactory; static { SqlSessionFactory sqlSessionFactory1; try { // 1、读取Mybatis配置文件 InputStream input = Resources.getResourceAsStream("SqlMapConfig.xml"); // 2、通过配置文件信息,创建SqlSessionFactory sqlSessionFactory1 = new SqlSessionFactoryBuilder().build(input); } catch (IOException e) { sqlSessionFactory1 = null; System.out.println(e.getMessage()); } sqlSessionFactory = sqlSessionFactory1; } public static SqlSessionFactory getSqlSessionFactory() { return sqlSessionFactory; } // 获取系统日期 public static String getNewDate() { SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); return sdf.format(new Date()); } } ``` 在`com.域名.项目.po`包下创建`Emp.java`持久化对象类 ```java package com.doooog.mybatis.po; public class Emp { private Integer EMPno; private String ename; private String job; private Integer mgr; private String hiredate; private Double sal; private Double comm; private Integer DEPTno; public Emp() { } public Emp(Integer EMPno, String ename, String job, Integer mgr, String hiredate, Double sal, Double comm, Integer DEPTno) { this.EMPno = EMPno; this.ename = ename; this.job = job; this.mgr = mgr; this.hiredate = hiredate; this.sal = sal; this.comm = comm; this.DEPTno = DEPTno; } public Integer getDEPTno() { return DEPTno; } public void setDEPTno(Integer DEPTno) { this.DEPTno = DEPTno; } public Double getComm() { return comm; } public void setComm(Double comm) { this.comm = comm; } public Double getSal() { return sal; } public void setSal(Double sal) { this.sal = sal; } public String getHiredate() { return hiredate; } public void setHiredate(String hiredate) { this.hiredate = hiredate; } public Integer getMgr() { return mgr; } public void setMgr(Integer mgr) { this.mgr = mgr; } public String getJob() { return job; } public void setJob(String job) { this.job = job; } public String getEname() { return ename; } public void setEname(String ename) { this.ename = ename; } public Integer getEMPno() { return EMPno; } public void setEMPno(Integer EMPno) { this.EMPno = EMPno; } @Override public String toString() { return "Emp{" + "EMPno=" + EMPno + ", ename='" + ename + '\'' + ", job='" + job + '\'' + ", mgr='" + mgr + '\'' + ", hiredate='" + hiredate + '\'' + ", sal=" + sal + ", comm=" + comm + ", DEPTno=" + DEPTno + '}'; } } ``` #### 2、创建mapper包与文件 创建`com.doooog.mybatis.mapper`包,并在包内创建`EmpMapper.java`接口 ```java package com.doooog.mybatis.mapper; import com.doooog.mybatis.po.Emp; import java.util.List; public interface EmpMapper { Emp getEmpById(Integer EMPno); List getEmpAll(); } ``` #### 3、创建映射文件 在`src/main/resources/com/doooog/mybatis/mapper`资源目录下内创建`EmpMapper.xml`映射文件 资源路径必须与`Mapper.java`接口包文件一致(从资源根`src/main/resources/`目录开始),映射文件名也必须与接口文件名一致。 (或 在`src/main/resources/com/doooog/mybatis/po`资源目录下创建`EmpMapper.xml`映射文件) ```xml select * from emp where EMPno=#{EMPno} select * from emp order by EMPno ``` **注意**: ① namespace必须是`Mapper`接口包的全称; ② id必须与`Mapper`接口内对应的方法名一致; ③ parameterType必须与`Mapper`接口内对应的方法参数数据类型一致,一般参数数据类型为包装类; ④ resultType必须与`Mapper`接口内对应的方法返回值数据类型一致。 #### 4、导入映射文件 修改`resources`内的`SqlMapConfig.xml`文件 ① 直接导入`.xml`文件 ```xml ``` ② 导入整个包(推荐) 需要将`.java`接口文件放进`mapper`包下,`.xml`映射文件放入资源包的`mapper`目录下 ```xml ``` #### 5、创建测试类 ```java package com.doooog.mybatis; import com.doooog.mybatis.mapper.EmpMapper; import com.doooog.mybatis.po.Emp; import com.doooog.mybatis.util.Util; import org.apache.ibatis.session.SqlSession; import java.util.List; public class TestMapper { public static void main(String[] args) { SqlSession sqlSession = Util.getSqlSessionFactory().openSession(); EmpMapper empMapper = sqlSession.getMapper(EmpMapper.class); System.out.println(empMapper.getEmpById(7788)); List list = empMapper.getEmpAll(); for (Emp e:list){ System.out.println(e); } sqlSession.close(); } } ``` ## 二、配置优化 #### 1、批量配置类别名 在映射文件中返回值类型总是写持久化对象类的全名,导致内容过长可读性差,MyBatis可以自动给类取别名,别名默认为类的名称。 需要修改`rescources`目录下的`SqlMapConfig.xml`,在``下的**首行**添加以下标签 ```xml ``` name属性必须是包的全称。 添加完后回到映射文件,修改所涉及到的Type属性,将上一步添加的全称删掉,只保留类名即可。 ```xml select * from emp where EMPno=#{EMPno} select * from emp order by EMPno ``` #### 2、数据库单独配置文件 在`rescources`目录下创建`db.properties`配置文件 ```properties jdbc.mysql.driver=com.mysql.cj.jdbc.Driver jdbc.mysql.url=jdbc:mysql://localhost:3306/mySqlDbName?characterEncoding=utf-8 jdbc.mysql.username=username jdbc.mysql.password=password ``` 修改`SqlMapConfig.xml`配置文件,在``下的首行添加以下标签 ```xml ``` 修改下面数据库硬编码部分,改为`${键名}` ```xml ``` ## 三、常用CRUD操作 #### 1、多条件查询 以查询某部门某职位(模糊)的所有记录为例 在`EmpMapper.java`接口中添加 ```java // 多条件查询 List listEmpByCondition(Emp emp); ``` 在`EmpMapper.xml`映射文件中添加 ```xml select * from emp where emp.DEPTno=#{DEPTno} and emp.job like concat('%',#{job},'%') order by emp.EMPno; ``` **注意**:其中`#{参数名}`不能随便填写,需要填写`Emp`对象的属性名 在测试类中调用即可 ```java SqlSession sqlSession = Util.getSqlSessionFactory().openSession(); EmpMapper empMapper = sqlSession.getMapper(EmpMapper.class); Emp emp = new Emp(); emp.setDEPTno(20); emp.setJob("YST"); List list = empMapper.listEmpByCondition(emp); for (Emp e:list){ System.out.println(e); } sqlSession.close(); ``` #### 2、转义字符查询 因为映射文件为`.xml`格式,不能直接使用`<`,`>`等字符,所以写SQL语句时需要用到转义 | 原字符 | 转义字符 | 说明 | 示例(原SQL -> MyBatis XML) | | :----- | :------- | :----- | :------------------------------------------ | | `<` | `<` | 小于号 | `column < 10` -> `column < 10` | | `>` | `>` | 大于号 | `column > 10` -> `column > 10` | | `&` | `&` | 和号 | `status = 'A&B'` -> `status = 'A&B'` | | `'` | `'` | 单引号 | `name = 'O'Neil'` -> `name = 'O'Neil'` | | `"` | `"` | 双引号 | 在XML属性中常用,如`"value"` | 以查询员工工资小于某数为例 在`EmpMapper.java`接口中添加 ```java // 转义字符查询 List listEmpByEMPno(Double sal); ``` 在`EmpMapper.xml`映射文件中添加 ```xml select * from emp where emp.sal < #{sal} order by emp.sal; ``` 在测试类中调用即可 ```java SqlSession sqlSession = Util.getSqlSessionFactory().openSession(); EmpMapper empMapper = sqlSession.getMapper(EmpMapper.class); List list = empMapper.listEmpByEMPno(4000.0); for (Emp e : list) { System.out.println(e); } sqlSession.close(); ``` #### 3、返回单值查询 许多聚合函数都会返回单个数据值,因此有返回单值的查询 在`EmpMapper.java`接口中添加 ```java // 返回单值查询 int getEmpCount(); ``` 在`EmpMapper.xml`映射文件中添加 ```xml select count(*) from emp; ``` 在测试类中调用即可 ```java SqlSession sqlSession = Util.getSqlSessionFactory().openSession(); EmpMapper empMapper = sqlSession.getMapper(EmpMapper.class); System.out.println(empMapper.getEmpCount()); sqlSession.close(); ``` #### 4、插入记录(程序提供主键,不获取主键) 增删改命令默认返回值为`int`,则在书写映射文件时不需要由返回值类型项 在`EmpMapper.java`接口中添加 ```java // 插入数据(由程序提供主键,不获取主键) int saveEmpWithMainKey(Emp emp); ``` 在`EmpMapper.xml`映射文件中添加 ```xml insert into emp (EMPno, ename, job, mgr, hiredate, sal, comm, DEPTno) VALUES (#{EMPno}, #{ename}, #{job}, #{mgr}, #{hiredate}, #{sal}, #{comm}, #{DEPTno}) ``` 在测试类中调用即可 ```java SqlSession sqlSession = Util.getSqlSessionFactory().openSession(); EmpMapper empMapper = sqlSession.getMapper(EmpMapper.class); Emp emp = emp = new Emp(8000,"刘七","MANAGER",7788,Util.getNewDate(),2000.0,0.0,10); System.out.println(empMapper.saveEmpWithMainKey(emp)); // 增删改手动提交 sqlSession.commit(); sqlSession.close(); ``` #### 4、插入记录(获取数据库自增主键) 在`EmpMapper.java`接口中添加 ```java // 插入数据(由数据库自动生成主键,获取主键) int saveEmp(Emp emp); ``` 在`EmpMapper.xml`映射文件中添加 ```xml select LAST_INSERT_ID() insert into emp (ename, job, mgr, hiredate, sal, comm, DEPTno) VALUES (#{ename}, #{job}, #{mgr}, #{hiredate}, #{sal}, #{comm}, #{DEPTno}) ``` 其中``标签用于**在插入数据后获取数据库生成的关键值**(如自增主键、序列值等),`keyProperty`属性须填写存放主键值的对象属性名,`resultType`为返回主键值的类型,`order`是语句查询的执行顺序,值为`BEFORE`时会返回插入前的最新主键值,值为`AFTER`时会返回插入后的最新主键值。 或者添加下面的标签(适用范围小,只适用于MySQL,SQLServer等有自动增长列的数据库) ```xml insert into emp (ename, job, mgr, hiredate, sal, comm, DEPTno) VALUES (#{ename}, #{job}, #{mgr}, #{hiredate}, #{sal}, #{comm}, #{DEPTno}) ``` 在测试类中调用即可 ```java SqlSession sqlSession = Util.getSqlSessionFactory().openSession(); EmpMapper empMapper = sqlSession.getMapper(EmpMapper.class); emp = new Emp(null,"老八","MANAGER",null,Util.getNewDate(),1800.0,300.0,30); System.out.println(empMapper.saveEmp(emp)); System.out.println(emp.getEMPno()); // 增删改手动提交 sqlSession.commit(); sqlSession.close(); ``` #### 5、更新记录 在`EmpMapper.java`接口中添加 ```java // 更新 int updateEmpJobById(Emp emp); ``` 在`EmpMapper.xml`映射文件中添加 ```xml update emp set emp.job=#{job} where emp.EMPno=#{EMPno} ``` 在测试类中调用即可 ```java SqlSession sqlSession = Util.getSqlSessionFactory().openSession(); EmpMapper empMapper = sqlSession.getMapper(EmpMapper.class); emp = new Emp(); emp.setEMPno(8002); emp.setJob("ENGINEER"); System.out.println(empMapper.updateEmpJobById(emp)); // 增删改手动提交 sqlSession.commit(); System.out.println(empMapper.getEmpById(8002)); sqlSession.close(); ``` #### 6、删除记录 在`EmpMapper.java`接口中添加 ```java // 删除数据 int deleteEmpById(int EMPno); ``` 在`EmpMapper.xml`映射文件中添加 ```xml delete from emp where emp.EMPno=#{EMPno}; ``` 在测试类中调用即可 ```java SqlSession sqlSession = Util.getSqlSessionFactory().openSession(); EmpMapper empMapper = sqlSession.getMapper(EmpMapper.class); System.out.println(empMapper.deleteEmpById(8001)); // 增删改手动提交 sqlSession.commit(); sqlSession.close(); ``` Loading... ## 一、mapper代理接口 #### 1、创建Util单例类与持久化对象类 在`com.域名.项目.util`包下创建`Util.java`单例类 ```java package com.doooog.mybatis.util; import org.apache.ibatis.io.Resources; import org.apache.ibatis.session.SqlSessionFactory; import org.apache.ibatis.session.SqlSessionFactoryBuilder; import java.io.IOException; import java.io.InputStream; public class Util { private static final SqlSessionFactory sqlSessionFactory; static { SqlSessionFactory sqlSessionFactory1; try { // 1、读取Mybatis配置文件 InputStream input = Resources.getResourceAsStream("SqlMapConfig.xml"); // 2、通过配置文件信息,创建SqlSessionFactory sqlSessionFactory1 = new SqlSessionFactoryBuilder().build(input); } catch (IOException e) { sqlSessionFactory1 = null; System.out.println(e.getMessage()); } sqlSessionFactory = sqlSessionFactory1; } public static SqlSessionFactory getSqlSessionFactory() { return sqlSessionFactory; } // 获取系统日期 public static String getNewDate() { SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); return sdf.format(new Date()); } } ``` 在`com.域名.项目.po`包下创建`Emp.java`持久化对象类 ```java package com.doooog.mybatis.po; public class Emp { private Integer EMPno; private String ename; private String job; private Integer mgr; private String hiredate; private Double sal; private Double comm; private Integer DEPTno; public Emp() { } public Emp(Integer EMPno, String ename, String job, Integer mgr, String hiredate, Double sal, Double comm, Integer DEPTno) { this.EMPno = EMPno; this.ename = ename; this.job = job; this.mgr = mgr; this.hiredate = hiredate; this.sal = sal; this.comm = comm; this.DEPTno = DEPTno; } public Integer getDEPTno() { return DEPTno; } public void setDEPTno(Integer DEPTno) { this.DEPTno = DEPTno; } public Double getComm() { return comm; } public void setComm(Double comm) { this.comm = comm; } public Double getSal() { return sal; } public void setSal(Double sal) { this.sal = sal; } public String getHiredate() { return hiredate; } public void setHiredate(String hiredate) { this.hiredate = hiredate; } public Integer getMgr() { return mgr; } public void setMgr(Integer mgr) { this.mgr = mgr; } public String getJob() { return job; } public void setJob(String job) { this.job = job; } public String getEname() { return ename; } public void setEname(String ename) { this.ename = ename; } public Integer getEMPno() { return EMPno; } public void setEMPno(Integer EMPno) { this.EMPno = EMPno; } @Override public String toString() { return "Emp{" + "EMPno=" + EMPno + ", ename='" + ename + '\'' + ", job='" + job + '\'' + ", mgr='" + mgr + '\'' + ", hiredate='" + hiredate + '\'' + ", sal=" + sal + ", comm=" + comm + ", DEPTno=" + DEPTno + '}'; } } ``` #### 2、创建mapper包与文件 创建`com.doooog.mybatis.mapper`包,并在包内创建`EmpMapper.java`接口 ```java package com.doooog.mybatis.mapper; import com.doooog.mybatis.po.Emp; import java.util.List; public interface EmpMapper { Emp getEmpById(Integer EMPno); List<Emp> getEmpAll(); } ``` #### 3、创建映射文件 在`src/main/resources/com/doooog/mybatis/mapper`资源目录下内创建`EmpMapper.xml`映射文件 资源路径必须与`Mapper.java`接口包文件一致(从资源根`src/main/resources/`目录开始),映射文件名也必须与接口文件名一致。 (或 在`src/main/resources/com/doooog/mybatis/po`资源目录下创建`EmpMapper.xml`映射文件) ```xml <?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"> <mapper namespace="com.doooog.mybatis.mapper.EmpMapper"> <select id="getEmpById" parameterType="int" resultType="com.doooog.mybatis.po.Emp"> select * from emp where EMPno=#{EMPno} </select> <select id="getEmpAll" resultType="com.doooog.mybatis.po.Emp"> select * from emp order by EMPno </select> </mapper> ``` **注意**: ① namespace必须是`Mapper`接口包的全称; ② id必须与`Mapper`接口内对应的方法名一致; ③ parameterType必须与`Mapper`接口内对应的方法参数数据类型一致,一般参数数据类型为包装类; ④ resultType必须与`Mapper`接口内对应的方法返回值数据类型一致。 #### 4、导入映射文件 修改`resources`内的`SqlMapConfig.xml`文件 ① 直接导入`.xml`文件 ```xml <!-- 配置映射文件 --> <mappers> <mapper resource="com/doooog/mybatis/po/EmpMapper.xml"/> </mappers> ``` ② 导入整个包(推荐) 需要将`.java`接口文件放进`mapper`包下,`.xml`映射文件放入资源包的`mapper`目录下 ```xml <!-- 配置映射文件 --> <mappers> <package name="com.doooog.mybatis.mapper"/> </mappers> ``` #### 5、创建测试类 ```java package com.doooog.mybatis; import com.doooog.mybatis.mapper.EmpMapper; import com.doooog.mybatis.po.Emp; import com.doooog.mybatis.util.Util; import org.apache.ibatis.session.SqlSession; import java.util.List; public class TestMapper { public static void main(String[] args) { SqlSession sqlSession = Util.getSqlSessionFactory().openSession(); EmpMapper empMapper = sqlSession.getMapper(EmpMapper.class); System.out.println(empMapper.getEmpById(7788)); List<Emp> list = empMapper.getEmpAll(); for (Emp e:list){ System.out.println(e); } sqlSession.close(); } } ``` ## 二、配置优化 #### 1、批量配置类别名 在映射文件中返回值类型总是写持久化对象类的全名,导致内容过长可读性差,MyBatis可以自动给类取别名,别名默认为类的名称。 需要修改`rescources`目录下的`SqlMapConfig.xml`,在`<configuration>`下的**首行**添加以下标签 ```xml <typeAliases> <package name="com.doooog.mybatis.po"/> </typeAliases> ``` name属性必须是包的全称。 添加完后回到映射文件,修改所涉及到的Type属性,将上一步添加的全称删掉,只保留类名即可。 ```xml <?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"> <mapper namespace="com.doooog.mybatis.mapper.EmpMapper"> <select id="getEmpById" parameterType="int" resultType="Emp"> select * from emp where EMPno=#{EMPno} </select> <select id="getEmpAll" resultType="Emp"> select * from emp order by EMPno </select> </mapper> ``` #### 2、数据库单独配置文件 在`rescources`目录下创建`db.properties`配置文件 ```properties jdbc.mysql.driver=com.mysql.cj.jdbc.Driver jdbc.mysql.url=jdbc:mysql://localhost:3306/mySqlDbName?characterEncoding=utf-8 jdbc.mysql.username=username jdbc.mysql.password=password ``` 修改`SqlMapConfig.xml`配置文件,在`<configuration>`下的首行添加以下标签 ```xml <!-- 加载其他配置文件 --> <properties resource="db.properties"/> ``` 修改下面数据库硬编码部分,改为`${键名}` ```xml <!-- 配置JDBC数据库信息 --> <dataSource type="POOLED"> <property name="driver" value="${jdbc.mysql.driver}"/> <property name="url" value="${jdbc.mysql.url}"/> <property name="username" value="${jdbc.mysql.username}"/> <property name="password" value="${jdbc.mysql.password}"/> </dataSource> ``` ## 三、常用CRUD操作 #### 1、多条件查询 以查询某部门某职位(模糊)的所有记录为例 在`EmpMapper.java`接口中添加 ```java // 多条件查询 List<Emp> listEmpByCondition(Emp emp); ``` 在`EmpMapper.xml`映射文件中添加 ```xml <select id="listEmpByCondition" parameterType="Emp" resultType="Emp"> select * from emp where emp.DEPTno=#{DEPTno} and emp.job like concat('%',#{job},'%') order by emp.EMPno; </select> ``` **注意**:其中`#{参数名}`不能随便填写,需要填写`Emp`对象的属性名 在测试类中调用即可 ```java SqlSession sqlSession = Util.getSqlSessionFactory().openSession(); EmpMapper empMapper = sqlSession.getMapper(EmpMapper.class); Emp emp = new Emp(); emp.setDEPTno(20); emp.setJob("YST"); List<Emp> list = empMapper.listEmpByCondition(emp); for (Emp e:list){ System.out.println(e); } sqlSession.close(); ``` #### 2、转义字符查询 因为映射文件为`.xml`格式,不能直接使用`<`,`>`等字符,所以写SQL语句时需要用到转义 | 原字符 | 转义字符 | 说明 | 示例(原SQL -> MyBatis XML) | | :----- | :------- | :----- | :------------------------------------------ | | `<` | `<` | 小于号 | `column < 10` -> `column < 10` | | `>` | `>` | 大于号 | `column > 10` -> `column > 10` | | `&` | `&` | 和号 | `status = 'A&B'` -> `status = 'A&B'` | | `'` | `'` | 单引号 | `name = 'O'Neil'` -> `name = 'O'Neil'` | | `"` | `"` | 双引号 | 在XML属性中常用,如`"value"` | 以查询员工工资小于某数为例 在`EmpMapper.java`接口中添加 ```java // 转义字符查询 List<Emp> listEmpByEMPno(Double sal); ``` 在`EmpMapper.xml`映射文件中添加 ```xml <select id="listEmpByEMPno" parameterType="double" resultType="Emp"> select * from emp where emp.sal < #{sal} order by emp.sal; </select> ``` 在测试类中调用即可 ```java SqlSession sqlSession = Util.getSqlSessionFactory().openSession(); EmpMapper empMapper = sqlSession.getMapper(EmpMapper.class); List<Emp> list = empMapper.listEmpByEMPno(4000.0); for (Emp e : list) { System.out.println(e); } sqlSession.close(); ``` #### 3、返回单值查询 许多聚合函数都会返回单个数据值,因此有返回单值的查询 在`EmpMapper.java`接口中添加 ```java // 返回单值查询 int getEmpCount(); ``` 在`EmpMapper.xml`映射文件中添加 ```xml <select id="getEmpCount" resultType="int"> select count(*) from emp; </select> ``` 在测试类中调用即可 ```java SqlSession sqlSession = Util.getSqlSessionFactory().openSession(); EmpMapper empMapper = sqlSession.getMapper(EmpMapper.class); System.out.println(empMapper.getEmpCount()); sqlSession.close(); ``` #### 4、插入记录(程序提供主键,不获取主键) 增删改命令默认返回值为`int`,则在书写映射文件时不需要由返回值类型项 在`EmpMapper.java`接口中添加 ```java // 插入数据(由程序提供主键,不获取主键) int saveEmpWithMainKey(Emp emp); ``` 在`EmpMapper.xml`映射文件中添加 ```xml <insert id="saveEmpWithMainKey" parameterType="Emp"> insert into emp (EMPno, ename, job, mgr, hiredate, sal, comm, DEPTno) VALUES (#{EMPno}, #{ename}, #{job}, #{mgr}, #{hiredate}, #{sal}, #{comm}, #{DEPTno}) </insert> ``` 在测试类中调用即可 ```java SqlSession sqlSession = Util.getSqlSessionFactory().openSession(); EmpMapper empMapper = sqlSession.getMapper(EmpMapper.class); Emp emp = emp = new Emp(8000,"刘七","MANAGER",7788,Util.getNewDate(),2000.0,0.0,10); System.out.println(empMapper.saveEmpWithMainKey(emp)); // 增删改手动提交 sqlSession.commit(); sqlSession.close(); ``` #### 4、插入记录(获取数据库自增主键) 在`EmpMapper.java`接口中添加 ```java // 插入数据(由数据库自动生成主键,获取主键) int saveEmp(Emp emp); ``` 在`EmpMapper.xml`映射文件中添加 ```xml <insert id="saveEmp" parameterType="Emp"> <selectKey keyProperty="EMPno" resultType="int" order="AFTER"> select LAST_INSERT_ID() </selectKey> insert into emp (ename, job, mgr, hiredate, sal, comm, DEPTno) VALUES (#{ename}, #{job}, #{mgr}, #{hiredate}, #{sal}, #{comm}, #{DEPTno}) </insert> ``` 其中`<selectKey>`标签用于**在插入数据后获取数据库生成的关键值**(如自增主键、序列值等),`keyProperty`属性须填写存放主键值的对象属性名,`resultType`为返回主键值的类型,`order`是语句查询的执行顺序,值为`BEFORE`时会返回插入前的最新主键值,值为`AFTER`时会返回插入后的最新主键值。 或者添加下面的标签(适用范围小,只适用于MySQL,SQLServer等有自动增长列的数据库) ```xml <insert id="saveEmp" parameterType="Emp" useGeneratedKeys="true" keyProperty="EMPno"> insert into emp (ename, job, mgr, hiredate, sal, comm, DEPTno) VALUES (#{ename}, #{job}, #{mgr}, #{hiredate}, #{sal}, #{comm}, #{DEPTno}) </insert> ``` 在测试类中调用即可 ```java SqlSession sqlSession = Util.getSqlSessionFactory().openSession(); EmpMapper empMapper = sqlSession.getMapper(EmpMapper.class); emp = new Emp(null,"老八","MANAGER",null,Util.getNewDate(),1800.0,300.0,30); System.out.println(empMapper.saveEmp(emp)); System.out.println(emp.getEMPno()); // 增删改手动提交 sqlSession.commit(); sqlSession.close(); ``` #### 5、更新记录 在`EmpMapper.java`接口中添加 ```java // 更新 int updateEmpJobById(Emp emp); ``` 在`EmpMapper.xml`映射文件中添加 ```xml <update id="updateEmpJobById" parameterType="Emp"> update emp set emp.job=#{job} where emp.EMPno=#{EMPno} </update> ``` 在测试类中调用即可 ```java SqlSession sqlSession = Util.getSqlSessionFactory().openSession(); EmpMapper empMapper = sqlSession.getMapper(EmpMapper.class); emp = new Emp(); emp.setEMPno(8002); emp.setJob("ENGINEER"); System.out.println(empMapper.updateEmpJobById(emp)); // 增删改手动提交 sqlSession.commit(); System.out.println(empMapper.getEmpById(8002)); sqlSession.close(); ``` #### 6、删除记录 在`EmpMapper.java`接口中添加 ```java // 删除数据 int deleteEmpById(int EMPno); ``` 在`EmpMapper.xml`映射文件中添加 ```xml <delete id="deleteEmpById" parameterType="int"> delete from emp where emp.EMPno=#{EMPno}; </delete> ``` 在测试类中调用即可 ```java SqlSession sqlSession = Util.getSqlSessionFactory().openSession(); EmpMapper empMapper = sqlSession.getMapper(EmpMapper.class); System.out.println(empMapper.deleteEmpById(8001)); // 增删改手动提交 sqlSession.commit(); sqlSession.close(); ``` 最后修改:2025 年 10 月 22 日 © 允许规范转载 打赏 赞赏作者 支付宝微信 赞 👆请简单粗暴地爱我。