id:唯一标识
type:映射的类型,支持别名
数据库表的字段名称和实体类的属性名称 不一样,则不能自动封装数据,我们提供了三种解决方法。
1、起别名:对不一样的列名起别名,让别名和实体类的属性名一样。
缺点:每次查询都要定义一次别名。
2、 sql片段
缺点:不灵活。
id, brand_name as brandName, company_name as companyName, ordered, description, status
3、resultMap:
1. 定义
2. 在
#{} 会将等待输入的文本替换成? 如同preparedStatement 防止sql注入。
${}在查询的时候,我们需要使用模糊查询like。这时候只能使用此种方法。
参数类型:parameterType() 可以省略,因为传入什么就赋值什么,在接口中已经定义好了数据类型。
//随后通过代理对象调用接口中的方法,Mybatis会自动寻找到xml配置文件中相对应的sql语句并执行
//List brands = brandMapper.selectAll();
brand brand = brandMapper.selectByID(id);
System.out.println(brand);
特殊字符处理:小于号< 不可以直接食用
1、转义字符< 相当于小于号,字符比较少的时候使用
2、CDATA区:字符比较多的时候使用,会将里面的一切都当作纯文本操作
创建sql的执行对象
sqlSessionFactory.openSession(true/false)
设置可以选择是否开启事务,true->自动提交 ;false->手动提交;
参数接收:
所有配置步骤,包括三种处理参数的方法。
1、散装参数:如果方法中由多个参数,需要使用@param(sql语句占位符名称)
@Interface
List selectByCondition(@Param("status")int status,@Param("companyName") String company_name,@Param("brandName")String bramd_name);
@Test
List brands = brandMapper.selectByCondition(status, companyName, brandName);
2、对象参数:对象属性名称要和参数占位符名称保持一致
@Interface
List selectByCondition(brand brand);
@Test
List brands = brandMapper.selectByCondition(brand);
3、map集合参数:保证sql中参数名和map集合里面的健的名称对应的上,即可设置成功。
@Interface
List selectByCondition(Map map);
@Test
List brands = brandMapper.selectByCondition(map);
封装数据的过程
//设置参数
int status=1;
String company_name="华为";
String brand_name="华为";
//处理参数,用作模糊处理
company_name="%"+company_name+"%";
brand_name ="%"+company_name+"%";
//创建map集合
Map map=new HashMap();
map.put("status",status);
map.put("company_name",company_name);
map.put("brand_name",brand_name);
//封装对象
brand brand=new brand();
brand.setStatus(status);
brand.setCompany_name(company_name);
brand.setBrand_name(brand_name);
有一些查询,我们并不要求所有的选项都被用户输入,一旦出现了数据为null的情况,无法从表中查询到有效的数据。
基于此情况,我们需要随着sql语句的变化进行修改,也就是switch判断。Mybatis提供了一套内置的标签,帮助我们进行判断。
insert into tb_brand (brand_name, company_name, ordered, description, status)
values (#{brandName}, #{companyName}, #{ordered}, #{description}, #{status});
添加关联数据时。
在订单表和订单项中,他们之间是多对多的关系。即一个订单表和多个商品表对应商品中间表外键。
每当我们插入一个商品的时候, 我们需要将商品和中间表相关联。与此同时,我们需要将订单表也进行更新,更新时我们需要知道添加的是哪件商品,所以需要返回商品的id。
看不懂?以后再来修改。
在测试类中,我们仅仅对部分数据进行修改,其他保持不变,并对数据封装后提交给方法。这样会让不想修改的数据变成null。为了解决这个问题,我们可以使用
update tb_brand
brand_name = #{brandName},
company_name = #{companyName},
ordered = #{ordered},
description = #{description},
status = #{status}
where id = #{id};
删除一个数据
delete from tb_brand where id = #{id};
批量删除
把选中的id值提交给代码,代码挨个去删除。我们会把待删除的id封装成数组,随后按照顺序一个个删除。
Mbatis中配置了遍历数组的标签
我们需要使用seperate将每个输入的?分隔开。
我们同样open=“” close=“”表示开始和结束的时候拼接什么。
Please Attention
Mybatis会自动的将我们传递去的数组封装成一个map集合.
默认array=你传递的数组数据.
你可以使用@Param注解来改变map集合默认key的名称。
delete from tb_brand where id
in
#{id}
;