广东省建设工程质量安全协会网站,wordpress 底部按钮,服务器和域名如何做网站,宁波seo推广公司排名准备环境
1、数据库表tb_brand 2、实体类Brand 3、测试用例
3、1在test包中的java包中创建测试类com.xyy.test.MybatisTest.java
4、安装MyBatisX插件 添加插件后#xff0c;因为在Mapper代理开发时#xff0c;Mapper接口要和Mapper.xml映射文件放在同一个报下#xff0…准备环境
1、数据库表tb_brand 2、实体类Brand 3、测试用例
3、1在test包中的java包中创建测试类com.xyy.test.MybatisTest.java
4、安装MyBatisX插件 添加插件后因为在Mapper代理开发时Mapper接口要和Mapper.xml映射文件放在同一个报下在如下界面中可以看到接口名前面和每个接口方法名前都会有一个图标点击便可以跳转到对应的sql映射文件中点击接口前的图标会跳转到Mapper.xml中的 select , delete , insert , modify 等标签点击方法对应的图标便会跳转到Mapper.xml标签里面的sql语句。同样在接口和映射文件中可以互相进行跳转。 如果在接口中加入方法但是在映射文件中并没有定义一个statement select 等标签会爆红提示通过快捷键alt shift enter让mybatis帮忙进行创建 增删改查
1、查询
1、1 查询所有数据 从 XML 中构建 SqlSessionFactory String resource mybatis-config.xml;
InputStream resourceAsStream Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory new SqlSessionFactoryBuilder().build(resourceAsStream);从 SqlSessionFactory 中获取 SqlSession SqlSession sqlSession sqlSessionFactory.openSession();利用Mapper代理开发来执行sql BrandMapper brandMapper sqlSession.getMapper(BrandMapper.class);
ListBrand brands brandMapper.selectAll();
for(Brand brand : brands) {
System.out.println(brand); //这里执行的是查询tb_brand表的所有信息
}结果如下但是有个Problem: 为什么会出现这种情况 这是因为在数据库建表的时候tb_brand表中column字段名和在java的pojo包下创建的实体类Brand的property属性差异造成的 在数据库表中字段column定义如上图再看在java中对应的实体类的属性property 可以看到这两个映射不匹配所以才会造成上述原因在传表中数据给实体类中时找不到匹配属性所以会显示为null 解决方案有多种这里介绍常用灵活的resultMap 在对tb_brand表的sql映射文件中加入resultMap,格式如下 mapper namespacecom.xyy.mapper.BrandMapperresultMap id brandMap typeBrandresult columnbrand_name propertybrandName/resultresult columncompany_name propertycompanyName/result!--因为只有两个property和tb_brand中的column不对应所以只写了两个这里对于映射有两个写法一个是result标签就是上面这个这种是针对于非主键的对于主键的映射需要通过id因为实体类中的id属性和表中的id字段对应了就没必要写但是也可以写出来如下图-- /resultMap!-- selectAll方法查询所有品牌信息 --select idselectAll resultMapbrandMapselect * from tb_brand;/select!-- selectById方法查询品牌信息参数为id --select idselectById resultMapbrandMapselect * from tb_brand where id #{id};/select
/mapper添加了resultMap标签里面有id和typeid是该resultMap标签的唯一标识type则是需要字段和属性映射的实体类 其次再将select标签中的resultType删掉换成resultMap“其唯一标识”。 官方文档中给出resultType和resultMap不能同时出现 再次运行结果如下 对于这些标签的属性mybatis – MyBatis 3 | XML 映射器 (p2hp.com)给出了非常详细的介绍可以参阅。 1、2 查看详情 查询所有是将表中所有记录都给查询出来而查询详情则是将某一条记录拿出来将所有column字段展示。 步骤流程 1、编写接口方法Mapper接口 1、1 参数id 1、2 结果 Brand 2、编写SQL语句SQL映射文件 3、执行方法测试 select idselectById resultMapbrandMap
select * from tb_brand where id #{id};
/select参数占位符 1、#{ } 会将其替换成为了防止SQL注入 2、${ }直接拼sql会存在SQL注入问题 3、使用时机 3、1 参数传递的时候#{ } 3、2表名或者列名不固定的情况下${ } 动态sql 参数类型parameterType:可以省略 特殊字符处理 sql语句是写在xml文件中的当sql条件中包含’ ’ 时便会报错因为这个是xml中标签的打头为了避免这种情况: 1、可以使用转移字符例如对于的转义字符是 2、![CDATA[ 特殊字符就写在这里面 ]] 这样特殊字符就会被当做普通文本来进行处理。idea通过敲CD回车即可打出快捷键 ![CDATA[...]] 1、 /*** param id* return com.xyy.pojo.Brand* description 根据id查询品牌信息*/Brand selectById(int id);以下是采用#{}的传参方式 以下是采用${}的传参方式可以看到这是采用拼接会造成安全隐患 1、3 条件查询
1、3、1 多条件查询 给出表中数据后面三个条件查询都是对这个操作 步骤 1、编写接口方法Mapper接口 1、1 参数所有查询条件 1、2 结果 List Brand 2、编写SQL语句SQL映射文件 3、执行方法测试 多条件就代表会传入多个参数以下提供了三中参数处理的方式。 以下三种传参方式以后都会有应用场景将一一介绍 1、散装参数 //假定用户输入的三个数据条件
int status 1;
String companyName 华为;
String brandName 华为;
//处理用户输入的三个条件
companyName % companyName %;
brandName % brandName %;String resource mybatis-config.xml;
InputStream resourceAsStream Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory new SqlSessionFactoryBuilder().build(resourceAsStream);
SqlSession sqlSession sqlSessionFactory.openSession();BrandMapper brandMapper sqlSession.getMapper(BrandMapper.class);
ListBrand brands brandMapper.selectByCondition(status, companyName, brandName);
for(Brand brand : brands) {System.out.println(brand);
} 2、对象参数 //这里是对象参数
Brand brand new Brand();
brand.setBrandName(brandName);
brand.setCompanyName(companyName);
brand.setStatus(status);
ListBrand brands brandMapper.selectByCondition(brand); 3、map对象 //这里是Map参数
Map map new HashMap();
map.put(status, status);
//这里的键的名称status需要sql映射文件中的参数一致
//值的名称需要和接收的参数一致即可。
//因为这里接收的参数和sql参数命名一致所以没啥区别
map.put(companyName, companyName);
map.put(brandName, brandName);
ListBrand brands brandMapper.selectByCondition(map);总结 1、3、1、1 多条件判断引入动态sql 引入 上面的多条件查询会存在一些bug用户不一定会每次都将所有条件都会输入这样sql参数就可能接收到null值最终结果就会有问题。 对此引入动态条件查询动态sql 引入 if test “条件表达式” sql片段 /if !-- 多条件查询 --
select idselectByCondition resultMapbrandMapselect *from tb_brandwhereif teststatus ! nullstatus #{status}/ifif testbrandName ! null and brandName ! and brand_name like #{brandName}/ifif testcompanyName ! null and companyName ! and company_name like #{companyName};/if
/select1、3、1中的多条件查询可以修改成这样当用户某个条件没输入字符或者输入为’时就不会拼接该条件 例如 在这里可以看到用多个if条件写法可以解决用户部分条件不输入的查询 但是这个写法会有一些bug看上面xml代码中从第二个if标签开始里面的sql字段都是and开头的如果第一个if标签没有拼接则会造成sql语法错误如下 解决方案如下 1、恒等式 1 1 (在每个if标签中的条件都加上 and 同时在where后加上 1 1后面所有的if标签都一视同仁都是在 11 后面进行一个拼接) 2、Mybatis当然想到了这中情况所以提供了新的标签 where , 用 where 抱歉提到原sql中where这样就不用担心and问题了 select idselectByCondition resultMapbrandMapselect *from tb_brandwhere if teststatus ! nulland status #{status}/ifif testbrandName ! null and brandName ! and brand_name like #{brandName}/ifif testcompanyName ! null and companyName ! and company_name like #{companyName};/if/where
/select这里需要注意一点用 where 代替了where后每个if标签中的sql语句除第一个可以不用加and后面的都需要加上and where 识别去除and的功能没有添加and的功能不然会造成sql语法错误 总结 1、3、2 单条件查询 针对于如下业务场景引入但条件查询就不能像之前多条件查询一次可以输入多个条件。这种情况下一次只能输入一个固定的条件对该条件进行查询。类似于switch结构只执行满足条件的case这里case可以类比于选择的条件 引入choose(when, otherwise) !-- 单条件查询 --
select idselectByConditionSingle resultMapbrandMapselect *from tb_brandwherechoosewhen teststatus ! nullstatus #{status}/whenwhen testbrandName ! null and brandName ! brand_name like #{brandName}/whenwhen testcompanyName ! null and companyName ! company_name like #{companyName}/whenotherwise1 1/otherwise/choose
/select这个otherwise可以用之前的 where 代替where来识别条件个数如果没有条件拼接Mybatis就会去掉where如下 [后续将慢慢完善]
2、添加
3、修改
4、删除