我是靠谱客的博主 自由小蜜蜂,最近开发中收集的这篇文章主要介绍我的Mybatis学习笔记第一阶段模块一Mybatis,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

第一阶段模块一Mybatis

第一部分 自定义持久层框架

1.1、JDBC


Connection connection = null;
PreparedStatement preparedStatement = null;
ResultSet resultSet = null;
try {
//加载数据库驱动
Class.forName("com.mysql.jdbc.Driver");
connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/dqy_mybatis", "root", "123456");
String sql = "select * from user where username = ?";
preparedStatement = connection.prepareStatement(sql);
preparedStatement.setString(1, "lili");
resultSet = preparedStatement.executeQuery();
while (resultSet.next()) {
int id = resultSet.getInt("id");
String username = resultSet.getString(" username");
User user = new User();
user.setId(id);
user.setUsername(username);
System.out.println(user);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
if (resultSet != null) {
try {
resultSet.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (preparedStatement != null) {
try {
preparedStatement.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (connection != null) {
try {
connection.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}

1.2、存在问题

  1. 频繁创建释放连接浪费资源:使用连接池
  2. 存在硬编码:使用配置文件
  3. 结果集封装:反射、内省

1.3、自定义框架设计

1.读取配置文件

​ 1)Configuration:存放数据库基本信息、Map<唯一标识,Mapper>唯一标识:namespace+"."+id

​ 2)MappedStatement: sql语句、statement类型、输入参数Java类型、输出参数Java类型

2解析配置文件

创建Sq!SessionFactroyBuilder类:
方法:SqlSessionFactory build():
第一:使用dom4j解析配置文件, 将解析出来的内容封装到Configuration和MappedStatement中
第二:创建SqlSessionFactory的实现类DefaultSqlSession

3.创建Sq!SessionFactory:

方法:openSession():获取sqlSession接口的实现类实例对象

4.创建SqlSession接口及实现类:主要封装CRUD方法

方法:selectlist(String Statementld,O问ect param):查询所有
selectOne(String Statementld,。同ect param):查询单个
close()释放资源
具体实现:封装JDBC完成对数据库表的查询操作

5.设计到的设计模式

构建者模式、工厂模式、代理模式

第二部分 Mybatis相关概念

2.1对象/关系数据库映射{ORM)

ORM全称Object/Relation Mapping:表示对象-关系映射的缩写

2.2 MyBatis优势

MyBatis是一 个半自动化的持久化层框架。 对开发人员而言, 核心sql还是需要自己优化, sql和
java 编码分开, 功能边界清晰, 一 个专洼业务、 一 个专洼数据。

第三部分 Mybatis基本应用

3.1快速入门

1.MyBatis开发步骤:

①添加MyBatis的坐标
②创建user数据表
③编写User实体类
④编写映射文件UserMapper.xml
⑤编写核心文件均IMapConfig.xmI
⑥编写测试类

2.MyBatis常用配置解析

1)environments标签

数据库环境的配置 ,支持多环境配置

<environments default="development">
<environment id="development">
<transactionManager type="JDBC"></transactionManager>
<dataSource type="POOLED">
<property name="driver" value="${jdbc.driver}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</dataSource>
</environment>
</environments>

2)mapper标签

<mappers>
<mapper resource="UserMapper.xml"></mapper>
</mappers>

该标签的作用是加载映射的,加载方式有如下几种:
·使用 捆对于关路径的资源引用
·使用完全限定资源定位符(URL)
·使用映射器接口实现类的完全限定美名
·将包内的映射器接口实现全部注册为映射器

3.2代理开发方式介绍

采用Mybatis的代理开发方式实现DAO层的开发
Mapper接口开发方法只需要程序员编写Mapper接口, 由Mybatis框架根据接口,定义创建接口的动态代理对象,Mapper接口开发需要遵循以下规范:

  1. Mapper.xml文件中的namespace与『napper接口的全限定名相同
  2. Mapper接口方法名和Mapper.xml中定义的每个statement的id相同
  3. Mapper接口万法的输入参数类型和『napper.xml中定义的每个sql的parameterType的类型相同
  4. Mapper接口方法的输出参数类型和『napper.xml申定义的每个sql的resultType的类型相同

第四部分 Mybatis配置文件深入

4.1 SqlMapConfig.xml

1.Properties标签
习惯将数据源的配置信息单独抽取成一个properties文件, 该标签可以加载额外配置的properties文件

<properties resource="jdbc.properties"></properties>

2.typeAliases标签

<typeAliases>
<package name="com.dqy.pojo"/>
</typeAliases>

4.2 mapper.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.dqy.dao.UserDao">
<sql id="selectUser">
select * from user
</sql>
</mapper>

第五部分Mybatis复杂映射开发

5.1 一对一宣询

配置OrderMapper.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.dqy.mapper.IOrderMapper">
<resultMap id="orderMap" type="com.dqy.pojo.Order">
<result property="id" column="id"></result>
<result property="orderTime" column="orderTime"></result>
<result property="total" column="total"></result>
<association property="user" javaType="com.dqy.pojo.User">
<result property="id" column="uid"></result>
<result property="username" column="username"></result>
<result property="password" column="password"></result>
<result property="birthday" column="birthday"></result>
</association>
</resultMap>
<select id="findOrderAndUser1" resultMap="orderMap">
SELECT * FROM orders o,user u where u.id=o.uid
</select>
</mapper>

5.2 一对多查询

配置UserMapper.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.dqy.mapper.IUserMapper">
<resultMap id="userMap" type="com.dqy.pojo.User">
<result property="id" column="uid"></result>
<result property="username" column="username"></result>
<result property="password" column="password"></result>
<result property="birthday" column="birthday"></result>
<collection property="user" ofType="com.dqy.pojo.Order">
<result property="id" column="uid"></result>
<result property="orderTime" column="orderTime"></result>
<result property="total" column="total"></result>
</collection>
</resultMap>
<select id="findAll" resultMap="userMap">
SELECT * FROM user o left join order u on u.id=o.uid
</select>
</mapper>

5.3 多对多窒询

配置UserMapper.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.dqy.mapper.IUserMapper">
<resultMap id="userMap" type="com.dqy.pojo.User">
<result property="id" column="uid"></result>
<result property="username" column="username"></result>
<result property="password" column="password"></result>
<result property="birthday" column="birthday"></result>
<collection property="user" ofType="com.dqy.pojo.Order">
<result property="id" column="uid"></result>
<result property="orderTime" column="orderTime"></result>
<result property="total" column="total"></result>
</collection>
</resultMap>
<select id="findAll" resultMap="userMap">
SELECT * FROM user o left join order u on u.id=o.uid
</select>
<resultMap id="userRoleMap" type="com.dqy.pojo.User">
<result property="id" column="userid"></result>
<result property="username" column="username"></result>
<result property="password" column="password"></result>
<result property="birthday" column="birthday"></result>
<collection property="roles" ofType="com.dqy.pojo.Role">
<result property="id" column="roleid"></result>
<result property="rolename" column="rolename"></result>
<result property="roleDesc" column="roleDesc"></result>
</collection>
</resultMap>
<select id="findAllUserAndRole" resultMap="userRoleMap">
SELECT * FROM `user` u left join sys_user_role ur on u.id=ur.userid
left join sys_role r on ur.roleid=r.id
</select>
</mapper>

第六部分 Mybatis注解开发

6.1 MyBatis的常用注解

@Insert:实现新增
@Update:实现更新
@Delete:实现删除
@Select:实现查询
@Result:实现结果集封装
@Results:可以与@Result 一起使用, 封装多个结果集
@One:实现一对一结果集封装
@Many:实现一对多结果集到装

6.2 MyBatis注解实现复杂映射开发

注解说明
@Results代替的是标签该注解中可以使用单个@Result注解,也可以使用@Result集合。使用格式: @Results ({@Result (),@Result () }) 或@Results (@Result () )
@Result代替了标签和标签 @Result中属性介绍: column:数据库的列名 property:需要装配的属性名 one:需要使用的@One注解(@Results (one=@One)) many:需要使用的Many注解 (@Results (many=@many))

6.3 一对一查询的语句

public interface IOrderMapper {
@Results({
@Result(property = "id",column = "id"),
@Result(property = "orderTime",column = "orderTime"),
@Result(property = "total",column = "total"),
@Result(property = "user",column = "uid",
javaType =
User.class,
one=@One(select = "com.dqy.mapper.IUserMapper.findUserById"))
})
@Select("select * from orders")
List<Order> findOrderAndUser();
@Select("select * from orders where uid=#{uid}")
List<Order> findOrderByUid(Integer uid);
}

6.4 一对多查询的语句


@Results({
@Result(property = "id",column = "id"),
@Result(property = "username",column = "username"),
@Result(property = "password",column = "password"),
@Result(property = "birthday",column = "birthday"),
@Result(property = "orderList",column = "id",
javaType = List.class,
many = @Many(select = "com.dqy.mapper.IOrderMapper.findOrderByUid")
)
})
@Select("select * from user")

6.5多对多查询


@Select("select * from user ")
@Results({
@Result(property = "id",column = "id"),
@Result(property = "username",column = "username"),
@Result(property = "password",column = "password"),
@Result(property = "birthday",column = "birthday"),
@Result(property = "roleList",column = "id",
javaType = List.class,
many = @Many(select = "com.dqy.mapper.IRoleMapper.findRoleByUid")
)
})

第七部分Mybatis缓存

7.1缓存介绍

一级缓存是SqlSession级别的缓存。在操作数据库时需要构造sqlSession对象, 在对象中有一个数 据结构(HashMap)用于存储缓存数据。 不同的sqlSession之间的缓存数据区域(HashMap)是互相 不影晌的。

二级缓存是基于 mapper文件的 namespace的,多个sqlSession可以共享一个mapper中的二级缓存区域, 并且如果两个mapper的 namespace 相同, 那么这两个mapper中执行 sql 查询到的数据也将存在相同的二级缓存区域中。

7.2开启二级缓存


<settings>
<setting name="cacheEnabled" value="true" />
</settings>

7.3useCache和flushCache

userCache是用来设置是否禁用二级缓存的, 在statement中设置useCache=false可以禁用当前select语句的二级缓存, 默认情况是true。

flushCache默认情况下为true, 刷新缓存

7.4整合redis

redis.properties

redis.host=localhost
redis.port=6379
redis.connectionTimeout=5000
redis.password=
redis.database=0

第八部分 Mybatis插件

8.1四大组件

Executor̵、StatementHandler̵、ParameterHandler̵、ResultSetHandler

8.2mybatis拦截方法

1、执行器Executor(update̵、query、commit、rollback)

2、SQL构造器StatementHandler(prepare、parameterize、batch̵、update、query)

3、ParameterHandler(getParameterObject、setParameters)

4、结果集处理器ResultSetHandler(handleResultSets、handleOutputParameters)

8.3插件原理

在四大对象创建的时候

1、 每个创建出来的对象不是直接返回的, 而是interceptorChain.pluginAII(parameterHandler);

2、 获取到所有的Interceptor (拦截器) {插件需要实现的接口);调用 interceptor.plugin(target);返回target包装后的对象;

8.4自定义插件

@Intercepts({
@Signature(type = StatementHandler.class,
method = "prepare",
args = {Connection.class,Integer.class})
})
public class MyPlugin implements Interceptor {
public Object intercept(Invocation invocation) throws Throwable {
System.out.println("对此方法进行了增强。。。。。。。。。。");
return invocation.proceed();
}
public Object plugin(Object target) {
Object wrap = Plugin.wrap(target, this);
return wrap;
}
public void setProperties(Properties properties) {
System.out.println("获取到的配置文件参数"+properties);
}
}

8.5插件执行逻辑

Plugin实现了InvocationHandler接口,因此它的invoke方法会拦截所有的方法调用。invoke方法会对所拦截的方法进行检测,以决定是否执行插件逻辑。

第九部分 Mybatis架构原理

9.1Mybatis的功能架构

1.API接口层:提供给外部使用的接口API, 开发人员通过这些本地API来j黠IA数据库。接口层一接收到 调用请求就会调用数据处理层来完成具体的数据处理 。

2.数据处理层:负责具体的SQL查找、 SQL解析、 SQL执行和执行结果映射处理等。

3.基础支撑层:负责最基础的功能支撑 , 包括连接管理 、 事务管理、 配置加载平时爱存处理, 这些都是共用的东西,将他们抽取出来作为最基础的组件。

9.2主要构件及其相互关系

构件描述
SqlSession作为MyBatis工作的主要顶层API, 表示和数据库交互的会话, 完成必要 数
Executor负责SQL语句的生成和查询缓
StatementHandler封装了JDBC Statement操作
ParameterHandler对用户传递的参数转换成JDBC Statement 所需要的参数
ResultSetHandler将JDBC返回的ResultSet结果集对象转换成List类型的集合
TypeHandlerjava数据类型和jdbc数据类型之间的映射和转换
MappedStatement维护了 一条<select I updateI deleteI insert>节点的封装
SqlSource根据用户传递的parameterObject, 动态地生成 SQL语句 , 将信息封
BoundSql表示动态生成的SQL语句以及相应的参数信息

9.3总体流程

1.加载配置并初始化

2.接收调用请求

3.处理操作请求

4.返回处理结果

第十部分Mybatis源码剖析

10.1Executor的功能

1、根据传递的参数, 完成SQL语句的动态解析, 生成BoundSql对象,供StatementHandler使用;

2、为查询创建缓存, 以提高性能;

3、创建JDBC的Statement连接对象,传递给StatementHandler对象, 返回List查询结果。

第十一部分设计模式

11.1Builder构建者模式

1、将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。

2、步骤

1)将需要构建的目标类分成多个部件;

2)创建构建类;

3)侬次创建部件;

4)将部件组装成目标对象。

11.2工厂模式

简单工厂模式(Simple Factory Pattern):又称为静态工厂方法(Static Factory Method)模式它属于创建型模式。

11.3 代理模式

代理模式(Proxy Pattern):给某一个对象提供一个代理, 并由代理对象控制对原对象的引用。

最后

以上就是自由小蜜蜂为你收集整理的我的Mybatis学习笔记第一阶段模块一Mybatis的全部内容,希望文章能够帮你解决我的Mybatis学习笔记第一阶段模块一Mybatis所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(64)

评论列表共有 0 条评论

立即
投稿
返回
顶部