这是小弟上黑马的MyBatis的课总结的笔记,需要的兄弟姐妹们可以拿去,不到两天就可以直接上手啦。
MyBatis开发手册中文官网:https://mybatis.org/mybatis-3/zh/getting-started.html
MyBatis是一款持久层框架,用于简化JDBC开发
JavaEE三层架构:表现层,业务层,持久层
表现层:页面展示
业务层:逻辑处理
持久层:负责数据持久化,将数据保存到数据库的一层代码
框架:一个半成品软件,是一套可以重用的、通用的软件基础代码模型,在其基础上构建软件编写更高效、规范、通用、可扩展
1.硬编码
(1)注册驱动
(2)SQL语句
2.操作繁琐
(1)手动设置参数
(2)手动封装结果集
硬编码-----》 使用配置文件
操作繁琐-----》 自动完成
1、创建user表,添加数据
2、创建模块,导入坐标
3、编写MyBatis核心配置文件-----》替换连接信息,解决硬编码问题
4、编写SQL映射文件-----》统一管理sql语句解决硬编码问题
5、编码:
(1)定义pojo类
(2)加载核心配置文件,获取SqlSessionFactory对象
(3)获取SqlSession对象,执行SQL语句
(4)释放资源
注意:logback.xml、mybatis-config.xml、xxxMapper.xml需要放在resources文件夹下面
写在pom.xml文件里
org.mybatis
mybatis
3.5.9
mysql
mysql-connector-java
8.0.28
junit
junit
3.8.2
test
org.slf4j
jcl-over-slf4j
1.5.6
ch.qos.logback
logback-classic
1.4.5
ch.qos.logback
logback-core
1.4.5
打印日志时需要,不需要日志可以不用
文件名:logback.xml
%d{HH:mm:ss.SSS} [%thread] %-5level%logger{36} -%msg%n
文件名:mybatis-config.xml(一般都为这个)
文件名:xxxMapper.xml,xxx根据结果集封装到的pojo而定,如这里的是UserMapper.xml
select*fromuser;
publicclassMyBatisDemo {
publicstaticvoidmain(String[] args) throwsIOException {
//1.加载mybatis的核心配置文件,获取SqlSessionFactory
Stringresource="mybatis-config.xml";
InputStreaminputStream=Resources.getResourceAsStream(resource);
SqlSessionFactorysqlSessionFactory=newSqlSessionFactoryBuilder().build(inputStream);
//2、获取对象,用它来执行sql
SqlSessionsqlSession=sqlSessionFactory.openSession();
//3、执行sql
List
1、定义与sql映射文件同名的Mapper接口,并将Mapper接口和SQL映射文件放置在同一目录下
(在resources目录下建mapper目录,要和mapper接口所在目录同名,即com.mapper,但是在resources目录下建时,要为com/mapper,否者编译后会文件名为一长串的com.mapper,而非mapper)
2、设置sql映射文件的namespace属性为Mapper接口全限定名
select*
fromuser;
3、在Mapper接口中定义方法,方法名就是SQL映射文件中sql语句的id,并保持参数类型和返回值类型一致
publicinterfaceUserMapper {
ListselectAll();
}
4、编码:
(1)通过 SqlSession 的 getMapper 方法获取 Mapper接口的代理对象
(2)调用对应方法完成sql的执行
//3、执行sql
//List
细节:若Mapper接口名称和SQL映射文件名称相同,并在同一目录下,则可以使用包扫描的方式简化SQL映射文件的加载
设置各个标签时,需要遵守前后循序(如上图)
使用类型别名后,xxxMapper.xml文件如下:
1. 建好brand数据库表
2. 在pojo包下建好Brand类
3. 建brandMapper接口
4. 建brandMapper.xml
5. 在test包下,建立测试类
6. 安装mybatisX插件
1.编写接口方法:Mapper接口
参数:无
结果:List
2.编写SQL语句:SQL映射文件
3.执行方法,测试
brandMapper.xml文件如下:
1.编写接口方法:Mapper接口
参数:id
结果:Brand
2.编写SQL语句:SQL映射文件
3.执行方法,测试
brandMapper.xml文件如下:
1.编写接口方法:Mapper接口
参数:所有查询条件
结果:List
2.编写SQL语句:SQL映射文件
3.执行方法,测试
接口方法:
/*
条件查询:
参数接收:
1. 散装参数:若方法中有多个参数,需要使用@Param("SQL参数占位符名称")
2. 对象参数:对象属性名称要和参数占位符名称一致
3. map集合参数:
*/
List selectByCondition(@Param("status")int status,@Param("companyName")String companyName,@Param("brandName")String brandName);
List selectByCondition02(Brand brand);
List selectByCondition03(Map map);
对应SQL映射文件主要代码:
对应测试方法:
@Test
public void testSelectByCondition() throws IOException {
int status = 1;
String companyName = "葡萄";
String brandName = "葡萄";
//处理参数
companyName = "%"+companyName+"%";
brandName = "%"+brandName+"%";
Brand brand = new Brand();
brand.setStatus(status);
brand.setCompanyName(companyName);
brand.setBrandName(brandName);
Map map = new HashMap();
map.put("status",status);
map.put("companyName",companyName);
map.put("brandName",brandName);
//1.加载mybatis的核心配置文件,获取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);
//4.执行方法
// List brandList = brandMapper.selectByCondition(status, companyName, brandName);
// List brandList = brandMapper.selectByCondition02(brand);
List brandList = brandMapper.selectByCondition03(map);
System.out.println(brandList);
//5.释放资源
sqlSession.close();
}
上面写法有缺陷,如果条件为空,则查不出正确的信息,故需要使用动态sql,实现动态条件查询
对应SQL映射文件主要代码:
对应SQL映射文件主要代码:
1.编写接口方法:Mapper接口
参数:除id外的所有数据
结果:void 或 int
2.编写SQL语句:SQL映射文件
3.执行方法,测试
对应部分SQL映射文件代码:
insert into brand (brand_name,company_name,ordered,description,status)
values (#{brandName},#{companyName},#{ordered},#{description},#{status});
openSession():默认开启事务,进行增删改操作后需要使用sqlSession.commit();手动提交事务
openSession(true):可以设置为自动提交事务(或关闭事务)
添加数据成功后,获取插入数据库数据的主键的值
设置:
1.编写接口方法:Mapper接口
参数:所有数据
结果:void或int
2.编写SQL语句:SQL映射文件
3.执行方法,测试
对应部分SQL映射文件代码:
update brand
set brand_name = #{brandName},
company_name = #{companyName},
ordered = #{ordered},
description = #{description},
status = #{status}
where id = #{id};
对应部分SQL映射文件代码:
单独使用
update brand
brand_name = #{brandName},
company_name = #{companyName},
ordered = #{ordered},
description = #{description},
status = #{status}
where id = #{id};
1.编写接口方法:Mapper接口
参数:id
结果:void或int
2.编写SQL语句:SQL映射文件
3.执行方法,测试
对应部分SQL映射文件代码:
delete from brand
where id = #{id};
1.编写接口方法:Mapper接口
参数:id数组
结果:void或int
2.编写SQL语句:SQL映射文件
3.执行方法,测试
对应部分SQL映射文件代码:
delete from brand
where id
in
#{id}
;
在xxxMapper接口文件写,如:
@Select("select * from brand where id = #{id}")
Brand selectById(int id);
插入、修改、删除操作同理
但是注解只能进行简单的sql操作,一旦sql语句里面涉及到例如动态sql时,就会显得力不从心
故当要完成简单的功能,可以用注解写sql语句;但要完成较复杂的功能,则用配置文件写sql语句