java第三阶段第四天--CureGuy

本文详细介绍了MyBatis中如何配置别名,包括在mybatis-config.xml文件中配置和通过包路径设置。此外,还讲解了SQL配置的简化技巧,如使用sql标签和include标签,以及动态SQL的实现,包括if-where、set标签的用法。同时,提到了ResultMap在对象关系映射中的应用,以及一对一关联关系的处理。通过对这些知识点的掌握,可以提升MyBatis的使用效率和代码质量。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

1 、别名配置

1.1 、在mybatis-config.xml文件里配置别名

1.2 、使用包路径xml映射文件配置--别名标签只对某个类有效

2 、SQL配置

2.1 、简化SQL标签

2.2 、动态SQL

2.2.1 、if-where用法

2.2.2 、 set标签用法

2.2.3 、SQL --  choose  when  otherwise

3 、ResultMap用法

4  、关联关系


1 、别名配置

1.1 、在mybatis-config.xml文件里配置别名

xml映射文件 必须与接口一对一绑定

namespace:指定需要绑定的接口名称,不能重复。

  <!--配置别名-->
    <typeAliases>
        <typeAlias type="com.jt.pojo.DemoUser" alias="DemoUser"></typeAlias>
    </typeAliases>

1.2 、使用包路径xml映射文件配置--别名标签只对某个类有效

映射原理: 如果配置文件中定义了包路径,则映射对象时会自动的完成路径的拼接 resultType="com.jt.mapper.DemoUser"

需求: 如果项目中有多个POJO实体类,如果一个一个编辑别名标签,则更为繁琐. 所以Mybatis提供了别名包的功能.
例子:
com.jt.pojo.User,
com.jt.pojo.Dept,
com.jt.pojo.Order
原理说明: 可以设定公共的包路径 com.jt.pojo,如果设定了包路径.以后自动拼接类的全路径

    <!--配置别名-->
    <typeAliases>
<!--        <typeAlias type="com.jt.pojo.DemoUser" alias="DemoUser"></typeAlias>-->
<!--    package指定的是包路径的信息-->
   <package name="com.jt.pojo"/>
     </typeAliases>

2 、SQL配置

2.1 、简化SQL标签

<!--    简化sql标签-->
    <sql id="demo_user_sql">
        select id,name,age,sex from demo_user
    </sql>

<!--<select id="findAll" resultType="DemoUser">-->
<!--    select id,name,age,sex from demo_user-->
<!--</select>-->

<!--    include标签包含sql标签-->
    <select id="findAll" resultType="DemoUser">
--     <include refid="demo_user_sql" /> where xxx=xxx
</select>

优势:使用sql标签可以节省xml文件的大小;代码的结构相对简单;

弊端:SQL只能抽取公共的sql语句--局限性稍大;如果大量的使用SQL标签,则代码的可读性较差;

2.2 、动态SQL

2.2.1 、if-where用法

业务需求:根据user对象查询数据,根据对象中不为null的属性,充当where条件实现动态查询。

//封装demouser的对象根据对象中不为null的属性查询
    @Test
    public void testFindWhere(){
        SqlSession sqlSession = sqlSessionFactory.openSession();
        DemoUserMapper demoUserMapper = sqlSession.getMapper(DemoUserMapper.class);
        DemoUser demoUser=new DemoUser();
        demoUser.setName("白骨精")
                .setAge(5000)
                .setSex("女");
        List<DemoUser> list = demoUserMapper.findWhere(demoUser);
        System.out.println(list);
        sqlSession.close();
    }
<!--    动态的sql查询
        思路:如果你的数据不为null。mybatis才会当做条件
        if标签说明:
        test:判断的条件  可以直接写属性
        where标签:去除我们条件中多余的and或者是or的
        if和where 几乎一起出现
-->
    <select id="findWhere" resultType="DemoUser">
        <include refid="demo_user_sql" />
         <where>
         <if test="name != null">name  =#{name}</if>
         <if test="age != null">and age =#{age}</if>
         <if test="sex != null">and sex=#{sex} </if>
         </where>
    </select>

2.2.2 、 set标签用法

