mybatis进阶总结

1. mybatis回顾

操作数据库的持久层的半ORM(object relation mapping对象关系映射)框架

mybatis通过字段名和数据库列名一致来帮我们自动封装实体类

  • mybatis环境搭建

    1. 创建一个maven的普通项目

    2. 导包:jdbc驱动包 mybatis包 日志包 测试包

    3. 配置文件:mybatis的核心配置文件mybatis-config.xml 连接数据库的信息 日志的配置信息

    4. 数据准备

    5. 写代码

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.结果映射

  1. 一对多的查询需求:

    查询出所有部门及其每个部门下面的所有员工

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>

  1. 多对一的查询需求:

    查询出所有员工及其所在的部门信息

    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工厂级别的缓存 需要配置

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值