MyBatis 您所在的位置:网站首页 companyname是什么公司 MyBatis

MyBatis

2024-07-16 11:13| 来源: 网络整理| 查看: 265

要完成的功能列表清单: 1、查询

查询所有数据查看详情条件查询

2、添加

3、修改

修改全部字段修改动态字段

4.删除

删除一个批量删除 一、准备环境 数据库表tb_brand实体类Brand测试用例安装MyBatisX插件 (一)数据库表tb_brand

在这里插入图片描述 在这里插入图片描述

(二)实体类Brand package com.itmybatis.pojo; /** * 品牌 * alt+鼠标左键,整列编辑 * 在实体类中,基本数据类型建议使用其对应的包装类型 * 如int换成Integer,因为int的默认值是0,可能会对结果产生影响,而Integer的默认值是null * */ public class Brand { //要与表中字段的类型和名称对应 private Integer id; private String brandName; private String companyName; private Integer ordered; private String description; private Integer status; //0:禁用,1:启动 //提供Setter和Getter方法 public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getBrandName() { return brandName; } public void setBrandName(String brandName) { this.brandName = brandName; } public String getCompanyName() { return companyName; } public void setCompanyName(String companyName) { this.companyName = companyName; } public Integer getOrdered() { return ordered; } public void setOrdered(Integer ordered) { this.ordered = ordered; } public String getDescription() { return description; } public void setDescription(String description) { this.description = description; } public Integer getStatus() { return status; } public void setStatus(Integer status) { this.status = status; } //提供toString方法 @Override public String toString() { return "Brand{" + "id=" + id + ", brandName='" + brandName + '\'' + ", companyName='" + companyName + '\'' + ", ordered=" + ordered + ", description='" + description + '\'' + ", status=" + status + '}'; } } (三)测试用例

在这里插入图片描述 在这里插入图片描述

(四)安装MyBatisX插件

1、MybatisX

MybatisX是一款基于IDEA的快速开发插件,为效率而生。 (1)主要功能: XML和接口方法相互跳转 根据接口方法生成statement

(2)MybatisX下载 在这里插入图片描述 下载完毕后,重启IDEA,会出现以下变化: 在这里插入图片描述 红色小鸟代表SQL映射文件; 蓝色小鸟代表Mapper接口。

点小鸟可以自动切换。在接口中写一个返回值类型和id,会自动在SQL映射文件中创建 在这里插入图片描述 在这里插入图片描述

二、查询 (一)查询所有数据 编写接口方法: Mapper接口;参数:无; 结果:List< Brand> selectAll()编写SQL语句: SQL映射文件执行方法,测试

1、编写接口方法: Mapper接口;参数:无; 结果:List< Brand> selectAll()

public interface BrandMapper { /** * 查询所有 * @return */ List selectAll(); }

2、编写SQL语句: SQL映射文件

select * from tb_brand;

3、执行方法,测试

public class MyBatisNO1Test { /** * * 查询所有 */ @Test public void testSelectAll() throws IOException { //1、加载核心配置文件,获取SqlSessionFactory对象 String resource = "mybatis-config.xml"; //定义配置文件 InputStream inputStream = Resources.getResourceAsStream(resource); SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); //2、获取SqlSession对象,执行SQL语句 SqlSession sqlSession = sqlSessionFactory.openSession(); //3、执行sql //List users = sqlSession.selectList("test.selectAll"); //3.1 通过SqISession的getMapper方法获取Mapper接口的代理对象 BrandMapper brandMapper = sqlSession.getMapper(BrandMapper.class); //3.2 调用对应方法完成sql的执行 List brands = brandMapper.selectAll(); System.out.println(brands); //4、释放资源 sqlSession.close(); } }

执行结果: [Brand{id=1, brandName=‘null’, companyName=‘null’, ordered=5, description=‘好吃不上火’, status=0}, Brand{id=2, brandName=‘null’, companyName=‘null’, ordered=100, description=‘华为致力于把数字世界带入每个人、每个家庭、每个组织,构建万物互联的智能世界’, status=1}, Brand{id=3, brandName=‘null’, companyName=‘null’, ordered=50, description=‘i’m fine’, status=1}]

会发现brandName=‘null’, companyName='null’显示null,并没有查出结果,这是因为数据库中表的字段名为brand_name和company_name,而实体类中定义的属性名称brandName和companyName与数据库的字段名不一样,则不能自动封装数据

解决方法:

(1)起别名

在SQL映射文件中的查询语句中,不写成select * from,而是把所有属性都列出来,把不一样的名称后加as起别名,别名要与实体类中属性的名称一致。

select id, brand_name as brandName, company_name as companyName, ordered, description, status from tb_brand;

缺点:每次查询都要定义,不方便。

所以我们希望只定义一次,出现就引用

(2)定义SQL片段

把所有属性(需要起别名的起别名)放到< sql>中,并起一个id,那么这个id就代表这一串属性。在引用的时候,需要使用include标签,把id放进去。

id, brand_name as brandName, company_name as companyName, ordered, description, status select from tb_brand;

注意:这里id爆红,需要修改sql dialect

方法1:alt+enter 在这里插入图片描述 在这里插入图片描述 方法2:settings——sql dialect,选择generic sql (在写sql语句时希望出现提示,通过此方法修改为mysql)

缺点:定义SQL片段方法不灵活

(3)resultMap(最重要)

resultMap的id自己随便起名,当前type类型要与brand类型映射; 中间有两个值,一个是id,一个是result,id标签是完成主键字段映射,result标签是完成一般字段的映射; 在这里插入图片描述 无论是id还是result标签,都要有两个属性,column后跟数据库表的字段名,property后跟要改成的实体类中的属性名;

将select标签后的resultType改为resultMap加id.

select * from tb_brand;

【查询结果】 [Brand{id=1, brandName=‘三只松鼠’, companyName=‘三只松鼠股份有限公司’, ordered=5, description=‘好吃不上火’, status=0}, Brand{id=2, brandName=‘华为’, companyName=‘华为技术有限公司’, ordered=100, description='华为致力于把数字世界带入每个人、每个家庭、每个组织,构建万物互联的智能世界 ', status=1}, Brand{id=3, brandName=‘小米’, companyName=‘小米科技有限公司’, ordered=50, description=‘i’m fine’, status=1}]

(二)查看详情

在这里插入图片描述

编写接口方法: Mapper接口;参数: id ;结果: Brand ; Brand selectById(int id)编写SQL语句:SQL映射文件执行方法,测试 在这里插入图片描述 1、编写接口方法: Mapper接口 /** * 查看详情 * 查看某一条元组的信息,而不是集合 * @param id */ Brand selectById(int id);

2、编写SQL语句:SQL映射文件

select * from tb_brand where id = #{id};

参数占位符:

#{}:会将其替换为?,为了防止SQL注入${}:拼字符串,会存在SQL注入问题

参数类型: 使用 parameterType=" "指定参数类型,比如id 是int类型就可以写成parameterType="int "; 可以省略!!!

特殊字符处理: 比如在sql查询语句中要写一个where id < 5;而这个小于号跟标签开始相同,所以容易出错。

转义字符:特殊字符少的时候方便CDATA区:特殊字符多的时候方便

3、执行方法,测试

/** * 查看详情 * */ @Test public void testSelectById() throws IOException { //接受参数 int id = 1; //1、加载核心配置文件,获取SqlSessionFactory对象 String resource = "mybatis-config.xml"; //定义配置文件 InputStream inputStream = Resources.getResourceAsStream(resource); SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); //2、获取SqlSession对象,执行SQL语句 SqlSession sqlSession = sqlSessionFactory.openSession(); //3、执行sql //List users = sqlSession.selectList("test.selectAll"); //3.1 通过SqISession的getMapper方法获取Mapper接口的代理对象 BrandMapper brandMapper = sqlSession.getMapper(BrandMapper.class); //3.2 调用对应方法完成sql的执行 Brand brand = brandMapper.selectById(id); System.out.println(brand); //4、释放资源 sqlSession.close(); } (三)条件查询

在这里插入图片描述 1、编写接口方法: Mapper接口

参数接收方法:

方法1:散装接收

List selectByCondition(@Param("status")int status, @Param("companyName")String companyName, @Param("brandName")String brandName);

使用@Param注解标注哪个值映射哪个,@Param(“参数占位符名称”),如: @Param(“status2”)int status1是指将传进来的status1的值,映射给status2,status2是SQL语句中占位符名称。

方法2:封装成一个对象

List selectByCondition(Brand brand);

如果多个参数属于同一个对象,那么可以把它们封装成一个对象,直接把这个对象传递到方法中去。 此时需要注意SQL占位符名称要与brand属性名称一致,否则找不到对应的get方法。

方法3:map集合

List selectByCondition(Map map);

SQL占位符名称要与map键的名称一样

2、编写SQL语句:SQL映射文件

需要注意,status是等值连接,而company_name和brand_name要用模糊查询like。

select * from tb_brand where status = #{status} and company_name like #{companyName} and brand_name like #{brandName}

占位符#{}里的名称就不能随便写了: 若用散装接收,则要与@Param注解里的名称一样; 若用对象或Map集合,则要跟属性名或者map键的名称一样。

3、执行方法,测试

因为是模糊查询,这里要对数据进行处理。

//接受参数 int status = 1; String companyName ="华为"; String brandName = "华为"; //处理参数 companyName = "%" + companyName + "%"; brandName = "%" + brandName + "%";

(1)接收参数使用散装接收@Param注解时,需要将每个参数都传进去:

返回值是一个集合

//3.2 调用对应方法完成sql的执行 List brands = brandMapper.selectByCondition(status,companyName,brandName);

测试代码:

/** * 多条件查询 * */ @Test public void testSelectByCondition() throws IOException { //接受参数 int status = 1; String companyName ="华为"; String brandName = "华为"; //处理参数 companyName = "%" + companyName + "%"; brandName = "%" + brandName + "%"; //1、加载核心配置文件,获取SqlSessionFactory对象 String resource = "mybatis-config.xml"; //定义配置文件 InputStream inputStream = Resources.getResourceAsStream(resource); SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); //2、获取SqlSession对象,执行SQL语句 SqlSession sqlSession = sqlSessionFactory.openSession(); //3、执行sql //List users = sqlSession.selectList("test.selectAll"); //3.1 通过SqISession的getMapper方法获取Mapper接口的代理对象 BrandMapper brandMapper = sqlSession.getMapper(BrandMapper.class); //3.2 调用对应方法完成sql的执行 List brands = brandMapper.selectByCondition(status,companyName,brandName); System.out.println(brands); //4、释放资源 sqlSession.close(); }

(2)接收参数使用封装对象时,需要在测试中把三个参数封装成一个对象

//封装对象 Brand brand = new Brand(); brand.setStatus(status); brand.setCompanyName(companyName); brand.setBrandName(brandName);

然后把brand对象传进去

List brands = brandMapper.selectByCondition(brand);

测试代码:

//接受参数 int status = 1; String companyName ="华为"; String brandName = "华为"; //处理参数 companyName = "%" + companyName + "%"; brandName = "%" + brandName + "%"; //封装对象 Brand brand = new Brand(); brand.setStatus(status); brand.setCompanyName(companyName); brand.setBrandName(brandName); //1、加载核心配置文件,获取SqlSessionFactory对象 String resource = "mybatis-config.xml"; //定义配置文件 InputStream inputStream = Resources.getResourceAsStream(resource); SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); //2、获取SqlSession对象,执行SQL语句 SqlSession sqlSession = sqlSessionFactory.openSession(); //3、执行sql //List users = sqlSession.selectList("test.selectAll"); //3.1 通过SqISession的getMapper方法获取Mapper接口的代理对象 BrandMapper brandMapper = sqlSession.getMapper(BrandMapper.class); //3.2 调用对应方法完成sql的执行 //List brands = brandMapper.selectByCondition(status,companyName,brandName); List brands = brandMapper.selectByCondition(brand); System.out.println(brands); //4、释放资源 sqlSession.close();

(3)接收参数时使用map集合,需要在测试中把三个参数封装成一个map集合:

//Map集合 Map map = new HashMap(); map.put("status",status); map.put("companyName",companyName); map.put("brandName",brandName);

把map集合传进去

List brands = brandMapper.selectByCondition(map);

多条件查询,需要把所有条件参数都输入才能查询出结果,而如果只想通过其中一个条件查询,就会出问题,很不灵活。

(四)动态条件查询

SQL语句会随着用户的输入或外部条件的变化而变化,我们称为动态SQL MyBatis 对动态SQL有很强大的支撑:

ifchoose (when, otherwise)trim (where, set)foreach 多条件——动态条件查询

if:条件判断 test后跟逻辑表达式,注意test后面比较的是用户输入的参数,而不是表中的,所以区分参数名和表中字段名; int类型直接比较是否等于空 String类型除了比较是否为空,还要比较是否为空字符串。

select id="selectByCondition" resultMap="brandResultMap"> select * from tb_brand where status = #{status} and company_name like #{companyName} and brand_name like #{brandName}

如果不传入一个参数(这里是brandName),可以根据传入的status和companyName查出结果 在这里插入图片描述

在这里插入图片描述 缺点: 如果只根据companyName查询,出现问题了。 在这里插入图片描述 这是因为由于第一个参数为null,那么第一个if语句也就不执行,执行第二个if语句,where后面会直接跟and,SQL语法错误 在这里插入图片描述

在这里插入图片描述 解决方法:

(1)恒等式过渡,使每个语句结构都相同

在每一个if标签内的语句都加上and,在where后面加一个恒等式,无论后面第几个参数为空,就会出现where 1=1 and …的情况。

where 1=1 and status = #{status} and company_name like #{companyName} and brand_name like #{brandName}

(2)< where>替换where关键字(常用)

select * from tb_brand and status = #{status} and company_name like #{companyName} and brand_name like #{brandName}

会自动把不需要的and去掉 在这里插入图片描述

单条件——动态条件查询

从多个条件中选择一个 choose (when, otherwise):选择,类似于Java中的 switch语句 只能有一个条件成立 如果一个参数都没有,那么会执行otherwise(相当于default),里面是恒等式

select * from tb_brand where status = #{status} company_name like #{companyName} brand_name like #{brandName} 1 = 1 ;

而在上面学到< where>标签会自动修正SQL语法,所以可以把上述otherwise去掉,直接用< where>标签代替where



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有