set标签说明: 去除set条件中多余的 ,号
 /**
     * 需求: 根据Id,动态的实现数据的更新.
     */
    @Test
    public void testUpdateSet(){
        SqlSession sqlSession = sqlSessionFactory.openSession(true);
        DemoUserMapper demoUserMapper = sqlSession.getMapper(DemoUserMapper.class);
        DemoUser user = new DemoUser();
        user.setId(1).setName("守山大使");
        demoUserMapper.updateUser(user);
        sqlSession.close();
    }
    <!--
        规则: 根据对象中不为null的属性当做set条件
        set标签说明: 去除set条件中多余的 ,号
    -->
    <update id="updateUser">
        update demo_user
        <set>
            <if test="name !=null">name = #{name},</if>
            <if test="age !=null">age = #{age},</if>
            <if test="sex !=null">sex = #{sex}</if>
        </set>
        where
        id = #{id}
    </update>

2.2.3 、SQL --  choose  when  otherwise

如果存在name则按照name查询,否则按照sex查询

//    如果存在name则按照name查询,否则按照sex查询
    @Test
    public void testSelectCWO(){
        SqlSession sqlSession = sqlSessionFactory.openSession(true);
        DemoUserMapper demoUserMapper = sqlSession.getMapper(DemoUserMapper.class);
        DemoUser demoUser = new DemoUser();
        //demoUser.setName("守山大使");//DemoUser(id=1, name=守山大使, age=4000, sex=男)
        demoUser.setSex("男");//26条数据
        List<DemoUser> list = demoUserMapper.selectCWO(demoUser);
        System.out.println(list);
        sqlSession.close();
    }
<!--    如果不想将全部的条件当做if的判断,则mybatis提供了分支结构Switch
        当我们有多个条件,但是只想选择其中的一个条件来查询时使用,类似于java中的switch语句
        choose代表分支结构 只有一个条件有效
        when 指定判断的条件 和if类似
        otherwise 如果上述的条件都不满足时该行代码有效
-->
    <select id="selectCWO" resultType="DemoUser">
        select * from demo_user
        <where>
        <choose>
        <when test="name!=null"> name =#{name} </when>
        <otherwise> sex=#{sex} </otherwise>
        </choose>
        </where>
    </select>

3 、ResultMap用法

ORM思想: 对象关系映射.
属性: deptId,deptName
字段: dept_id,dept_name 
resultType说明: 当结果集中的字段名称,如果与属性的名称一致时, 才会实现自动的数据封装. resultMap="" 自定义的封装数据的结构
    @Test
    public void testFindDept(){
        SqlSession sqlSession = sqlSessionFactory.openSession();
        DeptMapper deptMapper = sqlSession.getMapper(DeptMapper.class);
        List<Dept> list = deptMapper.findAll();
        System.out.println(list);
        sqlSession.close();
    }
    <!--自定义映射关系的
        语法:
            1.id标签代表主键 (每张表中都会有一个主键)
                1.1.column: 代表结果集中的字段.
                1.2.property: 对象中的属性
            2.result 除了主键之外的配置信息
    -->
    <resultMap id="deptRM" type="Dept">
        <id column="dept_id" property="deptId"/>
        <result column="dept_name" property="deptName"/>
    </resultMap>

4  、关联关系

一对一:例子:一个员工对应一个部门

一对多:例子:一个部门对应多个员工  

多对多:例子:老师对应学生(一个老师对应对个学生,一个学生对应多个老师)>>多个一对多

创建dept表:

创建emp表:

 一对一业务封装(一对一需要在代码层进行表示
如果对一使用对象封装,如果对多使用集合封装

//    一对一需要在代码层进行表示——对象封装
//    如果是对一则使用对象封装,如果是对多则使用集合封装
//    private Integer deptId;
    private Dept dept;  //一对一
//关联关系——一个部门对应多个员工
    private List<Emp> emps;
    /*
    一对一:
    规定:一个员工对应一个部门
    选取方向:员工方
    需求:需要在员工中完成部门对象封装
     */
@Test
    public void testOneToOne(){
        SqlSession sqlSession = sqlSessionFactory.openSession();
        EmpMapper empMapper = sqlSession.getMapper(EmpMapper.class);
        List<Emp> list=empMapper.findAll();
        System.out.println(list);
        sqlSession.close();
    }
    <select id="findAll" resultType="Emp">
        select * from emp
    </select>
员工与部门如何关联:

select * from emp ,dept where dept.dept_id =emp.dept_id

select * from emp left join dept on emp.dept_id=dept.dept_id

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值