Java学习(第一阶段模块一)
任务一:自定义持久层框架
希望通过自己的学习在6个月内有一个极大的提升,今天是2020/4/21,一个意义重大的一天。
1.JDBC回顾及问题分析
JDBC问题分析:
- 数据库配置信息存在硬编码的问题(解决方案:配置文件);
- 频繁创建释放数据库连接(解决方案:连接池) ;
- sql语句、设置参数、获取结果集参数均存在硬编码问题(解决方案:配置文件);
- 手动封装返回结果集,较为繁琐(解决方案:反射、内省);
public static void main(String args[]) {
Connection connection = null;
PreparedStatement preparedStatement = null ;
ResultSet resultSet = null ;
try {
//加载数据库的驱动,如用Oracle数据库需要更换驱动
Class.forName("com.mysql.jdbc.Driver");
//通过驱动管理类获取数据库的链接
connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/mybatis?characterEncoding=utf-8","root","root");
String sql = "select * from user where username = ?";
preparedStatement = connection.prepareStatement(sql);
preparedStatement.setString(1,"tom");
resultSet = preparedStatement.executeQuery();
//遍历查询结果集
while (resultSet.next()){
int id = resultSet.getInt("id");
String username = resultSet.getString("username");
//进行set操作
}
}catch (Exception e ){
e.printStackTrace();
}finally{
//释放资源
try {
connection.close();
}catch(SQLException e){
e.printStackTrace();
}finally{
connection = null;
}
}
}
2.自定义持久层框架思路分析
自定义持久层框架涉及思路:
- 使用端:(项目):引入自定义持久层框架的jar包;
提供两部分配置信息:数据库配置信息、sql配置信息:sql语句、参数类型、返回值类型;使用配置文件来提供两部分配置信息:
(1)sqlMapConfig.xml:存放数据库配置信息
(2)mapper.xml:存放sql配置信息 - 自定义持久层框架本身:(工程):本质就是对JDBC代码进行了封装;
(1)加载配置文件:根据配置文件的路径,加载配置文件成字节输入流,存储在内存中;创建Resources类 方法:InputStream getResourceAsStream(String path)
(2)创建两个javaBean:(容器对象):存放的就是对配置文件解析出来的内容;Configuration:核心配置类:存放sqlMapConfig.xml解析出来的内容;MappedStatement:映射配置类:存放mapper.xml解析出来的内容;
(3)解析配置文件:dom4j;
创建类:SqlSessionFactoryBuilder 方法:build(InputStream in)
第一:使用dom4j解析配置文件,将解析出来的配置内容封装到容器对象中;
第二:创建SqlSessionFactory对象;生产sqlSession会话对象(工厂模式)
(4)创建SqlSessionFactory接口及实现类DefaultSqlSessionFactory
第一:openSession():生产sqlSession
(5)创建SqlSession接口及实现类DefaultSqlSession
定义对数据库的CRUD操作:selectList()、selectOne()、update()、delete()
(6)创建Executor接口及实现类SimpleExecutor
query(Configuration,MappedStatement,Object…params):执行的就是JDBC代码
3.自定义持久层框架问题分析
haha
自定义持久层框架问题分析:
- Dao层使用自定义持久层框架,存在代码重复,整个操作过程模板重复(加载配置文件、创建sqlSessionFactory、生产sqlSession);
- statementid存在硬编码的问题
解决思路:使用代理模式生成Dao层接口的代理实现类(代理对象调用接口中任意方法,都会执行invoke方法)
任务二:Mybatis基础回顾及高级应用
1.Mybatis相关知识
1.ORM:Object/Relation Mapping(对象/关系映射)
2.优点:基于ORM的半自动轻量级持久层框架,可以使用简单的XML或注解来配置和映射原生类型、接口和Java的POJO(Plain Old Java Objects)到数据库中的记录
3.界限:核心sql自己优化,sql和java编码分开,功能边界清晰,一个专注业务,一个专注数据。
4.在进行增删改操作时,需要手动提交事务
//默认开启一个事务,但是该事务不会自动提交,
sqlSessionFactory.openSession();
//自动提交事务
sqlSessionFactory.openSession(true);
5.Mybatis的properties深入:
//加载外部的properties文件
<properties resource="jdbc.properties"></properties>
6.给实体类的全限定类起别名:
<typeAliases>
<typeAlias type="com.lagou.pojo.User" alias="user"></typeAlias>
//批量起别名,该包下所有类的本身的类名,别名不区分大小写
<package name="com.lagou.pojo"/>
</typeAliases>
7.Dynamic SQL:多条件组合查询,演示if
<if test="id != null"> and id = #{id} </if>
8.多值查询:演示foreach
<select id="findByIds" parameterType="list" resultType="user">
select * from user
<where>
<foreach collection="array" open="id in (" close=")" item="id" separator=",">
#{id}
</foreach>
</where>
</select>
9.抽取sql片段
//创建代码片段
<sql id="selectUser">
select * from user
</sql>
//引用代码片段
<include refid="selectUser"></include>
2.Mybatis高级概念
1.Mybatis注解开发
- @Insert:实现新增
- @Update:实现更新
- @Delete:实现删除
- @Select:实现查询
- @Result:实现结果集封装
- @Results:可以与@Result一起使用,封装多个结果集
- @One:实现一对一结果集封装
- @Many:实现一对多结果集封装
2.Mybatis缓存
- 一级缓存是SqlSession级别的缓存,在操作数据库时需要构造sqlSession对象,在对象中有一个数据结构(HashMap)用于存储缓存数据。不同的sqlSession之间的缓存数据区域(HashMap)是互相不影响的。
- 二级缓存是mapper级别的缓存,多个sqlSession去操作同一个Mapper的sql语句,多个sqlSession可以共用二级缓存,二级缓存是跨sqlSession的。
3.Mybatis插件
- Mybatis是一个应用广泛的优秀ORM开源框架。Mybatis对持久层的操作是借助于四大核心对象(Eexcutor、Statement、ParameterHandler、ResultSetHandler),支持对四大核心对象进行拦截,插件的本质是拦截器,用来增强核心对象的功能,增强本质上是借助于底层的动态代理实现的,即Mybatis中的四大对象都是代理对象。