Java学习(第一阶段模块一)2020/4/21-2020/4/28

任务一:自定义持久层框架

希望通过自己的学习在6个月内有一个极大的提升,今天是2020/4/21,一个意义重大的一天。

1.JDBC回顾及问题分析

JDBC问题分析:

  1. 数据库配置信息存在硬编码的问题(解决方案:配置文件);
  2. 频繁创建释放数据库连接(解决方案:连接池) ;
  3. sql语句、设置参数、获取结果集参数均存在硬编码问题(解决方案:配置文件);
  4. 手动封装返回结果集,较为繁琐(解决方案:反射、内省);
  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.自定义持久层框架思路分析

自定义持久层框架涉及思路:

  1. 使用端:(项目):引入自定义持久层框架的jar包;
    提供两部分配置信息:数据库配置信息、sql配置信息:sql语句、参数类型、返回值类型;使用配置文件来提供两部分配置信息:
    (1)sqlMapConfig.xml:存放数据库配置信息
    (2)mapper.xml:存放sql配置信息
  2. 自定义持久层框架本身:(工程):本质就是对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
自定义持久层框架问题分析:

  1. Dao层使用自定义持久层框架,存在代码重复,整个操作过程模板重复(加载配置文件、创建sqlSessionFactory、生产sqlSession);
  2. 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中的四大对象都是代理对象。

任务三:Mybatis源码剖析

Mybatis三层功能架构

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值