MyBatis第二天笔记

3.1 什么是CRUD

CRUD是数据库基本操作的缩写:

  • C:Create(创建)- 对应SQL的INSERT操作
  • R:Retrieve(查询)- 对应SQL的SELECT操作
  • U:Update(更新)- 对应SQL的UPDATE操作
  • D:Delete(删除)- 对应SQL的DELETE操作

3.2 insert操作(Create)

3.2.1 基本的insert语句
xml 复制代码
<insert id="insertCar">
    insert into t_car(id,car_num,brand,guide_price,produce_time,car_type)
    values(null,'1003','丰田霸道',30.0,'2000-10-11','燃油车');
</insert>

这种写法的问题是值被硬编码到配置文件中,实际开发中需要动态传值。

3.2.2 使用占位符

MyBatis中使用#{}作为占位符,等同于JDBC中的?

xml 复制代码
<insert id="insertCar">
    insert into t_car(id,car_num,brand,guide_price,produce_time,car_type)
    values(null,#{carNum},#{brand},#{guidePrice},#{produceTime},#{carType})
</insert>
3.2.3 使用Map传值
java 复制代码
// 准备数据
Map<String, Object> map = new HashMap<>();
map.put("carNum", "1111");
map.put("brand", "比亚迪汉");
map.put("guidePrice", 10.0);
map.put("produceTime", "2020-11-11");
map.put("carType", "电车");

// 获取SqlSession对象
SqlSession sqlSession = SqlSessionUtil.openSession();
// 执行SQL语句
int count = sqlSession.insert("insertCar", map);

注意事项:

  • #{}中必须填写map集合的key
  • 如果key不存在,不会报错,但会插入NULL值
  • 建议map的key命名要见名知意
3.2.4 使用POJO对象传值
java 复制代码
// 创建POJO对象
Car car = new Car(null, "3333", "比亚迪秦", 30.0, "2020-11-11", "新能源");

// 获取SqlSession对象
SqlSession sqlSession = SqlSessionUtil.openSession();
// 执行SQL语句
int count = sqlSession.insert("insertCarByPOJO", car);
xml 复制代码
<insert id="insertCarByPOJO">
    insert into t_car(id,car_num,brand,guide_price,produce_time,car_type)
    values(null,#{carNum},#{brand},#{guidePrice},#{produceTime},#{carType})
</insert>

注意事项:

  • #{}中写的是POJO类的属性名

  • 严格来说,#{}中写的是get方法名去掉get后首字母小写的结果

  • 如果属性名不存在(没有对应的getter方法),会报错:

    复制代码
    There is no getter for property named 'xyz' in 'class com.powernode.mybatis.pojo.Car'
  • MyBatis底层是通过调用getter方法获取属性值的

3.3 delete操作(Delete)

3.3.1 根据id删除数据
xml 复制代码
<delete id="deleteById">
    delete from t_car where id = #{id}
</delete>
java 复制代码
// 获取SqlSession对象
SqlSession sqlSession = SqlSessionUtil.openSession();
// 执行SQL语句
int count = sqlSession.delete("deleteById", 59);

注意:如果占位符只有一个,那么#{}中的内容可以随意写,但最好见名知意。

3.4 update操作(Update)

3.4.1 根据id修改数据
xml 复制代码
<update id="updateById">
    update t_car set
         car_num=#{carNum},
         brand=#{brand},
         guide_price=#{guidePrice},
         produce_time=#{produceTime},
         car_type=#{carType}
    where
        id = #{id}
</update>
java 复制代码
// 准备数据
Car car = new Car(4L, "9999", "凯美瑞", 30.3, "1999-11-10", "燃油车");
// 获取SqlSession对象
SqlSession sqlSession = SqlSessionUtil.openSession();
// 执行SQL语句
int count = sqlSession.update("updateById", car);

3.5 select操作(Retrieve)

3.5.1 查询单条数据
xml 复制代码
<select id="selectById" resultType="com.powernode.mybatis.pojo.Car">
    select * from t_car where id = #{id}
</select>
java 复制代码
// 获取SqlSession对象
SqlSession sqlSession = SqlSessionUtil.openSession();
// 执行SQL语句
Object car = sqlSession.selectOne("selectById", 1);

注意事项:

  • select标签必须指定resultType属性,用于告诉MyBatis查询结果封装成什么类型的Java对象
  • resultType通常写全限定类名
3.5.2 列名和属性名不一致的问题

当数据库表的列名与Java类的属性名不一致时,查询结果无法正确映射,例如:

数据库列名:car_num, guide_price, produce_time, car_type

类的属性名:carNum, guidePrice, produceTime, carType

解决方案是使用SQL别名:

xml 复制代码
<select id="selectById" resultType="com.powernode.mybatis.pojo.Car">
    select
        id,car_num as carNum,brand,guide_price as guidePrice,
        produce_time as produceTime,
        car_type as carType
    from
        t_car
    where
        id = #{id}
</select>
3.5.3 查询多条数据
xml 复制代码
<select id="selectAll" resultType="com.powernode.mybatis.pojo.Car">
    select
        id,car_num as carNum,brand,guide_price as guidePrice,
        produce_time as produceTime,
        car_type as carType
    from
        t_car
</select>
java 复制代码
// 获取SqlSession对象
SqlSession sqlSession = SqlSessionUtil.openSession();
// 执行SQL语句
List<Object> cars = sqlSession.selectList("selectAll");

注意:

  • resultType指定的是List集合中元素的类型,而不是List类型
  • selectList方法会自动返回List集合

3.6 namespace的作用

namespace是SQL Mapper配置文件中<mapper>标签的一个属性,用于防止sqlId冲突。

xml 复制代码
<mapper namespace="car">
    <select id="selectAll" resultType="com.powernode.mybatis.pojo.Car">
        select * from t_car
    </select>
</mapper>

当有多个Mapper文件中存在相同id的SQL语句时,需要使用namespace进行区分:

java 复制代码
// 完整写法:namespace.id
List<Object> cars = sqlSession.selectList("car.selectAll");

实际上,MyBatis中sqlId的完整写法是:namespace.id

相关推荐
sulikey8 小时前
个人Linux操作系统学习笔记6 - 操作系统与进程初识
linux·笔记·学习·操作系统·进程
XGeFei9 小时前
【Fastapi学习笔记(3)】——资源的层级关系、安全性-幂等性、Field、工厂函数
笔记·学习·fastapi
星恒随风11 小时前
Python 基础语法详解(一):从表达式、变量到数据类型
开发语言·笔记·python·学习
暴躁小师兄数据学院12 小时前
【AI大数据工程师特训笔记】第14讲:Linux操作系统与shell脚本
大数据·人工智能·笔记
土狗TuGou12 小时前
SQL内功笔记 · 第8篇:事务的四大特性与隔离级别
数据库·笔记·后端·sql·mysql·oracle
智者知已应修善业13 小时前
【51单片机用T0定时器方式1,实现0.5S的时间间隔实现第一次一个灯亮、第二次二个灯亮,直到全部灯亮,然后重复整个过程】2023-12-29
c++·经验分享·笔记·算法·51单片机
智者知已应修善业13 小时前
【51单片机4位静态数码管显示1234】2023-11-14
c++·经验分享·笔记·算法·51单片机
whyTeaFo14 小时前
MIT6.1810: xv6 book Chapter4: Traps and system calls 笔记
笔记
jimbo_lee14 小时前
yocto 用法(随手笔记,记录以备不时之需)
笔记·yocto
胡图图不糊涂^_^17 小时前
测试用例篇——设计测试用例的方法
笔记·学习·测试用例·判定表法·正交法生成用例测试·等价类·边界值