举例:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"https://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.atguigu.mapper.EmployeeMapper">
<!--
#{ key } : 占位符 + 赋值 emp_id = ? ?=赋值
${ key } : 字符串拼接 " emp_id = " + id
推荐使用#{} 防止sql注入
总结: 动态值 使用 #{} , 列名,表名,写成${ }
? 只能替代值的位置,不能代替容器名(列名、表名、sql关键字) emp_id = ? 不能写 ? = ?
sql select * from 表 where 列名动态 ${ColumName} = 值动态 #{ColumValue}
-->
<select id="queryById" resultType="com.atguigu.pojo.Employee">
select emp_id empId,emp_name empName,emp_salary empSalary
from t_emp where emp_id = #{empId}
</select>
<!--
场景一:传入的是单个简单类型 key 随便写
-->
<delete id="deleteById">
delete from t_emp where emp_id = #{empId}
</delete>
<select id="queryBySalary" resultType="com.atguigu.pojo.Employee">
select emp_id empId,emp_name empName,emp_salary empSalary
from t_emp where emp_salary = #{empSalary}
</select>
<!--
场景二:传入的是实体对象 key如何写?
key=属性名即可
-->
<insert id="insert">
insert into t_emp (emp_name , emp_salary) values (#{empName},#{empSalary});
</insert>
<!--
场景三:传入的是多个零散简单类型 key如何写?
可不可以随便写? 不可以
按照形参name获取? 也不可以
方案一:注解指定 @Param注解 指定多个简单参数的key,key = @Param("指定的key")
方案二:mybatis默认机制
arg0 arg1 ...... 从左到右
(name,salary) name -> key =arg0 salary -> key =arg1
param1 param2 ......
(name,salary) name -> key =param1 salary -> key =param2
-->
<select id="queryByNameAndSalary" resultType="com.atguigu.pojo.Employee">
select emp_id empId,emp_name empName,emp_salary empSalary
from t_emp where emp_name = #{name} and emp_salary = #{salary}
</select>
<!--
场景四:传入Map key如何写?
key=Map的key即可
-->
<insert id="insertEmpMapper" >
insert into t_emp (emp_name , emp_salary) values (#{name},#{salary});
</insert>
</mapper>
场景二:返回单个指定简单类型 指定ResultType的写法 返回的数据类型
resultType就两种
第一种是类的全限定符号,自己引用的类
第二种是别名简称 string double .....
扩展:给自己的类定义别名
第一种:在mybatis-config.xml中定义别名使用标签<typeAliases>
第二种:批量定义 <package name="com.atguigu.Employee"/>
并且可以在类上使用注解@Aliase 再重新自定义别名
举例说明:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"https://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.atguigu.mapper.EmployeeMapper">
<!--
DML
-->
<delete id="deleteById">
delete from t_emp where emp_id = #{empId}
</delete>
<!--
场景一:返回单个指定简单类型 指定ResultType的写法 返回的数据类型
resultType就两种
第一种是类的全限定符号
第二种是别名简称 string double .....
扩展:给自己的类定义别名
第一种:在mybatis-config.xml中定义别名使用标签<typeAliases>
第二种:批量定义 <package name="com.atguigu.Employee"/>
并且可以在类上使用注解@Aliase 再重新自定义注解
场景二: 返回单个自定义类型
resultType指定返回值类型
第一种,全限定类名
第二种,别名
查询,返回单个实体类型,要求列名和属性名一致!
这样才可以进行实体类的映射
但是可以进行映射,设置支持驼峰式自动映射!
emp_id ==> empId
开启驼峰式映射
<setting name="mapUnderscoreToCamelCase" value="true"/>
场景三: 返回值是map类型
resultType就设置map,列名为key,返回值为值
当没有实体类来接收值的时候我们可以使用map来接收值
key->查询的列 value->查询的值
场景四: 返回集合List类型
返回时是集合:resulType要指定的是泛型 不是list
为什么?
因为mybatis查询时是调用ibatis,而ibatis查询就两种方法
一是 selectOne 本质也是selectList
二是 selectList 本身就是按照List类型去查询的
场景五: 返回主键值:获取插入的主键
1.自增长主键回显 mysql auto_increment
useGeneratedKeys="true" 标识想要数据库自动增长的主键值
keyColumn="emp_id" 是主键的列值
keyProperty="empId" 接收主键列值的属性
2.非自增长主键回显
在sql语句前加上
插入之前先执行一段sql语句,生成一个主键值
order="BEFORE|AFTER" 在语句前还是后执行
resultType="string" 返回值类型
keyProperty="tId" 主键的值返回给谁
<selectKey order="BEFORE" resultType="string" keyProperty="tId">
select REPLACE(UUID(),'-','');
</selectKey>
自定义映射:ResultMap
当列名和属性名不一致时如何解决
方案一:起别名
方案二:开启驼峰式映射
方案三:ResultMap自定义映射 resultType和ResultMap只能二选一
ResultType按照规则自动映射,按照是否开启驼峰式映射,自己映射属性和列名!只能映射一层结构!
深层次的对象无法映射,也就是无法进行多表查询
Order 数据库
orderId order_id
orderName order_name
orderItem orderItem
itemId item_id
声明ResultMap就是自定义映射规则,
id标识 ->select resultMap=“标识”
type ->具体返回值类型 全限定符或者别名 集合只写泛型
id 是主键的映射关系
result 是普通列的映射关系
<resultMap id="tMap" type="com.atguigu.pojo.Teacher">
<id column="t_id" property="tId"></id>
<result column="t_name" property="tName"></result>
</resultMap>
<select id="queryById" resultMap="tMap">
select * from teacher where t_id = #{tId}
select t_id tId,t_name tName from teacher where t_id = #{tId}
</select>
-->
<select id="queryNameById" resultType="java.lang.String">
select emp_name from t_emp where emp_id = #{empId}
</select>
<select id="querySalaryById" resultType="java.lang.Double">
select emp_salary from t_emp where emp_id = #{empId}
</select>
<select id="queryById" resultType="com.atguigu.pojo.Employee">
select emp_id empId,emp_name empName,emp_salary empSalary
from t_emp where emp_id = #{empId}
</select>
<!-- 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>
<select id="queryNamesBySalry" resultType="string">
select emp_name from t_emp where emp_salary > #{salary}
</select>
<select id="queryAll" resultType="com.atguigu.pojo.Employee">
select * from t_emp
</select>
<!-- 场景五 -->
<insert id="insertEmp" useGeneratedKeys="true" keyColumn="emp_id" keyProperty="empId">
insert into t_emp (emp_name,emp_salary)
value(#{empName},#{empSalary})
</insert>
</mapper>
推荐阅读: