Mybatis SQL映射文件详解
在映射文件中-可以编写以下的顶级元素标签:
``plain
cache – 该命名空间的缓存配置。cache-ref – 引用其它命名空间的缓存配置。resultMap – 描述如何从数据库结果集中加载对象-是最复杂也是最强大的元素。parameterMap – 老式风格的参数映射。此元素已被废弃-并可能在将来被移除!请使用行内参数映射。文档中不会介绍此元素。sql – 可被其它语句引用的可重用语句块。insert – 映射插入语句。update – 映射更新语句。delete – 映射删除语句。select – 映射查询语句。
`
在每个顶级元素标签中可以添加很多个属性-下面我们开始详细了解下具体的配置。
1、insert、update、delete元素
属性
描述
id
在命名空间中唯一的标识符-可以被用来引用这条语句。
parameterType
将会传入这条语句的参数的类全限定名或别名。这个属性是可选的-因为 MyBatis 可以通过类型处理器(TypeHandler)推断出具体传入语句的参数-默认值为未设置(unset)。
parameterMap
用于引用外部 parameterMap 的属性-目前已被废弃。请使用行内参数映射和 parameterType 属性。
flushCache
将其设置为 true 后-只要语句被调用-都会导致本地缓存和二级缓存被清空-默认值:(对 insert、update 和 delete 语句)true。
timeout
这个设置是在抛出异常之前-驱动程序等待数据库返回请求结果的秒数。默认值为未设置(unset)(依赖数据库驱动)。
statementType
可选 STATEMENT-PREPARED 或 CALLABLE。这会让 MyBatis 分别使用 Statement-PreparedStatement 或 CallableStatement-默认值:PREPARED。
useGeneratedKeys
(仅适用于 insert 和 update)这会令 MyBatis 使用 JDBC 的 getGeneratedKeys 方法来取出由数据库内部生成的主键(比如:像 MySQL 和 SQL Server 这样的关系型数据库管理系统的自动递增字段)-默认值:false。
keyProperty
(仅适用于 insert 和 update)指定能够唯一识别对象的属性-MyBatis 会使用 getGeneratedKeys 的返回值或 insert 语句的 selectKey 子元素设置它的值-默认值:未设置(unset)。如果生成列不止一个-可以用逗号分隔多个属性名称。
keyColumn
(仅适用于 insert 和 update)设置生成键值在表中的列名-在某些数据库(像 PostgreSQL)中-当主键列不是表中的第一列的时候-是必须设置的。如果生成列不止一个-可以用逗号分隔多个属性名称。
databaseId
如果配置了数据库厂商标识(databaseIdProvider)-MyBatis 会加载所有不带 databaseId 或匹配当前 databaseId 的语句;如果带和不带的语句都有-则不带的会被忽略。
`xml
insert into user(user_name) values(#{userName}) select max(id)+1 from user insert into user(id,user_name) values(#{id},#{userName})
`
2、select元素
##### 1、select的参数传递
`xml
select * from emp where empno=#{empno} and ename=#{ename} select * from emp where empno=#{empno} and ename=#{ename}
`
##### 2、参数的取值方式
在xml文件中编写sql语句的时候有两种取值的方式-分别是#{}和${}-下面来看一下他们之间的区别:
`xml
select * from #{t} where empno=${empno} and ename=${ename}
`
##### 3、处理集合返回结果
EmpDao.xml
`xml
select * from emp select * from emp where empno = #{empno} select * from emp
`
UserDao.java
`java
package com.mashibing.dao;import com.mashibing.bean.Emp;import org.apache.ibatis.annotations.MapKey;import org.apache.ibatis.annotations.Param;import java.util.List;import java.util.Map;public interface EmpDao { public Emp findEmpByEmpno(Integer empno); public int updateEmp(Emp emp); public int deleteEmp(Integer empno); public int insertEmp(Emp emp); Emp selectEmpByNoAndName(@Param("empno") Integer empno, @Param("ename") String ename,@Param("t") String tablename); Emp selectEmpByNoAndName2(Map map); List selectAllEmp(); Map selectEmpByEmpReturnMap(Integer empno); @MapKey("empno") Map getAllEmpReturnMap();}
`
##### 4、自定义结果集—resultMap
Dog.java
`java
package com.mashibing.bean;public class Dog { private Integer id; private String name; private Integer age; private String gender; public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Integer getAge() { return age; } public void setAge(Integer age) { this.age = age; } public String getGender() { return gender; } public void setGender(String gender) { this.gender = gender; } @Override public String toString() { return "Dog{" + "id=" + id + ", name='" + name + ''' + ", age=" + age + ", gender='" + gender + ''' + '}'; }}
`
dog.sql
`sql
/*Navicat MySQL Data TransferSource Server : node01Source Server Version : 50729Source Host : 192.168.85.111:3306Source Database : demoTarget Server Type : MYSQLTarget Server Version : 50729File Encoding : 65001Date: 2020-03-24 23:54:22*/SET FOREIGN_KEY_CHECKS=0;-- ------------------------------ Table structure for dog-- ----------------------------DROP TABLE IF EXISTS dog;CREATE TABLE dog ( id int(11) NOT NULL AUTO_INCREMENT, dname varchar(255) DEFAULT NULL, dage int(11) DEFAULT NULL, dgender varchar(255) DEFAULT NULL, PRIMARY KEY (id)) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=u