0%

MyBatis持久性框架

  • 1.本文仅用作自己在学习路上遇到问题、解决问题方面的记录。如被提供给同样在此方面遇到问题的同学参考,不胜荣幸。若文中有出现纰漏不够严谨之处,望海涵。意见之处,不吝赐教。
  • 2.原始JDBC存在着频繁的连接、创建、释放导致系统资源浪费,从而影响性能,解决方法可以通过创建数据库连接池进行数据库性能的优化。
  • 3.sql语句的变化较多,并且使用preparedstatement存在较多的硬编码,以及对结果集的解析也存在较多硬编码,耦合度比较高,因而想要用框架进行封装进而优化数据库,所以出现了Mybatis框架。
  • 4.MyBatis是一款优秀的持久性框架,几乎免除了所有的JDBC代码以及设置参数和获取结果集的工作,MyBatis可以通过简单xml和注解来配置和映射原始类型、接口、和JavaPOJO**(Plain Old Java Objects,普通老式Java对象**)为数据库中的记录。
  • 5.ORM框架(对象关系映射的缩写),MyBatis是一款基于ORM框架实现的半自动轻量级持久层框架。
  • 6.开发流程:
    • 6.1.添加MyBatis的jar包
    • 6.2.创建数据库实体表
    • 6.3.编写User实体类(成员变量的类型要与数据库的数据的类型要一一对应
    • 6.4.编写映射实体类的xml文件
      (通过配置类访问到对应实体类的映射文件xml,映射文件xml的定义:
      <mapper namespace="com.awu.mapper.UserMapper">
      根据namespace找到对应的实体类
      id
      1
      2
      3
      4
      5
      6
      7
      8
      select * from user</select>
      </mapper>)```
      (*其中id 是对应的方法名,可以在执行时找到对应的实体类的代理对象的方法,resultType这是返回结果集的类型,此处表示是User类类型的*)
      - 6.5.编写核心配置文件mybatis-config.xml
      - 6.6.编写测试方法
      - 7.测试
      (*编写加载配置文件的路径,然后用*
      ```Inputstream inutstream=Resource.getResourceAsStresm(resource )
      1
      SqlSessionFactory sqlSessionFactory =new SqlSessionFactoryBuilder().build(inputstream)//获得sqlsession工厂对象
      1
      SqlSession sqlSession =sqlSessionFactory.openSession();//设置sqlsession对象
      1
      List<User> users=sqlSession.selectList("com.awu.UserMapper.findAll") //执行sql语句
      1
      2
      3
      for(User user : users){
      System.our.println(user.toString())}//打印结果
      sqlSession.close();
  • 8.除了用这种sqlSession方式,还可以用MyBatis代理开发的方式,Mapper接口的开发方法需要程序员编写Mapper接口(相当于dao接口),由MyBatis框架根据接口定义创建接口的动态代理对象。
  • 9.开发流程:
    创建UserMapper接口,同时测试类中出现如下改动,在获取sqlSession对象后,不直接执行方法,而通过增加
    1
    UserMapper userMapper =sqlSession.getMapper(UserMapper.class);
    获取其代理对象,进而调用userMapper的方法。
  • 10.Mapper.xml的namespace的全限定名和Mapper接口的全限定名一样。xml的id和Mapper接口的方法名要一致,并且Mapper接口方法的参数类型要和xml的resultType的类型要相同。
  • 11.Mybatis常用的API
    • sqlSession
    • sqlSessionFactory 工厂对象
    • Resource 资源类
    • sqlSession.opneSession()
    //无参数表示非自动提交,有参数TRUE表示事务是自动提交的。
    • sqlSession 会话对象
      包含执行语句,提交或者回滚以及获取映射器实例的方法
  • 12.(16:05)environment标签和mapper标签
    配置文件找到映射文件,映射文件再根据命名空间和id找到具体的类的具体的方法
  • 13.MyBatis的增删改查-映射文件内标签内容的书写
    • 13.1.--根据用户编号查找用户信息
      1
      select * from user where id=#{id}(使用这条语句的同时还需要在标签头添加参数标签,用以封装传过来的参数,其中#{id}就是传进来封装的参数值
    • 13.2.--根据用户名模糊查询用户信息
      1
      select * from user where username like '%${value}%'
    • 13.3.--添加客户信息
      1
      2
      <insert>
      insert into user{username,jobs,phone}values {#{username},#{jobs,#{phone}}}

{内容}表示由用户传进来的参数的封装

  • 13.4.--更新用户信息
    1
    2
    <update>
    update user set username=#{username},jobs=#{jobs},phone=#{phone} where id=#{id}
  • 13.5.--删除用户信息
    1
    2
    <delete>
    delete from user where id=#{id}
  • 14.*MyBatis原理:**

实现方式两种:sqlsession和基于sqlsession的mapper代理对象
功能架构分为三层:
接口层、数据处理层、框架支撑层
(增加数据接口<--参数映射,SQL解析,SQL执行,结果处理和映射<--xml配置,基于注解的配置)

  • 15.MyBatis的一级缓存和二级缓存:
    一级缓存是默认开启的,二级缓存是需要手动进行配置的,开启后的二级缓存还需要将实体类pojo实现serializable接口。数据的查询首先是查缓存,如果缓存中没有则再向数据库中找。所以在一二级缓存都存在的情况下,查询的流程是,首先在二级缓存中找同一个namespace下的多个sqlSession对象,然后通过一级缓存在每个sqlSession内查找数据,可以说二级缓存是基于命名空间查找的(基于mapper映射文件的namspace实现的),一级缓存是基于sqlSession查找的(基于sqlSession实现的),如果都找不到再查询数据库。
  • 16.二级缓存什么时候失效什么时候生效?
    答:当执行的sqlSession对象是位于同一个命名空间的不同sqlSession对象时,sql语句执行commit或close,一级缓存失效二级缓存生效,sql语句执行增删改操作时二级缓存失效一级缓存生效。

-------------本文结束感谢您的阅读-------------

欢迎关注我的其它发布渠道