MyBatis 映射文件
select
1)Mapper接口方法
public Employee getEmployeeById(Integer id );
2)Mapper映射文件
<select id="getEmployeeById"
resultType="com.atguigu.mybatis.beans.Employee"
databaseId="mysql">
select * from tbl_employee where id = ${_parameter}
</select>
insert
1)Mapper接口方法
public Integer insertEmployee(Employee employee);
2)Mapper映射文件
<insert id="insertEmployee"
parameterType="com.atguigu.mybatis.beans.Employee"
databaseId="mysql">
insert into tbl_employee(last_name,email,gender) values(#{lastName},#{email},#{gender})
</insert>
update
1)Mapper接口方法
public Boolean updateEmployee(Employee employee);
Mapper映射文件
<update id="updateEmployee" >
update tbl_employee set last_name = #{lastName},
email = #{email},
gender = #{gender}
where id = #{id}
</update>
delete
1)Mapper接口方法
public void deleteEmployeeById(Integer id );
2)Mapper映射文件
<delete id="deleteEmployeeById" >
delete from tbl_employee where id = #{id}
</delete>
参数传递的方式
1)单个参数
可以接受基本类型,对象类型。这种情况MyBatis可直接使用这个参数,不需要经过任 何处理。
2)多个参数
任意多个参数,都会被MyBatis重新包装成一个Map传入。Map的key是param1,param2,或者0,1…,值就是参数的值
3)命名参数
为参数使用@Param起一个名字,MyBatis就会将这些参数封装进map中,key就是我们自己指定的名字
4)POJO
当这些参数属于我们业务POJO时,我们直接传递POJO
5)Map
我们也可以封装多个参数为map,直接传递
6)Collection/Array
会被MyBatis封装成一个map传入, Collection对应的key是collection,Array对应的key是array. 如果确定是List集合,key还可以是list.
参数传递源码分析
1,以命名参数为例:
public Employee getEmployeeByIdAndLastName
(@Param("id")Integer id, @Param("lastName")String lastName);
public Object getNamedParams(Object[] args) {
final int paramCount = names.size();
if (args == null || paramCount == 0) {
return null;
} else if (!hasParamAnnotation && paramCount == 1) {
return args[names.firstKey()];
} else {
final Map<String, Object> param = new ParamMap<Object>();
int i = 0;
for (Map.Entry<Integer, String> entry : names.entrySet()) {
param.put(entry.getValue(), args[entry.getKey()]);
// add generic param names (param1, param2, ...)
final String genericParamName = GENERIC_NAME_PREFIX + String.valueOf(i + 1);
// ensure not to overwrite parameter named with @Param
if (!names.containsValue(genericParamName)) {
param.put(genericParamName, args[entry.getKey()]);
}
i++;
}
return param;
}
}
参数处理
1)参数位置支持的属性:
javaType、jdbcType、mode、numericScale、resultMap、typeHandler、jdbcTypeName、expression
2)实际上通常被设置的是:可能为空的列名指定 jdbcType ,例如:
insert into orcl_employee(id,last_name,email,gender) values(employee_seq.nextval,#{lastName, ,jdbcType=NULL },#{email},#{gender})可以在全局配置文件指定为null 也可以像上面这面这样单独配置
参数的获取方式
1)#{key}:可取普通类型、POJO类型、多个参数、集合类型
获取参数的值,预编译到SQL中。安全。Preparedstatement
2)
k
e
y
:
可
取
单
个
普
通
类
型
、
P
O
J
O
类
型
、
多
个
参
数
、
集
合
类
型
注
意
:
取
单
个
普
通
类
型
的
参
数
,
{key}:可取单个普通类型、POJO类型、多个参数、集合类型 注意:取单个普通类型的参数,
key:可取单个普通类型、POJO类型、多个参数、集合类型注意:取单个普通类型的参数,{}中不能随便写 必须用_parameter
_parameter是Mybatis的内置参数
获取参数的值,拼接到SQL中。有SQL注入问题。Statement ORDER BY ${name}
原则:能用#{}取值就优先使用#{} 解决不了的使用
e
.
g
.
原
生
的
J
D
B
C
不
支
持
占
位
符
的
地
方
就
可
以
使
用
{} e.g.原生的JDBC不支持占位符的地方 就可以使用
e.g.原生的JDBC不支持占位符的地方就可以使用{}
e.g.Select column1,column2…from 表 where 条件 group by 组表示 having 条件
order by 排序字段 desc/asc limit X,X;