Mybatis学习部分总结

Mybatis学习部分总结

1、概念:

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

2、与传统JDBC开发相比的优点

简化了传统JDBC开发的连接,将数据库连接参数写成配置文件,更加灵活

对查询出来的结果进行自动封装,更加方便

启用数据库连接池技术,使程序运行所需资源跟低,效率更高

3、Mybatis实现数据库操作的基础代码

1、通过注解+sql语句

2、通过XML映射文件

示例代码:

@Mapper
public interface DeptMapper {

    @Select("select id, name, create_time, update_time from dept")
    List<Dept> selectAllDeptInfo();

    @Delete("delete from dept where id=#{id}")
    void deleteDeptInfoById(Integer id);

    void insertDeptInfo(Dept dept);
    @Select("select * from dept where id=#{id};")
    Dept getDeptInfoById(Integer id);

    void updateDeptInfo(Dept dept);
}

示例XML:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"        "https://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.wzp.tlias_web.mapper.DeptMapper">

    <insert id="insertDeptInfo">        insert into dept(id, name, create_time, update_time) values (null,#{name},now(),now())    </insert>
    <update id="updateDeptInfo">        update dept set name=#{name},update_time=now() where id=#{id}    </update>
</mapper>

注意点:

1、sql中需要接收参数的需要用占位符#{},相比于${}此种占位符,#{}采用预编译更安全,效率更高

2、XML文件,需要与java文件同包同名,其中namespace属性要与java文件的全限定类名一致,sql标签的id与java文件中的方法名一致

Mybatis中几种特殊功能:

1.主键返回:

在我们执行某些语句例如插入一条数据,此时我们是不知道本条数据在数据库中的实际ID值的,那么如果我们需要获取我们插入的这条数据的实际ID值,进行下一步操作的时候,怎么办,Mybatis提供了一个@Options注解,在对应方法上添加一个@Options注解并在注解中指定属性useGeneratedKeys=true和keyProperty="实体类属性名",这样本方法执行完成后会将对象数据的ID值自动返回给对象的ID属性中。此时就可直接调用

示例:

@Mapper
public interface EmpMapper {
    
    //会自动将生成的主键值,赋值给emp对象的id属性
    @Options(useGeneratedKeys = true,keyProperty = "id")
    @Insert("insert into emp(username, name, gender, image, job, entrydate, dept_id, create_time, update_time) values (#{username}, #{name}, #{gender}, #{image}, #{job}, #{entrydate}, #{deptId}, #{createTime}, #{updateTime})")
    public void insert(Emp emp);

}

2、动态SQL

在执行业务操作的时候会有一些动态的查询或新增操作,例如查询页面上面的多条件查询,可以写,也可以不写,这样对应我们传统的sql语句写起来就很麻烦,需要考虑各种情况,这时候就引入了动态sql

<if>根据判断条件选择是否拼接其中的语句

<select id="list" resultType="com.itheima.pojo.Emp">
        select * from emp
        where
    
             <if test="name != null">
                 name like concat('%',#{name},'%')
             </if>
             <if test="gender != null">
                 and gender = #{gender}
             </if>
             <if test="begin != null and end != null">
                 and entrydate between #{begin} and #{end}
             </if>
    
        order by update_time desc
</select>

上述的语句中,也有一定的问题,在第一个条件不满足的时候,后面拼接的语句会将and直接拼接到where后面,会造成sql报错,这样如何处置呢,这时就引入了一个与if标签的搭配使用的标签,将原sql语句中的where关键字替换成标签,这样会智能的去删除第一条语句的and符号,同理也适用与update语句中,修改后的语句:

<select id="list" resultType="com.itheima.pojo.Emp">
        select * from emp
        <where>
    
             <if test="name != null">
                 name like concat('%',#{name},'%')
             </if>
             <if test="gender != null">
                 and gender = #{gender}
             </if>
             <if test="begin != null and end != null">
                 and entrydate between #{begin} and #{end}
             </if>
    </where>
        order by update_time desc
</select>

<foreach>标签,循环遍历某一个元素,一般适用与批量操作,例如批量删除

<foreach collection="集合名称" item="集合遍历出来的元素/项" separator="每一次遍历使用的分隔符" 
         open="遍历开始前拼接的片段" close="遍历结束后拼接的片段">
</foreach>

示例:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "https://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.itheima.mapper.EmpMapper">
    <!--删除操作-->
    <delete id="deleteByIds">
        delete from emp where id in
        <foreach collection="ids" item="id" separator="," open="(" close=")">
            #{id}
        </foreach>
    </delete>
</mapper> 

<sql>和<include>,这两个标签是用来提取重复的sql语句并进行引用的

示例:

<sql id="commonSelect">
     select id, username, password, name, gender, image, job, entrydate, dept_id, create_time, update_time from emp
</sql>
<select id="list" resultType="com.itheima.pojo.Emp">
    <include refid="commonSelect"/>
    <where>
        <if test="name != null">
            name like concat('%',#{name},'%')
        </if>
        <if test="gender != null">
            and gender = #{gender}
        </if>
        <if test="begin != null and end != null">
            and entrydate between #{begin} and #{end}
        </if>
    </where>
    order by update_time desc
</select>

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值