MyBatis的综合案例

  • MyBatis的综合案例
    • 环境搭建
      • 创建表tb_brand
        • CREATE TABLE tb_brand (     -- id 主键     id INT PRIMARY KEY AUTO_INCREMENT,     -- 品牌名称     brand_name VARCHAR(20),     -- 企业名称     company_name VARCHAR(20),     -- 排序字段     ordered INT,     -- 描述信息     description VARCHAR(100),     -- 状态:0:禁用 1:启用     STATUS INT );
        • mysql命名规范
          • 不区分大小写
          • 如果有多个单词,单词之间使用下划线分隔
            • brand_name
        • Java命名规范
          • 区分大小写
          • 如果有多个单词,使用驼峰命名法
            • brandName
        • mybatis中默认情况下,表字段名与实体类的名要一致才会自动封装数据
      • 可选:使用idea做为客户端
      • 安装mybatisX插件
    • 会话工具类
      • 一个项目中只需要一个工厂类
      • 每次访问数据库都必须创建新的会话,并且会话对象不能共享
      • package com.itheima.util; import org.apache.ibatis.io.Resources; import org.apache.ibatis.session.SqlSession; import org.apache.ibatis.session.SqlSessionFactory; import org.apache.ibatis.session.SqlSessionFactoryBuilder; import java.io.IOException; import java.io.InputStream; /**  * 会话工厂类  */ public class MyBatisUtils {     private static SqlSessionFactory factory;     static {         //1.获取核心配置文件的输入流         InputStream inputStream = null;         try {             inputStream = Resources.getResourceAsStream("mybatis-config.xml");         } catch (IOException e) {             e.printStackTrace();         }         //2.创建工厂建造类         SqlSessionFactoryBuilder factoryBuilder = new SqlSessionFactoryBuilder();         //3.创建工厂类 (一个项目中只需要一个工厂类)         factory = factoryBuilder.build(inputStream);     }     /**      * 获取会话对象      */     public static SqlSession getSession() {         //4.从工厂类中获取会话对象 (每次访问数据库都必须创建新的会话,并且会话对象不能共享)         return factory.openSession();     } }
    • 查询操作
      • 查询所有记录
        • BrandMapper接口
          • List<Brand> selectAll()
        • BrandMapper.xml实体类映射配置文件
          • <select id="selectAll" resultType="brand">     select * from tb_brand </select>
        • 表中字段名与实体类的属性名不同的解决方法
          • 1. 给字段名取别名,让别外与实体类的属性名相同 (下面定义别名省略了as)     select id,brand_name brandName, company_name companyName, ordered, description, status from tb_brand
          •      2. 手动创建表的字段名与实体类的属性名之间的映射关系          1) 使用resultMap创建映射关系          2) 查询结果使用resultMap,而不是resultType(指定返回元素类型)
            •     <!--     resultMap作用:创建表字段名与实体类属性名之间的映射关系     属性名:         id:映射的唯一标识         type:对应的实体类的名字,可以使用类全名也可以使用别名     子标签:         <id>:映射表的主键             column:表中主键字段名             property指定实体类的属性名         <result>:映射表中其它的字段             通常只需要映射名字不同的字段      -->     <resultMap id="brandMap" type="com.itheima.pojo.Brand">         <id column="id" property="id"/>         <result column="brand_name" property="brandName"/>         <result column="company_name" property="companyName"/>     </resultMap>         <select id="findAll" resultMap="brandMap">         select * from tb_brand     </select>
          • 3. 只需要在核心配置文件中指定:将下划线映射成驼峰命名法
            • 在mybatis-config.xml中指定:<setting name="mapUnderscoreToCamelCase" value="true"/>
        • 常见错误
          • org.apache.ibatis.binding.BindingException: Type interface com.itheima.mapper.BrandMapper is not known to the MapperRegistry.
          • 解决思路
            • 原因:接口与映射配置文件对不上
            • 1. 接口文件名与映射文件名是否相同
            • 2. 包结构com.itheima.mapper是否一样
            • 3. resources下目录使用/创建,而不是点号
            • 4. 接口中方法名与配置文件中id是否一样
            • 5. 核心配置文件中包名:<package name="com.itheima.mapper"/> 是否正确
            • 6. 映射文件中namespace="com.itheima.mapper.BrandMapper"是否正确
      • 查询一条记录
        • 接口
          • Brand selectById(Integer id)
        • 配置文件
          • <select id="selectById" resultType="brand">     select * from tb_brand where id=#{id} </select>
        • 占位符两种写法
          • #{变量名} 底层使用是PreparedStatement,替换占位符
          • ${变量名} 底层使用的是Statement,采用字符串拼接的方式,有SQL注入问题
      • 多条件查询
        • 字符串前后加%,拼接问题
          • 使用函数拼接字符串
            • SELECT CONCAT('a','b','c')
          • 前面使用双引号,中间使用单引号
            • SELECT "a"'b'"c"
          • SQL语句写法
            • SELECT * FROM tb_brand WHERE `status`=1 AND brand_name LIKE "%"'米'"%" AND company_name LIKE "%"'公司'"%"
        • 接口
          • 方式1:使用多个参数
            • 如果有多个参数,必须使用@Param("参数名")指定参数名字,用在配置文件中:#{参数名}
            • List<Brand> selectByCondition(@Param("status")Integer status,                               @Param("brandName")String brandName,                               @Param("companyName")String companyName);
          • 方式2:实体类封装参数
            • 只要一个实体类封装所有的属性值
            • List<Brand> selectByCondition(Brand brand);
          • 方式3:使用Map封装多个参数
            • HashMap<String, Object> condition = new HashMap<>(); condition.put("status", 1); condition.put("brandName", "米"); condition.put("companyName", "公司");
            • List<Brand> selectByCondition(Map<String,Object> condition)
          • mybatis方法重载的问题:
            • 在mybatis中不允许出现方法的重载,即同名的方法不能出现2次,否则会出现以下异常
            • Mapped Statements collection already contains value for 包名.接口.方法名
        • 配置文件
          • if标签作用
            • 判断表达式的值是否为真,如果为真则拼接SQL语句
            • 如果是字符串的类型,不但要判断是否为空,还要判断是否是空字符串
          • where标签
            • 1. 有条件的时候生成where关键字,根据条件去过滤数据
            • 2. 会根据条件去掉多余的and or where关键字(自己干掉自己实现查全部)
          • 代码
            • <select id="selectByCondition" resultType="com.itheima.pojo.Brand">    SELECT * FROM tb_brand     <where>         <if test="status!=null">             `status`=#{status}         </if>         <if test="brandName!=null and brandName!=''">             AND brand_name LIKE "%"#{brandName}"%"         </if>         <if test="companyName!=null and companyName!=''">             AND company_name LIKE "%"#{companyName}"%"         </if>     </where> </select>
      • 单一的查询条件
        • 标签
          • choose 类似于 switch 多分支
          • when 类似于 case 只会执行其中一个条件
          • otherwise 类似于 default 上面所有的条件都不满足就执行这个
        • 接口
          • List selectByConditionSingle(Brand brand)
        • 配置
          • <select id="selectByConditionSingle" resultType="com.itheima.pojo.Brand">     SELECT * FROM tb_brand     <where>         <choose>             <when test="status!=null">                 `status`=#{status}             </when>             <when test="brandName!=null and brandName!=''">                 brand_name LIKE "%"#{brandName}"%"             </when>             <when test="companyName!=null and companyName!=''">                 company_name LIKE "%"#{companyName}"%"             </when>             <otherwise>                 ordered > 50             </otherwise>         </choose>     </where> </select>
      • 在XML中特殊字符处理
        • 1. 使用实体字符进行转义,小于:< 大于: >
        • 2. 使用CD代码段,解析成纯文本
    • 增删改操作
      • mybatis中默认是手动提交事务
        • 1. 手动提交事务 sqlSession.commit()
        • 2. 从工厂中打开会话的时候,指定为自动提交事务 factory.openSession(true)
      • 添加记录
        • 接口
          • /**  * 增删改返回的是影响的行数  */ int addBrand(Brand brand);
        • 配置
          • <insert id="addBrand" useGeneratedKeys="true" keyColumn="id" keyProperty="id">     INSERT INTO tb_brand VALUES (null,#{brandName},#{companyName},#{ordered},#{description},#{status}) </insert>
        • 获取生成的主键
          • useGeneratedKeys: 设置为true,要获取自增长的主键值
          • keyColumn: 主键在表中的字段名
          • keyProperty:主键在实体类中属性名
      • 删除记录
        • 接口
          • int deleteById(Integer id)
        • 配置
          • <delete id="deleteById">     DELETE FROM tb_brand WHERE id=#{id} </delete>
      • 修改
        • 接口
          • int update(Brand brand)
        • 配置
          • 更新所有的字段
            • <update id="update">     UPDATE tb_brand SET         brand_name=#{brandName},         company_name=#{companyName},         ordered=#{ordered},         description=#{description},         `status`=#{status}     WHERE id=1; </update>
          • 更新部分字段
            • <update id="update">     UPDATE tb_brand     <set>         <if test="brandName!=null and brandName!=''">             brand_name=#{brandName},         </if>         <if test="companyName!=null and companyName!=''">             company_name=#{companyName},         </if>         <if test="ordered!=null">             ordered=#{ordered},         </if>         <if test="description!=null and description!=''">             description=#{description},         </if>         <if test="status!=null">             `status`=#{status}         </if>     </set>     WHERE id=#{id}; </update>
        • set标签作用:
          • 相当于sql语句中set关键字
          • 去掉多余的逗号
      • 批量删除多条记录
        • 接口
          • int deleteByIds(@Param("ids")int[] ids)
            • 只有一个参数也需要使用@Param("别名")
        • 配置
          • <delete id="deleteByIds">     DELETE FROM tb_brand WHERE id IN     <foreach collection="ids" open="(" item="id" separator="," close=")">        #{id}     </foreach> </delete>
        • foreach标签作用:用于遍历数组或集合
          • collection:指定数组或集合的名字,引用@Param("变量名")
          • open:遍历开始前添加的符号
          • item: 给遍历中每个元素起的变量名
          • separator: 每次遍历完添加的符号
          • close: 遍历结束后添加的符号
    • 参数传递
      • 多个参数如果没有使用@Param指定别名
        • 以arg开头的变量名,从0开始: arg0 arg1 arg2
        • 以param开头的变量名,从1开始:param1, param2, param3
      • 数组
        • 可以使用的名字是:array和arg0
      • 集合
        • 参数是一个List,可以使用名字是:arg0, collection, list
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值