回顾MyBatis
MyBatis
持久层解决方案,封装了JDBC很多细节,使开发者只需关注业务本身,无需关注连接创建,ORM思想,搭好“舞台”,任我们表演.
JDBC三大对象:
- Connection
- PrepareStatement
- ResultSet
JDBC只是一种规范,像Spring的JdbcTemplate或者Apache的DBUtils都只是简单的封装,只是一种工具类.
XML配置方式
mybatis加载配置文件的4种方式:
-
依据Mapper类具体路径配置mapper
<configuration> <mappers> <!-- class 级别的指定 --> <mapper class="cn.zoujidi.mybatis.dao.IUserDao"/> </mappers> </configuration>
-
依据Mapper类所在的Package配置mapper
<configuration> <mappers> <package name="cn.zoujidi.mybatis.dao"/> </mappers> </configuration>
-
把Mapper配置文件与单独放到resource中,和Mapper类分开了
<!-- 指定映射配置文件位置,映射配置文件是每个dao的独立配置文件 --> <mappers> <mapper resource="cn/zoujidi/mybatis/dao/IUserDao.xml" /> </mappers>
-
直接在spring中配置Mapper的路径,但是mybatis.xml还是必不可少的
环境搭建注意事项:
-
创建IUserDao.xml和IUserDao.java时,名称是为了我们之前的知识保持一致.在mybatis中,它把持久层的操作接口和映射文件也叫做:Mapper,所以IUserDao.xml与IUserMapper.xml是一样的
-
在idea中创建目录的时候,它和包是不一样的:包在创建时cn.zoujidi.mybatis是三级目录,而目录在创建时cn.zoujidi.mybatis是一级目录
-
mybatis的映射文件配置位置必须和dao接口的包结构相同(使用上部分加载mapper配置文件的第三种方式)
-
映射配置文件namespace属性取值必须是dao接口的全限定类名
-
映射配置文件的操作配置(select),id属性的值必须是dao接口的方法名
当我们遵从3、4、5点之后,我们就无需再写dao的实现类
简单例子(xml)
// 1、读取配置文件
InputStream in = Resources.getResourceAsStream("SqlMapConfig");
// 2、创建SqlSessionFactory工厂
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
SqlSessionFactory factory = builder.build(in);
// 3、使用工厂生产SqlSession对象
SqlSession session = factory.openSession();
// 4、使用SqlSession创建Dao接口的代理对象
IUserDao iUserDao = session.getMapper(IUserDao.class);
// 5、使用代理对象执行方法
List<User> users = iUserDao.findAll();
users.forEach(System.out::println);
// 6、释放资源
session.close();
in.close();
步骤描述:
- 第一步读取配置文件,获取连接数据库的信息
- 有了工厂就可以生成操作对象:session
- 我们一般不使用session直接操作数据库,而是使用dao操作数据库
- 所以在在第五步中,让session给我们生成代理对象
- 代理对象(方法增强)
- 通过代理对象操作数据库
- 切记映射配置中告知返回映射的实体类,制定全限定类名
注解方式
移除mapper.xml的配置,同时在dao的方法上用@Select标记,并制定sql语句,在config中用class属性指明使用该注解的全限定名
案例设计模式分析
-
读配置文件
常使用:1.使用类加载器读取类路径的配置文件、2.ServletContext.getRealPath()获取当前部署环境的路径
绝对路径、相对路径均不常使用。
-
创建factory工厂,使用了构建者模式
-
工厂模式生成SqlSession(解耦:降低类之间的依赖关系)
自定义mybatis分析
mybatis在使用代理dao实现增删改查做了哪些事情?
两件事。
- 创建dao的代理对象
- 代理对象中SelectList方法
自定义mybatis能通过入门案例看到的类:
class Resource
class SqlSessionFactoryBuilder
interface SqlSessionFactory
interface SqlSession
OGNL表达式
object Graphic Navigation Lauguage
对象。 图。 导航。 语言
它是通过对象的取值方法来获取数据,在写法上给省略了.
比如:我们获取用户名称
类中:user.getUserName
OGNL表达式写法:user.userName
mybatis中为什么直接写userName,而不用user.呢,因为在parameterType中已经提供了属性所属类
连接池
连接池就是存储连接的一个容器,其实就是一个集合对象,并且必须是容器安全的.不能两个线程拿到同一个连接,该集合还必须实现队列的特性:先进先出
减少获取连接的所消耗的时间.
mybatis中的连接池提供了三种方式的配置: 配置的位置->主配置文件SqlMapConfig.xml中的datasource标签,type属性表示采用何种连接池的方式,取值分别是:
POOLED:采用传统的javax.sql.DataSource规范中的连接池,有针对规范的实现
UNPOOLED:采用传统获取连接的方式,虽然也实现了java.sql.DataSource接口,但是并没有使用池的思想
JNDI:采用服务器提供的JNDI技术实现来获取DataSource对象,不同服务器能拿到的DataSource又不一样,注意:如 果不是web或者maven 的war工程是不能使用的.如果使用的tomcat服务器,采用的连接池就是dbcp连接池
JNDI
Java Naming and Direction Interface,是sun公司推出的一套规范,属于javaee技术之一,目的在于模仿windows系统中的注册表。
延迟加载
按需加载,懒加载
一级缓存、二级缓存
减少与数据库的交互此。
什么样的数据适用于缓存:
- 经常查询并且不经常修改;
- 数据的正确与否对最终结果影响不大。
什么样的数据不适用于缓存:
- 经常改变的数据;
- 数据的正确与否对最终结果影响很大的(例如商品的库存、汇率、股市的牌价)
一级缓存:指的是SqlSession的缓存,即当我们执行查询后,查询的结果会同时存到SqlSession为我们提供的一块区域中,该结构是一个Map,当我们再次查询同样的数据时,mybatis回先去SqlSession中查看是否有,有的话直接拿出来。当SqlSession对象消失时,mybatis的一级缓存也就消失了。
当SqlSession调用更新、删除、添加、commit()、close()等方法时,会清空一级缓存。
二级缓存:指的是mybatis中SqlSessionFactory对象的缓存,由同一个SqlSessionFactory对象创建的SqlSession共享其缓存。
二级缓存使用步骤:
一、让mybatis框架支持二级缓存(主配置文件配置);
二、在映射文件中支持二级缓存(IUserDao.xml);
三、让当前操作支持二级缓存(select标签中)
二级缓存存放的事数据,而不是对象。
本文地址:https://blog.csdn.net/qq_36443497/article/details/107191607
上一篇: 安卓 员工管理系统app