三层架构:m层(模型层),v层(视图层),c层(控制层或表现层)
m层框架(持久层框架)
Mybatis Hibernate 都称之为持久层框架,主要目的就是连接数据库操作
v层(页面)
jsp+jstl+el
Html+angular.js
c层(表现层框架)
springmvc
Struts2
目的功能:主要是为了接传值和跳转页面使用,类似servlet功能
Spring(管理层框架)
Spring管理 mybatis,hibernate持久层框架。
持久化是程序在瞬时状态和持久状态间转换的过程。
mybatis 框架 :内存问题(瞬时状态) 持久状态(硬盘)
持久化操作:操作内存与硬盘之间的关系。
mybatis 是ORM框架:实体类和SQL语句之间建立映射关系。
ORM:1.编写程序的时候,以面向对象的方式处理数据 2.保存数据的时候,却以关系型数据库的方式存储。
ORM解决方案:
1.在持久化对象上执行基本的增、删、改、查操作。
2.对持久化对象提供一种查询语言或者API
3.对象关系映射工具(resultmap)
4.提供与事务对象交互、执行检查、延迟加载(lazy)以及其他优化功能(cache)
mybatis 概念:
MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解来配置和映射原生信息,将接口和 Java 的 POJOs(Plain Ordinary Java Object,普通的 Java对象)映射成数据库中的记录。 [1
充分说明,mybatis框架是一个优秀的常用的框架,mybatis在jdbc的基础之上进行了二次封装。
Mybatis框架原理分析图:
sqlMapConfig.xml是Mybatis的核心配置文件
mapper.xml是每一个实体类对应的sql映射文件
SqlSessionFactory,称之为session工厂,采用工厂模式,目的是为了生成sqlSession对象,称之为二级缓存,对应的是数据库
sqlSession所有的操作都由sqlSession发出的,称之为一级缓存,对应的是实体类
Trancation事务,也是由sqlSession创建的,提交commit和回滚rollback
mappedStatement对象称之为执行对象,底层是preparedStatement预处理执行对象
1.jdbc操作:
必须有四个属性:Driver url name password
第二步,利用反射机制加载驱动class.forName(driver)
第三步,DriverManager对象加入url,name,password从而获取connection连接对象
第四步,获取执行对象statement和preparedStatement
Mybatis与jdbc的区别:
1.jdbc里的所有代码都必须手动设置,mybatis里很多方法或者属性都已经进行了二次封装,使用的时候直接调用
2.Mybatis去除了jdbc很多冗余的代码
3.访问的速度Mybatis比jdbc效率高
4.使用Mybatis可以减少程序员的工作负荷,减少压力
5.在实际开发中都喜欢使用Mybatis框架作为持久层框架,易于维护。
创建mybatis里的核心配置文件(模版)
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd"> <configuration> <!--引入外部文件的标签 --> <properties resource="properties/db.properties"></properties> <!-- 表示类型别名 库--> <typeAliases> <!-- 每一个类型的别名 type属性表示别名对应的类型地址 alias表示起的别名--> <typeAlias type="java.util.List" alias="list"/> <!-- package表示包,利用包的形式进行扫描包之下的所有的类,别名就是当前类名 --> <!-- <package name="com.kgc.pojo"/> --> </typeAliases> <!-- 作为连接数据库的环境 --> <!-- 环境配置 --> <environments default="development"> <environment id="development"> <transactionManager type="JDBC"/> <dataSource type="POOLED"> <property name="driver" value="${jdbc.driver}"/> <property name="url" value="${jdbc.url}" /> <property name="username" value="${jdbc.username}"/> <property name="password" value="${jdbc.password}"/> <!-- <property name="driver" value="com.mysql.jdbc.Driver"/> <property name="url" value="jdbc:mysql://localhost:3306/school?characterEncoding=utf-8" /> <property name="username" value="root"/> <property name="password" value="123"/> --> </dataSource> </environment> </environments>
<!-- mappers表示代理模式扫描 ,目的主要是在当前配置文件中扫描到sql映射文、件--> < <mappers> <mapper resource=""/> </mappers> <!-- plugins表示插件,主要是为了设置mybatis分页插件 --> <!-- 分页插件 --> <plugins> <plugin interceptor="com.github.pagehelper.PageInterceptor"> <!-- 3.3.0版本可用 - 分页参数合理化,默认false禁用 --> <!-- pageNum表示当前页 pages表示尾页 --> <!-- true启用合理化时,如果pageNum<1会查询第一页,如果pageNum>pages会查询最后一页 --> <!-- false禁用合理化时,如果pageNum<1或pageNum>pages会返回空数据 --> <property name="reasonable" value="true"/> </plugin> </plugins>
</configuration> |
sql映射文件解析(骨架)
注意;每一个pojo对应一个sql映射文件
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <!--代理扫描 namespace属性表示当前代理的命名空间,属性值一般情况下等于dao的接口类地址 相当于dao接口实现类 --> <mapper namespace="com.kgc.mapper.ProductMapper"> <resultMap type="" id="">
</resultMap> <!-- 表示查询标签 id属性表示当前标签的名称,属性值等于dao接口里的相对应的方法名称 --> <select id=""> select * from product </select> <!-- 添加 --> <insert id="">
</insert> <!-- 修改 --> <update id="">
</update> <!-- 删除 --> <delete id="">
</delete>
</mapper> |
准备修改数据库并且修改db.properties
Mysql:
jdbc.driver=com.mysql.jdbc.Driver jdbc.url=jdbc:mysql://localhost:3306/mall?characterEncoding=utf-8 jdbc.username=root jdbc.password=123 |
Oracle:
#驱动名称 jdbc.driver=oracle.jdbc.driver.OracleDriver #资源 jdbc.url=jdbc:oracle:thin:@localhost:1521:orcl #用户名 jdbc.username=admin64 #密码 jdbc.password=123456
修改sqlMapConfig.xml文件
<configuration> <!--引入外部文件的标签 --> <properties resource="properties/db.properties"></properties> <!-- 表示类型别名 库--> <typeAliases> <!-- 每一个类型的别名 type属性表示别名对应的类型地址 alias表示起的别名--> <typeAlias type="com.kgc.pojo.Product" alias="prodcut"/> </typeAliases> <!-- 作为连接数据库的环境 --> <!-- 环境配置 --> <environments default="development"> <environment id="development"> <transactionManager type="JDBC"/> <dataSource type="POOLED"> <property name="driver" value="${jdbc.driver}"/> <property name="url" value="${jdbc.url}" /> <property name="username" value="${jdbc.username}"/> <property name="password" value="${jdbc.password}"/> <!-- <property name="driver" value="com.mysql.jdbc.Driver"/> <property name="url" value="jdbc:mysql://localhost:3306/school?characterEncoding=utf-8" /> <property name="username" value="root"/> <property name="password" value="123"/> --> </dataSource> </environment> </environments>
<!-- mappers表示代理模式扫描 ,目的主要是在当前配置文件中扫描到sql映射文件--> <mappers> <mapper resource="mapper/ProductMapper.xml"/> </mappers> </configuration> |