向SQL传参
日志输出设置
#{} ${} 的区别
Mybatis会将SQL语句中的#{}转换为问号占位符。${}形式传参,底层Mybatis做的是字符串拼接操作。
#{} 只能替代值的位置,不饿能替代 容器名 列名 sql关键字
eg : name = #{nameValue} 静态的列名,动态的值
${nameColumn} = #{nameValue} 动态的列名,动态的值
结论:实际开发中,能用#{}实现的,肯定不用${}。
特殊情况: 动态的不是值,是列名或者关键字,需要使用${}拼接
数据输入
指上层方法(例如Service方法)调用Mapper接口时,数据传入的形式。
- 简单类型:只包含一个值的数据类型
- 基本数据类型:int、byte、short、double、……
- 基本数据类型的包装类型:Integer、Character、Double、……
- 字符串类型:String
- 复杂类型:包含多个值的数据类型
- 实体类类型:Employee、Department、……
- 集合类型:List、Set、Map、……
- 数组类型:int[]、String[]、……
- 复合类型:List<Employee>、实体类中包含集合……
单个简单类型
传入的是一个实体对象
多个简单类型
方式1:mybatis默认对应方式:按顺序一一对应入参
方式2:通过@Param注解指定
map类型输入????不循环?
数据输出
resultType 返回值类型
resultType = 返回值类型
返回值类型可以写类的全限定符号; eg: java.lang.String
也可以写别名简称; eg: string
mybatis内部已经定义了部分别名,如下:
总结:基本数据类型:类型 int 别名 _int
包装数据类型 _integer 别名 int _Double 别名 double
如果没有默认的别名,也可以配置文件中自定义
<!--给某个类起别名-->
<typeAliases>
<typeAlias type="com.xin.pojo.Employee" alias="employee"/>
</typeAliases>
<!--批量定义,批量将包下的类基于别名,别名就是类的首字母小写-->
<typeAliases>
<package name="com.xin.pojo"/>
</typeAliases>
数据库列名和实体类属性名的自动映射
开启驼峰式映射
各个输出类型
返回值是集合,resultType 不需要指定集合类型,只需要指定泛型即可
原因:mybatis底层是ibatis,ibatis 中只有两种查询方法,selectOne selectList, selectOne 底层调用了 selectList,所以本身就是以LIst结果类型去查的,所以只需要指定泛型即可
插入后返回主键值的实现
自增长主键
<!--传入的数据是实体对象时,直接 key = #{属性名即可}-->
<!--useGeneratedKeys="true" 表示我们想要数据库自动增强的主键值-->
<!--keyColumn="emp_id" 表示主键列-->
<!--keyProperty="empId" 接收主键值的属性-->
<insert id="insertEmployee" useGeneratedKeys="true" keyColumn="emp_id" keyProperty="empId">
insert into t_emp(emp_name,emp_salary) values(#{empName},#{empSalary})
</insert>
验证
非自增长主键
<!--order="BEFORE" 指在insert操作之前执行还是之后执行-->
<!--select UUID() 是随机生成UUID 字符串-->
<insert id="insert">
<selectKey order="BEFORE" resultType="string" keyProperty="empId">
select replace(UUID(),"-","")
</selectKey>
insert into t_emp(emp_id, emp_name,emp_salary) values(#{empId},#{empName},#{empSalary})
</insert>
实体类属性和数据库字段对应关系
package com.xin.pojo;
import org.apache.ibatis.type.Alias;
// 如果设置批量别名后,不想用类名首字母小写作为别名,可以通过alias注解覆盖别名
// 但是@Alias注解只有再批量起别名的情况下才生效
@Alias("ergouzi")
public class Employee {
private Integer empId;
private String empName;
private Double empSalary;
//getter | setter
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 Double getEmpSalary() {
return empSalary;
}
public void setEmpSalary(Double empSalary) {
this.empSalary = empSalary;
}
}
方式一:别名方式
<!-- 方式一:别名方式-->
<select id="selectOne" resultType="com.xin.pojo.Employee">
select emp_id empId,emp_name empName, emp_salary empSalary from
t_emp where emp_id = ${empId}
</select>
方式二:开启驼峰映射
<!-- 方式二:开启驼峰映射-->
<select id="selectTwo" resultType="com.xin.pojo.Employee">
select emp_id ,emp_name , emp_salary from
t_emp where emp_id = ${empId}
</select>
方式三:resultMap
注意:resultType 和 resultMap 之间只能同时使用一个。
<!-- 方式三: resultMap,可以针对深层次对象(即对象有嵌套关系)也可以针对单层次对象-->
<!-- 专门声明一个resultMap设定column到property之间的对应关系 -->
<resultMap id="employeeMap" type="employee">
<!-- 使用id标签设置主键列和主键属性之间的对应关系 -->
<!-- column属性用于指定字段名;property属性用于指定Java实体类属性名 -->
<id column="emp_id" property="empId"/>
<!-- 使用result标签设置普通字段和Java实体类属性之间的关系 -->
<result column="emp_name" property="empName"/>
<result column="emp_salary" property="empSalary"/>
</resultMap>
<select id="selectThree" resultType="com.xin.pojo.Employee">
select emp_id,emp_name,emp_salary from
t_emp where emp_id = ${empId}
</select>