概述
第一阶段模块一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.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接口开发需要遵循以下规范:
- Mapper.xml文件中的namespace与『napper接口的全限定名相同
- Mapper接口方法名和Mapper.xml中定义的每个statement的id相同
- Mapper接口万法的输入参数类型和『napper.xml中定义的每个sql的parameterType的类型相同
- 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类型的集合 |
TypeHandler | java数据类型和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所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复