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>