1.首先先创建一个新的表,使用下面的sql语句
-- 删除tb_brand表
drop table if exists tb_brand;
-- 创建tb_brand表
create table tb_brand
(
-- id 主键
id int primary key auto_increment,
-- 品牌名称
brand_name varchar(20),
-- 企业名称
company_name varchar(20),
-- 排序字段
ordered int,
-- 描述信息
description varchar(100),
-- 状态:0:禁用 1:启用
status int
);
-- 添加数据
insert into tb_brand (brand_name, company_name, ordered, description, status)
values ('三只松鼠', '三只松鼠股份有限公司', 5, '好吃不上火', 0),
('华为', '华为技术有限公司', 100, '华为致力于把数字世界带入每个人、每个家庭、每个组织,构建万物互联的智能世界', 1),
('小米', '小米科技有限公司', 50, 'are you ok', 1);
SELECT * FROM tb_brand;
2.创建新的实体类对应数据库的表里面的属性,创建对应的方法
![](https://i-blog.csdnimg.cn/blog_migrate/7c11da9f9042de4b8f725dec26ada638.png)
3.在测试目录下新建测试类
4.安装MybatisX插件
该插件是基于IDEA的快速开发插件,为效率而生
主要功能:
XML和接口方法相互跳转
根据接口方法生成statement(就是Mapper.XML里面的sql语句映射)
如下图所示,接口和mapper中的语句相互对应,红鸟是跳到映射文件,蓝色的是跳到接口
还可自动根据接口何时生成对应的sql映射
创建另一个BrandMapper.XML
同样要放到和对应接口相同的目录下里面
11查询
11.1查询所有数据
Mapper接口
![](https://i-blog.csdnimg.cn/blog_migrate/d8ff7e9c0bb8d8ef297d6d1732f27093.png)
映射文件
![](https://i-blog.csdnimg.cn/blog_migrate/3532f873fb526958e2e9493ac66d01e2.png)
测试代码
![](https://i-blog.csdnimg.cn/blog_migrate/1ef9e71b8796bd21ec2b9dd899d2c9bb.png)
测试成功(有异常报错但是没有关系能跑就行)
![](https://i-blog.csdnimg.cn/blog_migrate/c469a10993664c6385f227aa779260f5.png)
增加一个新功能只需要三步,
编写接口方法-->编写sql映射-->执行方法测试
在输出里面有个别数据是null,这是因为在数据库里面的属性使用了下划线命名,但是在类里面使用驼峰命名法导致两者对应不上,不能自动封装数据
解决方案:
(1)起别名(缺点:每次都要起别名)
(2)使用resultMap进行映射:
定义<resultMap>标签
在select标签中要用resultmap属性替换resultType属性
<resultMap>里面有两种子标签,一个是id负责主键字段映射,一个result负责一般字符段映射其中colum是列的名称,property是实体类的属性名
上面两个解决方案都可以解决下划线和驼峰命名的问题
11.2查询单体数据详情
mybatis里面接收参数使用#{id} 这个id要和接口方法里面的参数保持一致
1.这个#{}是mybatis里面的参数占位符,会将其替换成?,为了防止sql注入
2.还有另外一种${}也是,但是会变成参数数字,存在sql注入问题
可以在表名或者列名不固定的时候使用
查询成功的结果
但是项目里面前一天能用的代码的可能后一天不能用了,然后报以下的错误,这里上网查询解决方法是在右边的数据库重新连接一下数据库即可
设定传入参数类型(可以省略)
特殊字符处理:
当我们需要的是小于时会有如下
解决方法:
1.转义字符
比如在XML里面小于号的转义字符是 <
2.使用CDATA
将小于号写里面
11.3条件查询(将来工作上应用很多)
多条件查询
在查询的时候比如查询一个公司名称可能不知道全名这时候的可以用到模糊查询
select * from tb_brand where status=? and company_name like ? and brand_name like ?
重点:多个参数的设置方法:接口参数需要与sql语句里面的一样有下面图里面的三种
第一种:散装参数标记,使用@Param注解标记对应参数(属性名称要和对应的参数占位符名称一致)
第二种,直接把参数封装成对象,将对象进行参数传递,比如#{status}会从的brand.getstatus获取status的值
第三种:使用map集合,需要让map集合键的名称和三个参数保持一致即可
第一种
在测试时需要对参数进行模糊操作再调用方法
结果可以正常输出
第二种
需要将参数封装成对象再调用方法
第三种
使用map设定键值
下面记录查询的一种特殊情况,根据输入条件的多少查询时也要保证查询的条件没错,不然输入个空字符串就没法查了
如图
所示调整sql映射里面语句判断参数不为空才开启哪一个参数的条件查询
使用<if>标签时test属性是一个逻辑表达式
此处假如status不成立会报错因为查询会变成where and company_name,SQL语法错误
解决方案
1.加上一个恒等式,后面的都加上and
2. mybatis提供了<where>替换where关键字
单条件动态条件查询
在需要做到如下效果时就是所谓的单条件动态条件查询
@Test
public void testSelectByConditionSingle() throws IOException {
//1.获取sqlsessionfactory
//1.加载核心配置文件,获取SqlSessionFactory对象
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
//2.获取sqlsession
SqlSession sqlSession=sqlSessionFactory.openSession();
//3.获取mapper接口代理对象
BrandMapper brandMapper =sqlSession.getMapper(BrandMapper.class);
int status=1;
String companyName="华为";
String brandName="华为";
companyName ="%" +companyName+"%";
brandName ="%" +brandName+"%";
Brand brand=new Brand();
//brand.setCompanyName(companyName);
//brand.setBrandName(brandName);
brand.setStatus(status);
//4.执行方法
List<Brand> brands=brandMapper.selectByConditionSingle(brand);
System.out.println(brands);
//5.释放资源
sqlSession.close();
}
假如单选题都一个不选的话也会报错,所以使用<otherwise>
又或者使用<where>可以不加上<otherwise>
以上就是查询的所有内容
————————————————————————————
12.0 增删查改中的增
sql映射文件
与映射同名的接口方法
测试代码
但是执行过后并不会出现在数据库,需要手动commit一下或者设置自动commit,这是就是mybatis的事物问题
手动提交
自动提交
主键返回
在add的sql语句上添加两个属性
然后就能在一个已经提交了的brand对象身上获取数据库里面的主键值,不加上这两个属性直接获取主键值就是空
13修改
13.1修改全部字段
设置接口返回值为int可以返回受影响行数
13.2修改动态字段(只修改其中一部分的字段)
如果继续使用上面修改全部字段的代码去执行修改部分字段会导致有些属性被设置为null
当和如下设置一样时有两个问题
(1)当status不存在时where前面会有逗号
(2)当一个字段都不用修改时就变成set where id...
因此这里需要用到一个set标签,规避这两个问题
到这里,修改全部字段的代码就可以和修改部分字段的代码复用,做到用户传了什么数据就可以对应的修改哪一些部分的数据
14.0删除
14.1删除一个
这里删除是只需要一个id即可
14.2批量删除
本质上是传递一个数组,将数组里面的id逐个删除,这里每次需要删除的元素个数都不会一样,对应的问号占位符数量也不固定,需要用到动态sql完成删除,为此mybatis里面提供了一个<foreach>标签其中有几个不同的属性
collection:要遍历的集合或数组
item:遍历出来的每一个元素
细节:mybatis 会将数组参数封装为一个map,默认array=数组
此处要么使用array,要么就是使用@param注解改变map里面的key的名称
然后就可以在foreach里面使用ids
注意,此处 in(?,?,?)生成的(#{id} #{di} #{id})本应有逗号相隔,所以此处还要用一个属性
separator=",",用来将将其中的元素隔开
foreach的优化:
里面还有两个属性open="(",close=")",含义分别是在循环开始前放一个(到sql语句里面,结束时放一个)到sql语句里面
使用封装好的array的用法,不改变map的键值
参数传递
还还还还有一个重要知识点
如下图所示,使用当个参数有多种不同的情况,使用多个参数也要使用@Param定义名称与sql语句里面的参数占位符的名称一致
像下面这种多个参数使用@param注解的会被封装成一个map里面一个参数值会有两个不同键值,即使不加上@Param注解也可以使用这个map里面键值(在sql语句里面),就像上面那个数组作为参数那个一样可以使用默认的array(在sql语句里面)
使用@Param会替换参数在map中的键值,但是在替换过后原本的默认键名就不能使用
结论:不要使用默认的键,使用@Param规范
单个参数传递
1.POJO类,可直接使用,只需要保证属性名字和对应的参数占位符名称一致
2.Map集合,直接使用,需要键名和参数占位符名称一致
一下三种和多个参数都可以使用@Param注解,替换map集合中默认的arg键名
3.Collection,所有集合接口的祖宗,封装为map集合
map.put("arg0",collection集合);
map.put("collection",collection集合);
4.List集合:封装为map集合
map.put("arg0",list集合);
map.put("collection",lsit集合);
map.put("list",list集合);
5.Array:封装为map集合
map.put("arg0",数组);
map.put("array",数组);
6.其他类型直接使用
使用注解完成增删改查
和配置文件完成增删改查的区别就是sql语句写到了注解里面的,并且更加方便,经典白学
但是可以看见这里注解的语句不适合用于比如复杂的动态sql语句的开发
在Usermapper.XML中将原本你的select语句注释,咋在原本的接口哪里就会提示生成statement
这时就可以加上一个@Select
测试和原本基本一样