<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类的属性一一对应
建议使用包装类,这样可以防止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,然后将剩下的单词首字母小写,然后放进去。
根据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};
@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};
@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关键字起别名
@Test
public void testSelectAll(){
SqlSession sqlsession = SqlSessionUtil.openSession();
List
注意:resultType还是指定要封装的结果集的类型,不是指定List类型,是指定List集合中元素的类型。
selectList方法:mybatis通过这个方法得知你需要一个List集合,他会自动给你返回一个List集合
如果有两个Mapper文件,而其中的增删改查的某一个条目的id值相同的话就会不知道运行哪一个,会报错。
那就需要在测试的时候改变statement值的传入,改为哪一个Mapper文件下的哪个SQL语句
命名空间是为了防止id冲突的
本质上mybatis中的sqlID的完整写法是namespace.id