MyBatis特殊操作、优化配置、动态SQL、关联查询

x33g5p2x  于2021-09-26 转载在 其他  
字(5.6k)|赞(0)|评价(0)|浏览(337)

1.特殊操作

1.1模糊查询

需求:查询name中包含"精"的数据.并且按照年龄降序排列

@Test
    public void test9(){
        SqlSession sqlSession = sqlSessionFactory.openSession(true);
        DemoUserMapper mapper = sqlSession.getMapper(DemoUserMapper.class);
        Map<String,Object> map=new HashMap<>();
        map.put("name","精");
        map.put("column","age");
        List<DemoUser> demoUsers=mapper.like(map);
        System.out.println(demoUsers);
    }

①$方式

<select id="like" resultType="com.jt.pojo.DemoUser">
        select * from demo_user where name like '%${name}%' order by ${column} desc ;
    </select>

②%需要引号包裹

<select id="like" resultType="com.jt.pojo.DemoUser">
        select * from demo_user where name like "%"#{name}"%" order by ${column} desc ;
    </select>

*这里只展示两种,方式很多 *

注意事项:MyBatis中的sql最好小写,因为不同的系统对于大小写不敏感 

转大小写快捷键:ctrl+shift+u

1.2批量查询

需求:将name为小乔/大乔/王昭君的年龄改为25岁,性别男

代码实现

@Test/*11.将name为小乔/大乔/王昭君的年龄改为18岁,性别男*/
    public void test11(){
        SqlSession sqlSession = sqlSessionFactory.openSession(true);
        DemoUserMapper mapper = sqlSession.getMapper(DemoUserMapper.class);
        List list=new ArrayList();
        list.add("小乔");
        list.add("大乔");
        list.add("王昭君");
        Map<String,Object> map=new HashMap<>();
        map.put("names", list);
        map.put("age", 25);
        map.put("sex", "男");
        mapper.update2(map);

    }
<update id="update2">
        update demo_user set age=#{age} ,sex=#{sex} where name in(
            <foreach collection="names" item="name" separator=",">
                #{name}
            </foreach>
            )
    </update>
void update2(Map<String, Object> map);

2.优化配置

2.1别名

以上操作太麻烦,解决方案有三种

方式一:在核心配置文件mybatis-config.xml文件中配置别名标签

实现代码

mysql-config.xml文件配置内容

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

** mapper映射文件中sql语句内容**

<select id="find1" resultType="DemoUser">
        select * from demo_user where id=#{id}
    </select>

**注意:核心配置文件的顺序 **

The content of element type "configuration" must match "(properties?,settings?,typeAliases?,typeHandlers?,objectFactory?,objectWrapperFactory?,reflectorFactory?,plugins?,environments?,databaseIdProvider?,mappers?)".

方式二:使用别名包

一个个编辑别名标签也很麻烦,别名标签只对某个类有效,所以可以在配置文件中配置package标签,配置包路径

<typeAliases >
        <!--别名标签-->
<!--        <typeAlias type="com.jt.pojo.DemoUser" alias="DemoUser"></typeAlias>-->
        <!--配置包路径-->
        <package name="com.jt.pojo"/>

    </typeAliases>

原理是动态拼接:包路径+.类名

方式三:使用注解

@Alias("类的别名")  不常用

2.2简化sql标签

sql标签用法

<!--简化sql标签-->
    <sql id="demo_user_sql">
        select * from demo_user
    </sql>

    <select id="find1" resultType="DemoUser">
        <include refid="demo_user_sql"/>where id=#{id}
    </select>

sql标签的利弊

利: **                                         ** 弊:

1.节省xml文件的大小                 1.sql只能抽取公共的sql语句,局限性大

2.代码结构相对简单                   2.如果大量使用sql标签,可读性太差

3.MyBatis动态sql

3.1 IF-WHERE标签

规则:where与if标签通常一起使用,where标签可以去除多余的and和or,if的test属性为判断条件

         判断对象中不为空的属性当作where条件

情景:用户并不是上传所有字段属性值,可能只有name,只有age

<select id="find2" resultType="DemoUser">
        select * from demo_user
        <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>

3.2 SET标签

规则:判断对象中不为空的属性当作set条件,set标签可以把多余的逗号去除 

情景:用户并不是修改所有字段属性值,可能只有name,只有age

<update id="update">
        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>

3.3 Sql-choose when otherwise

需求:条件查询,如果有name那么按照name查询,如果没有,按照sex查询

**MyBatis的分支结构 **

<select id="find3" resultType="DemoUser">
        select * from demo_user
        where
        <choose>
            <when test="name!=null">name=#{name}</when>
            <otherwise>sex=#{sex}</otherwise>
        </choose>
    </select>

解释:

choose代表分支结构,只有一个条件有效

when:和if类似

otherwise:上述的条件无效时,此处条件生效

3.4 ResuletType与ResultMap

建表→编辑Dept pojo类→mapper接口→映射文件→配置核心配置文件中的mapper
注意pojo类要实现序列化接口

resultType注意,结果集中的字段名称与属性名称一致时,才会实现自动的数据封装

resultMap,结果集中的字段名称与属性名称不一致时,也可以实现自定义的数据封装

resultMap标签用来自定义映射关系

** 建表(dept)**

pojo类

package com.jt.pojo;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.Accessors;

import java.io.Serializable;

@Data
@Accessors(chain = true)
@NoArgsConstructor
@AllArgsConstructor
public class Dept implements Serializable {
    private Integer deptId;
    private String deptName;
}

mapper接口

public interface DeptMapper {

    List<Dept> findAll(Dept dept);
}

** 映射文件**

<select id="findAll" resultMap="deptDp">
        select * from dept

    </select>

    <resultMap id="deptDp" type="Dept">
        <id column="dept_id" property="deptId"/>
        <result column="dept_name" property="deptName"/>
    </resultMap>

test类

public class TestMybatis {
    SqlSessionFactory sqlSessionFactory;

    @Test
    @BeforeEach
    public void init() throws IOException {
    //1.指定资源文件
    String resource="mybatis/mybatis-config.xml";
        InputStream inputstream = Resources.getResourceAsStream(resource);
        sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputstream);
    }
    @Test
    public void test1(){
        SqlSession sqlSession = sqlSessionFactory.openSession(true);
        DeptMapper mapper = sqlSession.getMapper(DeptMapper.class);
        Dept dept= new Dept();
        List<Dept> list=mapper.findAll(dept);
        System.out.println(list);
        sqlSession.close();
    }

4.关联关系

4.1常见关联关系

1.一对一 

2.一对多

3.多对一

4.多对多

4.2 一对一

规则:一对一封装为对象,一对多封装成List

建表→编辑Emp pojo类→mapper接口→映射文件→配置核心配置文件中的mapper
注意pojo类要实现序列化接口

相关文章