mybatis总结
目录:
基础
- MyBatis ORM 概览
- MyBatis 简介
MyBatis 架构( Java API)
- SqlSessionFactoryBuilder
- SqlSessionFactory:SqlSessionFactory 本 身 是 由 SqlSessionFactoryBuilder 创建的,它可以从 XML 配置,注解或手动配置 Java 来创建 SqlSessionFactory。
SqlSession:SqlSessions 是由 SqlSessionFactory 实例创建的。SqlSessionFactory 对 象 包 含 创 建 SqlSession 实 例 的 所 有 方 法 。
SqlSession代表和数据库的一次回话,用完必须关闭;
SqlSession和connection一样都是非线程安全。每次使用都应该去获取新的对象。String **resource** = "org/mybatis/builder/mybatis-config.xml";
InputStream **inputStream** = Resources.getResourceAsStream(resource);
SqlSessionFactoryBuilder **builder** = new SqlSessionFactoryBuilder();
SqlSessionFactory **factory** = builder.build(inputStream);
SqlSession session = factory.openSession();
- MyBatis 环境
- MyBatis 配置
- MyBatis 会话SqlSession
- MyBatis 持久化类
- MyBatis 映射文件
- MyBatis 例子
MyBatis 查询
- 模糊查询
- 多条件查询
- 分页
- 查询总数
- PageHelper :是一款犀利的Mybatis分页插件
关系
- MyBatis 一对多,使用 collection
- MyBatis 多对一,使用 association
- MyBatis 多对多,使用 中间表
- MyBatis 延迟加载
- MyBatis 动态SQL+ SQL 拼接
相关概念
- MyBatis 日志
- MyBatis 事务
MyBatis 缓存
- 一级缓存
- 二级缓存
- MyBatis C3P0连接池
- MyBatis 逆向工程
- 注解
知识点:
mybatis使用流程
- 导包
- 配置全局配置文件 mybatis-conf.xml
- 配置映射文件 mapper.xml
- 原生编程和接口式编程(目前普遍使用接口式编程)
基础(使用配置文件和使用注解实现两种方式)
- 实例:实现增删改查
- 全局配置文件详解 mybatis-conf.xml
- 映射文件详解 mapper.xml
- 关系:
一对多,使用 collection
多对一,使用 association
多对多
动态sql
- if
- where
- choose
- foreach
- bind
日志文件的使用log4j配置详解
使用步骤:- log4j的jar包导入到当前项目
在全局配置文件中开启日志
<settings>
<setting name="logImpl" value="STDOUT_LOGGING"/>
<setting name="cacheEnabled" value="true"></setting>//开启缓存
......
</settings>
- 配置日志文件log4j.properties,放在src 目录下
事务管理(支持数据库的事务管理)
SqlSession session = sqlSessionFactory.openSession();
......
session.commit();
session.close();
延迟加载:在全局配置中配置
<configuration>
<settings>
<!-- 打开延迟加载的开关 -->
<setting name="lazyLoadingEnabled" value="true" />
<!-- 将积极加载改为消息加载即按需加载 -->
<setting name="aggressiveLazyLoading" value="false"/>
</settings>
......
</configuration>
分页
第一步:在映射文件mapper.xml中的select属性中添加limint(支持mysql)
<mapper>
......
<select id="listCategory" resultType="Category">
select * from category_
<if test="start!=null and count!=null">
limit #{start},#{count}
</if>
</select>
</mapper>
为类映射接口XxxMapper.java中对应的查询方法添加参数
public interface CategoryMapper {
public List<Category> list();
public List<Category> listByPage(@Param("start") int start, @Param("count")int count);
}
测试
private static void xmlWay(SqlSession session) {
Map<String,Object> params = new HashMap<>();
params.put("start", 0);
params.put("count", 5);
List<Category> cs =session.selectList("listCategory", params);
for (Category c : cs) {
System.out.println(c);
}
}
PageHelper分页插件
使用步骤:- 第一步:导包,因为是第三方插件,所以需要额外的jar包
在全局配置文件 mybatis-config.xml 中配制插件
<configuration>
......
<plugins>
<plugin interceptor="com.github.pagehelper.PageInterceptor"></plugin>
</plugins>
</configuration>
测试:在查询操作中
- 分页查询:查询很有意思,只需要在执行查询所有的调用之前,执行一条语句即可:PageHelper.offsetPage(0, 5);这就表示查出第一页的数据,每页5条
- 获取总数:PageInfo page= new PageInfo<>(cs);
一级缓存、二级缓存(redis、encache):首先二级缓存中查询,接着在一级缓存,最后在数据库中查询
注意:使用缓存需要使pojo类实现序列化,序列化:对象将自身转化为一系列字节,记录字节的状态数据,以便再次使用。二级缓存就是将数据储存在本地,以字节的形式。- Mybatis的一级缓存在session上
Mybatis二级缓存是SessionFactory,如果两次查询基于同一个SessionFactory,那么就从二级缓存中取数据,而不用到数据库里去取了。
使用步骤,以ehcache为例:- 导入缓存包和两者整合的适配包
- 配置ehcache.properties配置文件,放在src 目录下
- 在全局配置文件中开启缓存
- 在映射文件mapper.xml 中使用自定义缓存
c3p0连接池(更健壮、更稳定)
使用步骤:- 导入jar包
写个类继承UnpooledDataSourceFactory,然后指定dataSource 为ComboPooledDataSource。
这个ComboPooledDataSource就是c3p0的数据源。public class C3P0DataSourceFactory extends UnpooledDataSourceFactory{
public C3P0DataSourceFactory(){
this.dataSource =new ComboPooledDataSource();
}
}
修改全局配置文件mybatis-conf.xml
注释掉type=”POOLED”的数据源,换成type=”org.mybatis.c3p0.C3P0DataSourceFactory”的数据源,这样就使用c3p0了。<environments default="development">
<environment id="test">
<transactionManager type="JDBC" /><!--修改type即可使用c3p0-->
<!-- 配置数据库连接信息 -->
<dataSource type="POOLED">
<property name="driver" value="${jdbc.driver}" />
<property name="url" value="${jdbc.url}" />
<property name="username" value="${jdbc.name}" />
<property name="password" value="${jdbc.password}" />
</dataSource>
</environment>
<environment id="development">
<transactionManager type="JDBC" />
<!-- 配置数据库连接信息 -->
<dataSource type="POOLED">
<property name="driver" value="${jdbc.driver}" />
<property name="url" value="${jdbc.url}" />
<property name="username" value="${jdbc.name}" />
<property name="password" value="${jdbc.password}" />
</dataSource>
</environment>
</environments>
- 测试
作为数据库连接池,无法在小规模访问里看到其效果,需要高并发才能体现出其效果,这里的测试代码只能表示正常运行,无法体现其优越性。
- 查询总数
- 逆向工程
注解:
22.详解 @MapperScan 注解和 @Mapper 注解
@Mapper 这个注解的定义如下:
@Documented @Inherited @Retention(RUNTIME) @Target({ TYPE, METHOD, FIELD, PARAMETER }) public @interface Mapper { // Interface Mapper }
@Mapper 一般我们用在接口上,代码如下:
@Mapper public interface UserDAO { @Select(“select * from user where name = #{name}“) User find(String name); @Select(“select * from user where name = #{name} and pwd = #{pwd}“) /** * 对于多个参数来说,每个参数之前都要加上@Param注解, * 要不然会找不到对应的参数进而报错 */ User login(@Param(“name”)String name, @Param(“pwd”)String pwd); }
使用 @Mapper,最终 Mybatis 会有一个拦截器,会自动的把 @Mapper 注解的接口生成动态代理类。这点可以在 MapperRegistry 类中的源代码中查看。
@Mapper 注解针对的是一个一个的类,相当于是一个一个 Mapper.xml 文件。而一个接口一个接口的使用 @Mapper,太麻烦了,于是 @MapperScan 就应用而生了。@MapperScan 配置一个或多个包路径,自动的扫描这些包路径下的类,自动的为它们生成代理类。
@SpringBootApplication @MapperScan({“com.xttblog.mapper”,”com.xttblog.dao”}) public class XttblogApp { public static void main(String[] args) { SpringApplication.run(XttblogApp.class, args); } }
当使用了 @MapperScan 注解,将会生成 MapperFactoryBean, 如果没有标注 @MapperScan 也就是没有 MapperFactoryBean 的实例,就走 @Import 里面的配置,具体可以在 AutoConfiguredMapperScannerRegistrar 和 MybatisAutoConfiguration 类中查看源代码进行分析。
例:
有@Mapper
无@Mapper
在SpringBoot中集成MyBatis,可以在mapper接口上添加@Mapper注解,将mapper注入到Spring,但是如果每一给mapper都添加@mapper注解会很麻烦,这时可以使用@MapperScan注解来扫描包。
经测试发现,@MapperScan注解只会扫描包中的接口,不会扫描类,所以可以在包中写Provider类。
@MapperScan(“com.demo.mapper”):扫描指定包中的接口 @MapperScan(“com.demo.*.mapper”):一个*代表任意字符串,但只代表一级包,比如可以扫到com.demo.aaa.mapper,不能扫到com.demo.aaa.bbb.mapper @MapperScan(“com.demo.**.mapper”):两个*代表任意个包,比如可以扫到com.demo.aaa.mapper,也可以扫到com.demo.aaa.bbb.mapper
原文地址:https://blog.csdn.net/f45056231p/article/details/83817740
还没有评论,来说两句吧...