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

文章目录

  • CRUD
  • 使用Map传参
  • 使用POJO传参
  • delete
  • update
  • select
  • select所有
  • SQLMapper映射文件中的namespace的作用

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 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 from t_car where id = #{id};
    

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 t_car set car_num=#{carNum},brand=#{brand},guide_price=#{guidePrice},produce_time=#{produceTime},car_type=#{carType} 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所有


@Test 
public void  testSelectAll(){
	SqlSession sqlsession = SqlSessionUtil.openSession();
	List 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

你可能感兴趣的:(javaweb,mybatis,学习,笔记)