Mybatis入门学习
#{ } 和 ${ } 取值的区别
#{} : 是以预编译的形式,将参数设置到sql语句中,防止sql注入;
${} : 取出的值会直接拼接在sql语句中,会有安全问题;
resultMap自定义结果
resultType
和 resultMap
只能同时用一个
关联查询
查询 学生信息
的时候把对应的 班级信息
也查询出来
学生信息
package com.garcon.bean;
public class Student {
private Integer sid;
private String lastName;
private String gender;
private String hobby;
private Sclass sclass;//班级信息
...
}
班级信息
package com.garcon.bean;
public class Sclass {
private Integer cid;//班级id
private String cName;//班级名称
...
}
Mapper接口
package com.garcon.dao;
public interface StudentMapper {
//以sid查询学生信息
public Student getStudentById(Integer sid);
}
resultMap
级联属性
或 以下
resultMap
的 association
属性
关联查询 collection
查询班级信息的同时查出班级所对应的学生信息
学生类
package com.garcon.bean;
public class Student {
private Integer sid;
private String lastName;
private String gender;
private String hobby;
private Sclass sclass;//班级信息
...
}
班级类
package com.garcon.bean;
public class Sclass {
private Integer cid;//班级id
private String cName;//班级名称
private List students;
...
}
Mapper班级接口
package com.garcon.dao;
public interface SclassMapper {
//以班级id查询班级
public Sclass getSclassById(Integer cid);
}
sclassMapper.xml
分步查询 association
先以学生的 学号
查询学生信息,再以 学生信息中的班级编号
查询班级信息
班级接口
package com.garcon.dao;
public interface Sclass {
//以班级id查询班级信息
public Sclass getSclasstById(Integer cid);
}
StudentMapper.java
学生接口
package com.garcon.dao;
public interface StudentMapper {
//以sid查询学生信息
public Student getStudentById(Integer sid);
}
sclassMapper.xml
studentMapper.xml
分步查询 collection
先以 班级编号
查询班级信息,再以 班级编号
查询班级的所有学生信息
SclassMapper班级接口
package com.garcon.dao;
public interface Sclass {
//以班级id查询班级信息
public Sclass getSclasstById(Integer cid);
}
StudentMapper学生接口
package com.garcon.dao;
public interface StudentMapper {
//以班级编号查询学生信息
public List getStudentByClassId(Integer sid);
}
sclassMapper.xml
studentMapper.xml
分步查询 延迟加载
适用情况:假如查看学生信息的时候不加载班级信息,当需要查看学生的班级信息的时候再加载班级信息
- 在分步查询的基础上,在mybatis的全局配置文件的settings设置项中添加如下设置即可
鉴别器 discriminator
鉴别器:mybatis可以使用discriminator判断某列的值,然后根据某列的值改变封装行为
- 如果查出的是女生:就把班级信息查询出来,否则不查询;如果是男生,把last_name这一列的值赋值给 hobby;
studentMapper.xml
sclassMapper.xml
动态SQL
if
where
- 去除查询条件中多余的第一个
and
或or
trim
choose
update-set
如果javaBean中哪个属性带了值就更新那个字段
update student
last_name=#{lastName},
hobby=#{hobby},
gender=#{gender}
where id=#{id}
update-trim
update student
last_name=#{lastName},
email=#{email},
gender=#{gender}
where id=#{id}
select-foreach
insert-foreach
批量插入
insert into student(last_name,gender,hobby,class_id)
values
(#{student.lastName},#{student.gender},#{student.hobby},#{student.sclass.cid})
insert into student(last_name,gender,hobby,class_id)
values((#{student.lastName},#{student.gender},#{student.hobby},#{student.sclass.cid})
insert into employees(employee_id,last_name,email)
values(employees_seq.nextval,#{emp.lastName},#{emp.email});
insert into employees(employee_id,last_name,email)
select #{emp.lastName} lastName,#{emp.email} email from dual
获取自增主键的值
方式一 :
使用insert标签的属性useGeneratedKeys="true" keyProperty="id"
insert into user(username,password,email) values(#{username},#{password},#{email})
方式二 : 插入时先查询将要插入数据的自增id值
select last_insert_id()
insert into user(username,password,email) values(#{username},#{password},#{email})
参数处理
单个参数
可以接受基本类型,对象类型,集合类型的值。这种情况 MyBatis可直接使用这个参数,不需要经过任何处理。
多个参数
任意多个参数,都会被MyBatis重新包装成一个Map传入。Map的key是param1,param2,0,1…,值就是参数的值。
命名参数
为参数使用@Param起一个名字,MyBatis就会将这些参数封装进map中,key就是我们自己指定的名字
POJO
当这些参数属于我们业务POJO时,我们直接传递POJO
Map
我们也可以封装多个参数为map,直接传递
注意 : 当参数是一个Connection , List , Array数组时, 参数会封装成一个Map , key值为 : connection , list , array .
原文:https://www.cnblogs.com/cyan-orange/p/15335219.html