mybatis框架
mybatis框架
ps:mybits->mybatis->本人以前未在意 后续才发现一直拼错了

Mybits
了解mybits
“MyBatis” 是一个用于 Java 的持久层框架,它简化了数据库访问的过程。其主要作用包括:
- 简化数据库操作:MyBatis 可以通过 XML 或注解的方式,将 SQL 语句直接写在代码中,避免了使用传统 JDBC 时需要编写大量重复的代码,使得数据库操作更加简洁。
- 灵活的 SQL 映射:MyBatis 允许开发人员编写自定义的 SQL 语句,然后将其与 Java 对象映射。这种方式提供了高度的灵活性,特别适用于复杂的查询操作。
- 自动映射结果集:MyBatis 能够将 SQL 查询的结果集自动映射到 Java 对象中,这样开发者不需要手动解析 ResultSet,大大简化了开发过程。
- 动态 SQL 支持:MyBatis 提供了一种动态 SQL 的能力,通过标签(如
<if>,<choose>等)来生成动态 SQL 语句,满足各种复杂的查询需求。MyBatis 可以进行数据库操作的原因是,它封装了 JDBC 操作,将 SQL 查询的执行与结果的处理自动化,并且与 Java 应用程序的对象模型无缝集成。这使得开发人员可以专注于业务逻辑,而不需要关心底层的数据库操作细节。
mybits原理

MyBatis 配置文件:
SqlMapConfig.xml是 MyBatis 的全局配置文件,用于配置 MyBatis 的运行环境等信息。mapper.xml是用于 SQL 语句和对象映射的文件,这些文件配置了操作数据库的 SQL 语句,需要在SqlMapConfig.xml中加载这些文件。
通过 MyBatis 环境配置创建 SqlSessionFactory(会话工厂):
- 通过 MyBatis 的环境配置信息构造一个
SqlSessionFactory,它用于创建会话(SqlSession)实例。
会话(SqlSession)的作用:
- 由会话工厂创建的
SqlSession用于执行数据库操作,开发者在代码中使用SqlSession对象来执行 SQL 语句。
Executor 执行器:
- MyBatis 底层定义了
Executor执行器接口,负责接收并执行 SQL 语句,有两个实现:一个是批量执行器(Batch Executor),一个是缓存执行器(Caching Executor)。
Mapped Statement:-mapper
Mapped Statement是 MyBatis 底层封装的对象,包含了 MyBatis 配置信息、SQL 映射信息等。- 在
mapper.xml文件中,每个 SQL 语句对应一个Mapped Statement对象,SQL 的id对应 Mapped Statement 的id。
输入参数映射:
Mapped Statement对 SQL 执行输入参数进行定义,包括HashMap、基本类型、POJO(普通的 Java 对象)。Executor通过Mapped Statement在执行 SQL 前将输入的 Java 对象映射为 SQL 中的参数,类似于 JDBC 编程中PreparedStatement的设定参数的过程。
输出结果映射:
Mapped Statement对 SQL 执行输出结果进行定义,包括HashMap、基本类型、POJO。Executor通过Mapped Statement在执行 SQL 后将输出结果映射至 Java 对象,类似于 JDBC 编程中结果集(ResultSet)的解析处理过程。
Mybits入门
1.mybits使用
1.创建工程
2.导入依赖
3.创建配置文件
以下是一个 MyBatis 使用案例,包括配置文件 mybatis-config.xml、映射文件 UserMapper.xml、实体类 User、映射接口 UserMapper,以及一个使用 MyBatis 的示例代码。
1 | |
映射文件 UserMapper.xml
这个文件包含 SQL 语句和 Java 方法的映射。
1 | |
映射接口 UserMapper
1 | |
使用
1 | |
流程
配置加载:读取 MyBatis 配置文件,初始化 SqlSessionFactory。
会话创建:通过 SqlSessionFactory 创建 SqlSession,作为数据库操作的会话
Mapper 映射:获取映射接口(Mapper)的代理对象,映射接口方法与 SQL 语句对应。
通过
SqlSession实例的getMapper(UserMapper.class)方法,获取UserMapper映射接口的代理对象。MyBatis 底层会根据
UserMapper.xml映射文件中定义的 SQL 语句和UserMapper接口中的方法进行绑定。
执行 SQL:使用 Executor 执行映射 SQL 语句,对数据库进行 CRUD 操作。
参数映射:在执行 SQL 前,将输入参数映射到 SQL 语句中;执行 SQL 后,将结果集映射为 Java 对象。
事务控制:通过 SqlSession 的 commit() 和 rollback() 控制事务。
会话关闭:操作完成后,关闭 SqlSession,释放资源。
2.占位符
1 | |
#{} 实现向占位符添加值-自动进行java类型和jdbc类型转换-可以防止sql注入-可接收简单类型值和pojo属性值
¥s{}拼接sql传=不进行类型转换=
3.parameterType-resultType
parameterType-传入的参数类型
resultType返回值类型
4..selectOne和selectList
selectOne查询一条记录
selectList查询多条记录
5.mybits-主键

