mybatis学习笔记
mybatis
一个基于mybatis框架的maven项目大致过程
1 写工具类 xxxUtils utils包 需要一个resource配置文件 去maven项目目录下resources 写一个mabatis-config.xml配置文件
2 写实体类 pojo包
3 写接口 Interface dao包 和 xxxmapper.xml 配置文件(有数据库执行语句)
4 写测试类
5 前提 配置maven pom.xml 相关依赖
mybatis依赖
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.2</version>
</dependency>
sql依赖 (mysql)
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.46</version>
</dependency>
junit依赖
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.2</version>
<scope>test</scope>
</dependency>
pom配置出现问题可能用得上
<resources>
<resource>
<directory>src/main/resources</directory>
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
<filtering>true</filtering>
</resource>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
<filtering>true</filtering>
</resource>
</resources>
增删改查基本操作
1编写接口
2编写对应mapper中的sql语句
id 为对应namespace中的方法名 resultType 为sql语句执行的返回值 parameterType为参数类型
3测试
注意增删改需要提交事务 sqlsession.commit();
万能map
假设我们的实体类,或者数据库中的表,字段或者参数过多,我们应当考虑使用Map。
map传递参数 直接在sql中取出key即可
对象传递参数,直接在sql中取对象的属性即可
多个参数用map,或者注解
模糊查询
java代码执行的时候,传递通配符 % %
在sql拼接中使用通配符
配置解析
1 核心配置文件
mybatis-config.xml
掌握 properties settings typeAliases
environments mappers
2 配置环境
Mybatis 可以适配成多个环境
但每个SqlSessionFactory实例只能选择一种环境
Mybatis 默认的事务管理器就是jdbc 连接池pooled
3 属性 properties
编写一个配置文件(db.properties)
driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/mall?useSSL=true&useUnicode=true&characterEncodeing=UTF-8
username=root
password=199908
在核心配置文件中映入(在所有xml中,所有的标签都可以规定其顺序)
<properties resource="db.properties">
<property name="username" value="root"/>
<property name="password" value="199908"/>
</properties>
可以直接引入外部文件
可以加一些属性配置
如果两个文件有同一个字段,优先使用外部配置文件的
4 类型别名 typeAliases
类型别名是为java类设置一个短的名字
存在的意义仅在于用来减少类完全限定名的冗余
<typeAliases>
<typeAlias type="com.qlu.pojo.User" alias="User"/>
</typeAliases>
也可以指定一个包名,Mybatis会在包名下面搜索需要的java bean,比如扫描实体类的包。他的默认别名就为这个类的类名,首字母小写。
在实体类比较少的时候用第一种
第一种可以diy别名,第二种不行 ,如果非要改,需要在实习类上增加注解。
5 设置 settings
6 映射器 mappers
方式一 推荐
<!-- 使用相对于类路径的资源引用 --><mappers>
<mapper resource="org/mybatis/builder/AuthorMapper.xml"/>
<mapper resource="org/mybatis/builder/BlogMapper.xml"/>
<mapper resource="org/mybatis/builder/PostMapper.xml"/></mappers>
方式二 使用class文件绑定注册
<!-- 使用映射器接口实现类的完全限定类名 --><mappers>
<mapper class="org.mybatis.builder.AuthorMapper"/>
<mapper class="org.mybatis.builder.BlogMapper"/>
<mapper class="org.mybatis.builder.PostMapper"/></mappers>
注意点 接口和他的Mapper配置文件必须同名
接口和它的Mapper配置文件必须在同一个包下,规范化
方式三 使用扫描包进行注入绑定
<mappers>
<package name="com.qlu.dao"/></mappers>
7 生命周期和作用域
SqlSessionFactory
一旦创建了SqlSessionFactory 就不再需要他了
局部变量
SqlSessionFactory
可以理解为 数据库连接池
SqlSessionFactory 一旦被创建就应该在应用的运行期间一直存在,没有任何理由丢弃它或重新创建另一个实例。 因此 SqlSessionFactory 的最佳作用域是应用作用域。
最简单的就是使用单例模式 或者静态单例模式
SqlSession
连接到连接池的一个请求
SqlSession 的实例不是线程安全的,因此是不能被共享的,所以它的最佳的作用域是请求或方法作用域。
分页
SELECT * from user limit 0,4;
从第0个开始,每页显示两个
使用mybatis实现分页,核心SQL(limit)
Rowbounds 分页 利用java代码实现分页
1.接口
2.mapper.xml
3.测试
分页插件 PageHelper
使用注解开发
面向接口编程
注解开发不适用于过于复杂的sql语句
使用注解时需要在核心配置文件中绑定接口
测试:本质是反射机制 底层:动态管理
mybatis 详细执行流程
CRUD
我们可以在工具类utils创建的时候实现自动提交事务
public static sqlSession getsqlSession(){
return sqlSessionFactory.openSession(true);
}
编写接口,增加注解
测试
我们必须要把接口注册绑定到核心配置文件
关于@param注解(以后回顾)
Lombok使用
1.在idea中安装Lombok插件
2.在项目中导入lombok的包
3.加注解实现某些方法
例如@Data 自动生成 无参构造 get set方法 toString,hashcode,equals
复杂查询环境搭建
一对多,多对一关系(集合与关联)
外键
测试环境搭建
1.导入lombok
2.新建实体类
3.建立mapper接口
4.建立mapper.xml文件
5.在核心配置文件中绑定注册我们的Mapper接口或者文件
6.测试查询能否成功
mysql 多对一查询方式结果集映射resultMap<> association(关联) 子查询 联表查询
一对多处理 结果集映射resultMap<> collection(集合)
javaType 用来指定实体类中属性的类型
ofType 用来指定映射到List或者集合中的pojo类型,泛型中的约束类型
按照结果嵌套处理
按照查询嵌套处理
注意:保证SQL的可读性,尽量保证通俗易懂
注意一对多,多对一中,属性和字段的问题
排查错误 建议用log4j
面试高频 mysql引擎
InnoDB底层原理
索引 索引优化
动态SQL
动态sql就是根据不同的条件生成不同的sql语句
sql拼接 重要
缓存
一级缓存 sqlsession
二级缓存
缓存原理
自定义缓存 ehcache