三层架构:表现层、业务层、持久层

框架的含义就是一个半成品软件,使用框架的好处就是程序员不需要管很多繁琐的步骤,这些是框架帮你完成的
这样程序员就可以专注于业务的实现


JDBC数据库连接我们关心的只是那条sql语句,其他都交给框架处理
mybatis将jdbc进行封装,我们使用mybatis来执行sql,其实是mybatis通过jdbc来操作数据库,然后从jdbc中取出结果返回

ORM:对象关系映射,就是把数据库表和java实体类进行对应,实现我们操作实体类就是在操作数据库表

环境搭建


记住:新建的maven项目必须先修改maven配置:
修改成本地仓库,否则会一直从中央仓库下载插件
使用本地maven及下边的settings.xml配置,也就是使用配置的本地仓库
一定是在修改默认配置,也就是所有项目都使用的maven配置



1、导入jar包坐标:
在mybatis官网找到依赖代码

mybatis、mysql数据库连接、log4j用于日志、junit单元测试

2、创建数据库表

3、创建实体类和dao接口

3、mybatis主配置文件

4、写UserDao的映射配置文件
记住要写命名空间!!

注意事项:包的创建com.sjg.domain是三级目录
但是创建Directory时com.sjg.domain是一级目录,所以必须一层一层创建才能达到三级目录的效果
映射文件位置要和dao接口位置包结构相同
遵守了映射规范,那么就不用写dao的实现类,可以直接查询到数据库表,所以比自己写实现类方便

mybatis使用方式

第一步就是读取配置文件,连接数据库
第二步创建工厂
第三步通过工厂产生对象操作数据库、
第四步,因为我们没有UserDao实现类,不能直接创建对象,只能通过sqlSession对象创建UserDao接口的代理对象
第五步,创建的实现类就已经方法增强,可以使用方法了,直接查询即可

我们还要告诉框架,将从user表查询出来的结果集封装到哪里,封装到User实体对象,然后将这些对象添加到List集合

使用注解方式进行查询
这是IUserDao.xml就不需要 了,删除
直接在接口方法上写注解

主配置文件修改
使用class属性指定被注解的dao全限定类名


当然,我们完全可以通过自己创建UserDao的实现类,实现查询方法完成查询

但是框架的使用意义就是简化编程,而且mybatis有这种注解方式,所以我们要使用注解方式实现方法。
这说明了我们之前在IUserDao.xml中写命名空间和方法名的意义,就是要通过接口名和方法名,找到对应的接口和方法,否则框架mybatis也不知道映射到哪里
通过这种注解的方式,简化了这种映射关系

设计模式分析

1、获取配置文件不使用绝对路径和相对路径,都会导致项目改变位置的时候读不到配置文件
2、创建factory使用了构建者模式,builder就是构建者,创建工厂类比交给包工队来完成,in好比是钱,给钱包工队就开始干活。使得繁琐的细节都隐藏起来了。将对象的创建细节隐藏,使用者直接调用方法
3、创建sqlSession使用工厂模式:由工厂去生产session对象,避免自己创建对象导致对象依赖,对象依赖也就出现新建的对象在新的需求中又要创建对象,就需要不停修改代码
工厂模式降低了类之间的依赖关系,不用每次编译部署启动tomcat
4、getMapper使用了代理模式:不修改源码基础上对已有方法增强。也就是通过创建dao接口实现类的代理对象,从而实现不实现dao实现类也能实现功能。
其实从加载配置到通过代理创建对象中间都可省略,之所以这样繁琐,是因为这样增强了灵活性,这中间可以通过重载方法实现更多功能。
详细分析

通过IUserDao.xml文件找到可执行的sql语句,创建preparedStatement对象,但是现在还不确定到底是封装到哪个对象

反射回顾

首先获取类加载器,将Student.class文件加载到内存,得到Class类对象
然后就可以通过这个类对象创建实例,默认调用Student类的无参构造器

上边是 获取Class的详细方式
下边是获取Class对象的三种方式
获取Class对象的方式:
1、java源代码阶段:Class.forName(类全名) :将class文件加载到内存,返回class对象
2、class类对象阶段:通过 类名.class获取 :class文件已经加载到内存
3、运行时阶段:也就是已经有对象了,那么就通过对象方法:对象名.getClass()获取
通过class对象创建实例

上面过程,知道resultType,就根据这个类的全限定类名,通过反射机制,将User.class文件加载到内存,创建class对象,进而通过newInstance()创建User对象

User对象有了之后,还是使用反射,获取到User对象的各个属性,然后mybatis将属性与User数据库表列名对应,取表中的值放到对应对象属性下

上图映射信息中,包含sql语句,还有封装的实体类名,因为我们要明确这种对应关系,也就是sql执行结果封装到哪个对象,
所以将这两个信息封装到一个mapper对象。
这样将映射文件中信息装在一个map对象,如下:
就可以明确这种查询的关系了


上边展示了session.getMapper(UserDao.class)
执行细节,就是通过动态代理的方式,在代理对象的处理器部分执行了selectList方法,查询数据库
通过代理模式增强方法,原来这个userDao接口中只有方法定义,代理对象的处理器中实现了方法,执行了selectList方法,
而这个selectList方法当中就包含了连接数据库,创建PreparedStatement对象等一系列过程
本文深入解析MyBatis框架的使用方法,包括环境搭建、配置文件详解、ORM概念介绍,以及通过注解和XML配置实现数据库操作的流程。探讨了MyBatis如何简化Java持久层开发,提高开发效率。


1082

被折叠的 条评论
为什么被折叠?



