1. mybatis回顾
操作数据库的持久层的半ORM(object relation mapping对象关系映射)框架
mybatis通过字段名和数据库列名一致来帮我们自动封装实体类
-
mybatis环境搭建
-
创建一个maven的普通项目
-
导包:jdbc驱动包 mybatis包 日志包 测试包
-
配置文件:mybatis的核心配置文件mybatis-config.xml 连接数据库的信息 日志的配置信息
-
数据准备
-
写代码
-
2.批量新增和批量删除
<!-- void batchAdd(List<Dept> depts);--> <!-- insert into dept(name) values ("技师部"),("后勤部")--> <!-- insert into dept(name) values ("技师部"),("后勤部")--> <!-- foreach-遍历数组或者集合--> <!-- collection-集合list -数组array -如果方法参数取了别名 直接写别名--> <!-- item -把集合里面的元素依次赋给它--> <!-- separator -循环之间用什么分割--> <insert id="batchAdd"> insert into dept(name) values <foreach collection="list" item="d" separator=","> (#{d.name}) </foreach> </insert> <!-- void batchDelete(Integer[] ids);--> <!-- delete from dept where id in(12,13)--> <!--open :循环以什么开始 ( close:循环以什么结束 ) --> <delete id="batchDelete"> delete from dept where id in <foreach collection="array" item="id" separator="," open="(" close=")"> #{id} </foreach> </delete>
3.关联关系
-
关联关系有哪些
一对一:人和身份证 一夫一妻制
一对多:一个部门有多个员工
多对一:多个员工属于一个部门
多对多:一员工有多个角色 一个角色也可以属于多员工
4. 表的设计 类的设计
5.结果映射
-
一对多的查询需求:
查询出所有部门及其每个部门下面的所有员工
public class Dept { //alt+insert:生成toString gettersetter等 private Integer id; private String name; private List<Emp> emps; .....
方式一:结果集映射
<select id="loadAllCom" resultMap="deptMap"> SELECT d.*,e.id eid,e.name ename,e.dept_id edeptid FROM dept d LEFT JOIN emp e ON d.id=e.dept_id </select> <resultMap id="deptMap" type="Dept"> <id column="id" property="id"></id> <result column="name" property="name"></result> <collection property="emps" ofType="Emp"> <id column="eid" property="id"></id> <result column="ename" property="name"></result> <result column="edeptid" property="dept_id"></result> </collection> </resultMap>
方式二:嵌套查询
<select id="loadAllCom" resultMap="deptMap"> select * from dept </select> <resultMap id="deptMap" type="Dept"> <id column="id" property="id"></id> <result column="name" property="name"></result> <collection property="emps" ofType="Emp" select="loadEmpByDeptId" column="id"> </collection> </resultMap> <select id="loadEmpByDeptId" resultType="Emp"> select * from emp where dept_id = #{deptid} </select>
-
多对一的查询需求:
查询出所有员工及其所在的部门信息
public class Emp { private Integer id; private String name; private Integer dept_id; private Dept dept;
方式一:结果集映射
<select id="loadAllCom" resultMap="empMap"> SELECT e.*, d.id did, d.name dname FROM emp e LEFT JOIN dept d on e.dept_id = d.id </select> <resultMap id="empMap" type="Emp"> <id column="id" property="id"></id> <result column="name" property="name"></result> <result column="dept_id" property="dept_id"></result> <association property="dept" javaType="Dept"> <id column="did" property="id"></id> <result column="dname" property="name"></result> </association> </resultMap>
方式二:嵌套查询
<select id="loadAllCom" resultMap="empMap"> select * from emp </select> <resultMap id="empMap" type="Emp"> <id property="id" column="id"></id> <result property="name" column="name"></result> <result property="dept_id" column="dept_id"></result> <!--如果是一个对象 就用association javaType 如果是集合collection ofType--> <association property="dept" javaType="Dept" select="loadDeptById" column="dept_id"></association> </resultMap> <select id="loadDeptById" resultType="Dept"> select * from dept where id = #{id} </select>
6.MyBatis缓存(面试题)
mybatis有两级缓存
一级缓存是会话级别的缓存 默认开启
二级缓存是sqlSessionFactory工厂级别的缓存 需要配置