Mybatis知识点

什么是Mybatis?

 

        Mybatis是一款优秀的持久层框架,用于简化JDBC开发

        Mybatis本是Apache的一个开源项目iBatis,2010年这个项目由apache software foundation迁移到了google code,并且改名为Mybatis。2013年11也迁移到Github

        官网:https://mybatis.org/mybatis-3/zh/index.html

持久层:

        负责将数据保存到数据库的那一层代码

        JavaEE三层架构:表现层、业务层、持久层。

框架:

        框架就是一个半成品软件,是一套可重用的、通用的、软件基础代码模型。

        在框架的基础之上构建软件编写更加高效、规范、通用、可扩展。

JDBC缺点:

        1、硬编码                解决方法:配置文件

                注册驱动

                SQL语句

        2、操作繁琐                解决方法:自动完成

                手动设置参数

                手动封装结果集

        Mybatis免除了几乎所有JDBC代码以及设置参数和获取结果集的工作

解决SQL映射文件的警告提示:

        产生原因:Idea和数据库没有建立连接,不识别表信息。

        解决方式:在Idea中配置MySQL数据库连接。

使用Mapper代理方式完成入门案例

        1、定义与SQL映射文件同名的Mapper接口,并且将Mapper接口和SQL映射文件放置在同一目录下        (在resources文件夹下创建文件目录使用'/'作为分隔符

        2、设置SQL映射文件的namespace属性为Mapper接口全限定名

        3、在Mapper接口中定义方法,方法名就是SQL映射文件中sql语句的id,并保持参数类型和返回值类型一致

        4、编码

                1、通过sqlSession的getMapper方法获取Mapper接口的代理对象

                2、调用对应方法完成sql的执行

        细节:如果Mapper接口名称和SQL映射文件名称相同,并在同一目录下,则可以使用包扫描的方式简化SQL映射文件的加载

MybatisX插件:

        MybatisX是一款基于IDEA的快速开发插件,为效率而生。

        主要功能:

                XML和接口方法相互跳转

                根据接口方法生成statement

        安装:

        

1、数据库字段名和实体类属性名不一致问题:

数据库的字段名称 和 实体类的属性名称不一样,则不能自动封装数据
    *起别名: 对不一样的列名起别名,让别名和实体类的属性名一样
        *缺点:每次查询都要定义一次别名
            *sql片段
                *不灵活
            *resultMap
                1、定义<resultMap>标签
                2、在<select>标签中使用resultMap属性替换 resultType属性
    
sql片段
    <sql id="brand_column">-->
        id, brand_name as brandName, company_name as companyName, ordered, description, status
    </sql>

    <select id="selectAll" resultType="Brand">
        select
            <include refid="brand_column"/>
        from tb_brand;
    </select>

id:唯一标识
        type:映射的类型,支持别名-->
    <resultMap id="brandResultMap" type="brand">
<!--        id:完成主键字段的映射
                column:表的列名
                property:实体类的属性名
            result:完成一般字段的映射
            -->
        <result column="brand_name" property="brandName"/>
        <result column="company_name" property="companyName"/>

    </resultMap>

    <select id="selectAll" resultMap="brandResultMap">
        select *
        from tb_brand;
    </select>

2、参数问题:

<!--
    *参数占位符
        1、#{}:会将其替换为?,为了防止SQL注入
        2、${}:拼sql,会存在SQL注入问题
        3、使用时机:
            *参数传递的时候:#{}
            *表名或者列名不固定可以使用${},会存在SQL注入问题


    *参数类型:parameterType:    可以省略
    *特殊字符的处理方法:
        1、转义字符
        2、CDATA区:CD提示
    -->

多个参数:

/**
 *  条件查询
 *      *参数接收
 *          1、散装参数  如果方法中有多个参数,需要使用@Param(“SQL参数占位符名称”)
 *          2、对象参数  对象的属性名称需要和参数占位符名称一致
 *          3、map集合参数
 */

动态条件查询和动态单条件查询

<!--    动态条件查询
            * if:条件判断
                * test: 逻辑表达式
            * 问题: 当status没有输入值时,便会出错,sql语句where部分变成  where and xxx
                * 恒等式
                * <where> 替换 where 关键字
            -->
<select id="selectByConditionSingle" resultMap="brandResultMap">
    select *
    from tb_brand
    where
        <choose>    <!--相当于switch-->
            <when test="status != null">    <!--相当于case-->
                status = #{status}
            </when>
            <when test="companyName != null and companyName != ''">    <!--相当于case-->
                companyName like #{companyName}
            </when>
            <when test="brandName != null and brandName != ''">    <!--相当于case-->
                brandName like #{brandName}
            </when>
            <otherwise>    <!--相当于default-->
                1 = 1
            </otherwise>
        </choose>

</select>

Mybatis事务:

        openSession():默认开启事务,进行增删改查操作后需要使用sqlSession.commit();手动提交事务;

        openSession(true):可以设置为自动提交事务(关闭事务)

返回添加数据的主键

        <insert useGeneratedKeys = "true" keyProperty = "id">

动态修改

        使用<set>进行补正

批量删除

collection:需要循环的数组

item:数组中每个元素的名称

separator:每个数组元素之间的分隔符

open:开头元素之前的字符

close:结尾元素之后的字符

<delete id="deleteByIds">
    delete
    from tb_brand
    where id in (
        <foreach collection="ids" item="id" separator="," open="(" close=")">
            #{id}
        </foreach>
        )
</delete>

        批量删除的小细节:

<!--
    mybatis会将数组参数,封装成一个Map集合
        * 默认: array = 数组
        * 使用@Param注解改变map集合的默认key的名称
-->

Mybatis参数封装:

        单个参数:

                1、POJO类型:直接使用,属性名和参数占位符名称一致

                2、Map集合:直接使用,键名和参数占位符名称一致

                3、Collection:封装为Map集合,可以使用@Param注解,替换Map集合中默认的arg键名

                        map.put("arg0", collection集合);

                        map.put("collection",collection集合);

                4、List:封装为Map集合,可以使用@Param注解,替换Map集合中默认的arg键名

                        map.put("arg0", list集合);

                        map.put("collection",list集合);

                        map.put("list",list集合);

                5、Array:封装为Map集合,可以使用@Param注解,替换Map集合中默认的arg键名

                        map.put("arg0", 数组);

                        map.put("array",数组);

                6、其他类型:直接使用

        *多个参数:封装为Map集合,可以使用@Param注解,替换Map集合中的默认arg键名

                map.put("arg0",参数值1);

                map.put("param1",参数值1);

                map.put("arg1",参数值2);

                map.put("param2",参数值2);

                map.put("arg2",参数值3);

                map.put("param3",参数值3);

建议:将来都是用@Param注解来修改Map集合中默认的键名,并使用修改后的名称来获取值,这样可读性更高!

                        

注解开发适合简单功能,复杂功能不推荐注解。

查询:@Select

添加:@Insert

修改:@Update

删除:@Delete

            
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值