使用
SqlSession.insert(“test.insertUser”,user);
selectkey->select Last_INSERT_ID–用户添加后自动返回主键-
—返回主键
uuid生成主键

6.mybits-删除

sqlSession.delete(“test.deleteUser”,39);
7.mybiits->更新用户

sqlSession.update(“test.updateUser”,user);
mybits-Dao开发
1.Dao开发配置入门
Impl层
前言
1 | |
多个请求 都会创建 SqlSessionFactory SqlSessionFactoryBuilder-影响资源

SqlSessionFactoryBuilder 只是一个构建器,它的生命周期是短暂的,只需在创建 SqlSessionFactory 时使用一次。创建好 SqlSessionFactory 后,就不需要再保留 SqlSessionFactoryBuilder 实例。


解决多次创建后代码–bean-单例bena实现 -如图还未bean 也就是简单的单例模式


dao层面-有非常多的重复代码-比如释放资源-拿取selSession-
2.Mapper开发
mapper代理方法(程序员只需要mapper接口)
程序员编写mapper接口需要遵循一些开发规范,mybatis可以自动生成mapper接口实现类代理对象。

需要一一对应进行映射
也就是mapper-函数映射到xml文件中–需要进行一一对应
3.mapper代理
xml定义


加载


—如图–userMapper-来调用方法0由sqlSession-来生成代理对象
代理对象内部调用selectOne或selectList
如果mapper方法返回单个pojo对象(非集合对象),代理对象内部通过selectOne查询数据库。
如果mapper方法返回集合对象,代理对象内部通过selectList查询数据库
mapper接口方法参数只能有一个,系统是否不利于扩展维护。
系统 框架中,dao层的代码是被业务层公用的。
即使mapper接口只有一个参数,可以使用包装类型的pojo满足不同的业务方法的需求。
注意:持久层方法的参数可以包装类型、map。。。,service方法中建议不要使用包装类型(不利于业务层的可扩展)。
4.l配置
SqlMapConfig.xm

properties属性
将数据库连接参数只配置在db.properties中,原因:方便对参数进行统一管理,其它xml可以引用该db.properties


settings全局参数配置


类型
类型别名(Type Alias)是为了简化和减少 XML 配置文件中的类全限定名而引入的一种便捷方式。通过定义类型别名,你可以使用更短的名称来引用 Java 类,从而使得 Mapper XML 文件更简洁和易读。
定义类型别名:在 MyBatis 配置文件 (
mybatis-config.xml) 中,可以为 Java 类指定一个别名。使用类型别名:在 Mapper XML 文件中使用别名来代替类的全限定名。
1.普通类型别名
如果在指定类型时输入类型全路径,不方便进行开发,可以针对parameterType或resultType指定的类型定义一些别名,在mapper.xml中通过别名定义,方便开发。
自定义别名-当我们参数的pojo大部分一致的时候 定义别名可以减少代码繁杂


批量别名-常用-扫描po文件 给所有pojo注册别名
3.mybits 类型处理器
在 MyBatis 中,类型处理器(Type Handlers) 用于处理 Java 类型与 JDBC 类型之间的转换。它们在 MyBatis 从数据库中读取数据(结果集映射)或将数据写入数据库(参数映射)时起着关键作用。
例子Java 类型到 JDBC 类型的转换:将 Java 对象类型转换为 SQL 参数,发送到数据库。例如,将
Integer类型的 Java 对象转换为数据库的INTEGER类型。JDBC 类型到 Java 类型的转换:将从数据库查询的结果转换为 Java 对象。例如,将数据库查询结果中的
INTEGER类型转换为 Java 的Integer或int。
4. mappers 映射配置
通过resource加载单个映射文件

