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

相关推荐
sniper_fandc19 分钟前
SpringBoot系列—MyBatis(xml使用)
java·spring boot·mybatis
Charlie__ZS1 小时前
若依框架去掉Redis
java·redis·mybatis
饕餮争锋2 小时前
设计模式笔记_创建型_建造者模式
笔记·设计模式·建造者模式
萝卜青今天也要开心2 小时前
2025年上半年软件设计师考后分享
笔记·学习
吃货界的硬件攻城狮3 小时前
【STM32 学习笔记】SPI通信协议
笔记·stm32·学习
蓝染yy3 小时前
Apache
笔记
lxiaoj1114 小时前
Python文件操作笔记
笔记·python
半导体守望者5 小时前
ADVANTEST R4131 SPECTRUM ANALYZER 光谱分析仪
经验分享·笔记·功能测试·自动化·制造
啊我不会诶6 小时前
倍增法和ST算法 个人学习笔记&代码
笔记·学习·算法
逼子格6 小时前
振荡电路Multisim电路仿真实验汇总——硬件工程师笔记
笔记·嵌入式硬件·硬件工程·硬件工程师·硬件工程师真题·multisim电路仿真·震荡电流