MyBatis学习笔记之正式编写增删改查

CRUD

  • C:create,增
  • R:retrieve,查
  • U:update,改
  • D:delete,删

使用Map传参

    <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>

↑这种写法是不好的,值是固定死的,而我们的实际应用中都是前端的form表单提交过来数据,然后将值传给sql语句。

在JDBC当中占位符采用的是,而在mybatis当中是#{}


java程序中使用Map可以给SQL语句的占位符传值

//这个insert方法的参数
//第一个参数:sqlID,从CarMapper.xml文件中复制
//第二个参数:封装数据的对象。
Map<String, Object> map =new HashMap<>();
        map.put("k1","1111");
        map.put("k2","比亚迪汉");
        map.put("k3",10.0);
        map.put("k4","2020-1-1");
        map.put("k5","电车");

insert into t_car(id,car_num, brand , guide_price,produce_time, car_ type) values(null ,#{k1},#{K2} ,#{k3},#{k4} ,#{k5}); 

注意:#{这里写什么?写map集合的key,如果key不存在,获取的是null}
一般map集合起名的时候要见名知意。

使用POJO传参

数据库当中的字段应该和POJO类的属性一一对应
建议使用包装类,这样可以防止null的问题

Car car = new Car(null,"22222","八嘎亚路",30.0,"2022-1-1","新能源");

insert into t_car(id,car_num, brand, guide_price ,produce_time,car_type)
values(null, #{carNum},#{brand},#{guidePrice},#{produceTime},#{carType});

mybatis #{carNum} 通过反射机制调和getCarNum


从严格意义上来说,如果使用POJO对象传递值的话,#{}这个大括号中到底写什么?

写的是get方法的方法名去掉get,然后将剩下的单词首字母小写,然后放进去。

delete

根据id删除数据

    @Test
    public void testdeletbyid(){
        SqlSession sqlSession = SqlSessionUtil.openSession();
        int count = sqlSession.delete("deleteById",1);
        sqlSession.commit();
        sqlSession.close();
    }
    <delete id="deleteById">
        delete from t_car where id = #{id};
    </delete>

update

    @Test
    public void testUpdateById(){
        SqlSession sqlSession = SqlSessionUtil.openSession();
        Car car = new Car(4L,"99999","一给我里giaogiao",30.3,"2022-2-2","燃油车");

        sqlSession.update("updateById",car);
        sqlSession.commit();
        sqlSession.close();
    }
    <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>

select

<select id="selectById" resultType="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>
@Test
public void testSelectById(){
	SqlSession sqlsession = SqlSessionUtil.openSession();
	Object car = sqlsession.selectOne("selectById",3);
	System.out.println(car);
	sqlsession.close();
}

执行DQL语句,查询,根据id查询,返回结果一定是一条
mybatis底层执行了select语句之后,一定会返回一个结果集对象:ResultSet

需要特别注意的是:

select标签中resultType属性,这个属性用来告诉mybatis,查询结果封装成什么类型的java对象.
resultType通常写的是全限定类名.


为什么select里的东西写的那么复杂

select语句查询的时候属性值和属性名是对应起来赋值进去的,所以如果属性名没有对应上,属性值也就不会赋值进去
所以需要用as关键字起别名

select所有

<select id="selectById" resultType="mybatis.pojo.Car">
	select 
			id , car_num as carNum , brand , guid_price as guidePrice
			produce_time as produceTime,
			car_type as carType
		from
			t_car
</select>
@Test 
public void  testSelectAll(){
	SqlSession sqlsession = SqlSessionUtil.openSession();
	List<Object> cars = sqlsession.selectList("selectAll");
	cars.foreach(car -> System.out.println(car));
	sqlsession.close();
}

注意:resultType还是指定要封装的结果集的类型,不是指定List类型,是指定List集合中元素的类型。
selectList方法:mybatis通过这个方法得知你需要一个List集合,他会自动给你返回一个List集合

SQLMapper映射文件中的namespace的作用

如果有两个Mapper文件,而其中的增删改查的某一个条目的id值相同的话就会不知道运行哪一个,会报错。

那就需要在测试的时候改变statement值的传入,改为哪一个Mapper文件下的哪个SQL语句

命名空间是为了防止id冲突的

本质上mybatis中的sqlID的完整写法是namespace.id

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

优降宁

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值