通过mapper接口加载单个mapper

按照上边的规范,将mapper.java和mapper.xml放在一个目录 ,且同名

3 . 批量加载mapper(推荐使用)

4.输入映射
通过parameterType指定输入参数的类型,类型可以是简单类型、hashmap、pojo的包装类型
总结



Mybits高级

1.一对一查询
查询订单信息,关联查询创建订单的用户信息
sql语句
select orders.*, USER.username,
USER.sex,
USER.address FROM ORDERS,USER WHRE ORDERS.USER_ID=USER.ID;
select orders.*, USER.username,
USER.sex,
USER.address FROM ORDERS JOIN USER ON ORDERS.USER_ID=USER.ID;
实现该查询
1.创建pojo
2.mapper
1 | |
3.mapper.java

这个时候-只需要获取即可使用该sql语句
– 使用resultMap映射的思路
使用resultMap将查询结果中的订单信息映射到Orders对象中,在orders类中添加User属性,将关联查询出来的用户信息映射到orders对象中的user属性中。

定义resultMap

S定义


2.一对多查询
查询订单及订单明细的信息。
SELECT
orders.*,
USER.username,
USER.sex,
USER.address,
orderdetail.id orderdetail_id,
orderdetail.items_id,
orderdetail.items_num,
orderdetail.orders_id
from
orders,
USER,
orderdetail
whrer
orders.user_id = user.id AND orderdetail.orders_id=orders.id
使用resultType将上边的 查询结果映射到pojo中,订单信息的就是重复
要求:
对orders映射不能出现重复记录。



map->映射关系
将数据库字段->对象的字段中
同时会指定映射的属性和集合中


3.多对多查询案例
查询主表是:用户表
关联表:由于用户和商品没有直接关联,通过订单和订单明细进行关联,所以关联表:
orders、orderdetail、items

映射



resultmap总结

延迟加载
如果查询两张表-如果只需要查询一张表即可满足条件的情况下-那么就不需要查询下一章表
关联查询->单表查询
1.使用association实现延迟加载
查询订单并且关联查询用户信息
案例

1 | |


也就是-我们编译器没有访问到user内容就不会去加载吗 2.延迟加载配置
mybits默认没有开启延迟加载-需要自己手动开启
3.

缓存
1.一级缓存
第一层查询-如果没有-从数据库查 再添加进缓存中
sqlSession去执行增删改-清空一级缓存
2次发起->缓存有直接返回
redis缓存思路
mybits默认支持一级缓存
Sqlsession sqlsession=sqlsessionfactry.ioensession();
UserMapper userMapper=sqlsession.getMapper(usermapper.class);
User user=usermapper.finduserbyid(1);第一层查询-如果没有-从数据库查 再添加进缓存中
User user=usermapper.finduserbyid(1); 2次发起->缓存有直接返回
usermapper.updateuser(user1);sqlSession去执行增删改-清空一级缓存
一级缓存应用

2.2级缓存

二级缓存范围大-多个sqlsession可以共享一个usermapper二级缓存区域
二级缓存区域是按照namespace分-其他不同的mapper也有自己的二级缓存区域
一个namespace的mapper都有一个二缓存区域,两个mapper的namespace如果相同,这两个mapper执行sql查询到数据将存在相同 的二级缓存区域中。
开启二级缓存
mybaits的二级缓存是mapper范围级别,除了在SqlMapConfig.xml设置二级缓存的总开关,还要在具体的mapper.xml中开启二级缓存。

mybits整合ehcache
mybits整合ehcache
ehcache是一个分布式缓存框架
缓存的数据-进行集中管理-分布式集中访问 整合方法
mybatis提供了一个cache接口,如果要实现自己的缓存逻辑,实现cache接口开发即可。
mybatis和ehcache整合,mybatis和ehcache整合包中提供了一个cache接口的实现类。
ehcache配置

二级应用场景

Mybits整合Spring
1.bean配置

bean的配置
user.xml




以上bean去读xml配置
然后mybits去注册 在接口实现类进行查询
之后注册为bean
后续直接使用
2.mapper
还是要在同级目录以下
注册为bean 扫描xml文件

