Mybatis


入门_MyBatis中文网

(Mybatis.pdf)

什么是Mybatis?

  • Mybatis是一款优秀的持久层框架,用于简化JDBC开发
  • 官网:https://mybatis.org/mybatis-3/zh/index.html

持久层:

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

  • JavaEE三层架构:表现层,业务层,持久层

框架:

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

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

快速入门

JDBC写的是硬编码,后期维护很麻烦,无论是增删改查语句的修改,或者是用户名密码的改变,

MyBatis虽然麻烦,不过很多步骤只做一次,后期维护非常的方便

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

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

解决方法:在IDEA中配置MySQL数据库连接

Mapper代理开发

  • 目的

    1.解决原生方式中的硬编码

    2.简化后期执行SQL

  • 步骤

    1.定义与SQL映射文件同名的Mapper接口,并且将Mapper接口和SQL映射文件放置在同一目录下

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

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

    4.编码

    • 通过SqlSession的getMapper方法获取Mapper接口的代理对象
    • 调用对应方法完成sql的执行
  • 细节

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

    <mappers>
    <!--        加载sql映射文件-->
    <!--        <mapper resource="UserMapper.xml"/>-->
    <!--        Mapper代理方式-->
            <package name="com.itheima.mapper"/>
        </mappers>

Mybatis核心配置文件详解

注解完成增删改查

注解即在接口方法上直接写SQL语句,不用在xml文件中再配置

配置文件完成增删改查

起别名

定义<sql>片段

定义<resultMap>片段

注意事项

  1. 参数占位符

​ #{}: 执行SQL时,会将#{}占位符替换为?,将来自动设置参数值

​ ${}: 拼SQL。会存在SQL注入问题

​ 使用时机:

​ 参数传递,都是用#{}

​ 如果要对表名,列名进行动态设置,只能使用${}进行sql拼接

2.parameterType

​ 用于设置参数类型,该参数可以省略

3.SQL语句中特殊字符处理

​ 转义字符

<![CDATA[内容]]>

动态SQL

if标签:用于判断参数是否有值,使用test属性进行条件判断

  • 存在的问题:第一个条件不需要逻辑运算符

  • 解决方案:

    • 使用恒等式让所有条件格式都一样

      <select id="selectByCondition" resultMap="brandResultMap">
              select *
              from tb_brand
      where 1 = 1
              <if test="status != null">and status = #{status}</if>
              <if test="companyName != null and companyName != ''">and company_name like #{companyName</if>
              <if test="brandName != null and brandName != ''">and brand_name like #{brandName}</if>
      
          </select>
    • <where>标签替换where关键字

      <select id="selectByCondition" resultMap="brandResultMap">
              select *
              from tb_brand
      <where>
              <if test="status != null"> status = #{status}</if>
              <if test="companyName != null and companyName != ''">and company_name like #{companyName</if>
              <if test="brandName != null and brandName != ''">and brand_name like #{brandName}</if></where>
      
          </select>

事务提交

自动提交

SqlSession sqlSession = sqlSessionFactory.openSession(true);

手动提交

SqlSession sqlSession = sqlSessionFactory.openSession();
或
SqlSession sqlSession = sqlSessionFactory.openSession(false);

事务后写sqlSession.commit();

返回添加数据的主键

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

上图(批量删除) 如果接口方法未加param注解,collection属性的值应该为array

参数传递

参数封装



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("param2",参数值2)
      map.put("agr1",参数值2)
      ---------------@Param("username")
      map.put("username",参数值1)
      map.put("param1",参数值1)
      map.put("param2",参数值2)
      map.put("agr1",参数值2)

 

使用中出现的问题(注意)

  1. 不加@Param注解,取值的时候直接写属性
public void addUser(User user);
<insert id="addUser" parameterType="com.xxxx.mybatis.entity.User">
    insert into user(id,user_name,name,birthday,age)
    values (#{id},#{userName},#{name},#{birthday},#{age})
</insert>
  1. 加了@Param注解,取值必须使用对象.属性的方式
public void addUser(@Param("user") User user);
<insert id="addUser" parameterType="com.xxxx.mybatis.entity.User">
    insert into user(id,user_name,name,birthday,age)
    values (#{user.id},#{user.userName},#{user.name},#{user.birthday},#{user.age})
</insert>