MyBatis框架
框架阶段:基础阶段 ->应用阶段
需要背的东西多(不要去死记硬背,根据以前学的内容理解去记忆)比较多。
kgcnews:JSP + Servlet + DAO模式(映射)
// Servlet中目前是大量的多重if语句 opr来进行控制处理
//接收到的参数都是字符串类型,每次都要进行相应转换
// 跳转页面,转发:request.getRe...
//添加
String sql = "insert into ....?,?,?";
Object[]param = {xx,xx,xx};
//查询
String sql = "select xx, xxx,xx from xxx";
while(rs.next()){
rs.getxx();
}
1. 框架技术的介绍
1.1 框架技术的优点
框架是一个应用程序的半成品,提供可重用的公共结构,按一定规则组织的一组组件。
如果要编写一个PPT或者简历,使用模板有如下的优点。
1.不用考虑布局,排版等,提高效率;
2.可专心在简历内容上;
3.结构统一,便于人事阅读;
4.新手也可以作出专业的简历。
反之我们开发中,如果使用框架也是可以有类似于上方的这些优点。
不用考虑性能和扩展性等方面的问题,提高效率;
可以专心在项目应用业务上,而非环境和系统设计上;
项目结构统一,便于团队开发!
新手也可以开发出专业的项目。
1.2 主流后台开发框架(三层架构)
Spring Boot
表现层:Struts2,Spring MVC
业务逻辑层:Spring
数据访问层:Hibernate,MyBatis,Spring Data
S(Spring MVC)S(Spring)M(MyBatis)
S(Struts2)S(Spring)H(hibernate)
不要学成墨守成规的书呆子,这些框架并非一定要按照上方的形式组合,它们都是独立的框架,你项目需要是什么样,就根据情况去进行技术选型(架构师)
2. MyBatis框架的介绍
2.1 数据持久化的概念和ORM原理
ORM:(Object Relational Mapping) 对象关系映射 思想
主要内容:在编写程序的时候,使用面向对象的思想来进行数据使用,而在数据存储的时候,使用关系想数据库来进行存储。
【数据库表】 -> 【Java类】
表字段 -> 类属性
一条条数据 -> 类的对象
在程序运行过程中,内存中的瞬时态数据会和持久态的数据进行转换,瞬时态->持久态(数据持久化),这个时候存储数据的对象我们称之为持久化对象。
ORM的组成如下:
在持久化对象上执行基本的增,删,改,查操作
对持久化对象提供一种查询语言或者API
对象关系映射工具
提供与 事务对象交互,执行检查,延迟加载以及其他优化功能
2.2 MyBatis的概念
ibatis ->mybatis
ibatis ->mybatis
Apache的产品,都是在Apache开源社区上开源的,近几年产品开始在各个开源平台公开开源。
2010年,它被迁移到了Google Code开源平台,被改名了。
2013年,又从Google Code迁移到了GitHUB开源平台。
它是一个半自动的ORM框架,它不再是直接将对象和表进行映射,而是将对象和SQL语句进行映射。
全自动的ORM框架:对象 <->数据表(对象怎么变,数据表跟着变<sql不用写>)
半自动ORM, MyBatis: 保证灵活性 对象 <-SQL语句 -> 数据表
2.3 MyBatis环境搭建
下载 :![在这里插入图片描述](https://img-blog.csdnimg.cn/20190722201339591.png)
导包:
编写 sql 映射
2.4 MyBatis和JDBC的区别和联系
优点和缺点:【面试题】
优点:
与JDBC相比,减少了50%以上的代码量(映射方面的代码量)
最简单的持久化框架,小巧并简单易学。
SQL代码从程序代码中彻底分离,可重用。
提供XM标签,支持编写动态SQL(后期知识点 以前有条件参数可能非必填 那么一堆 的if语句可以通过动态SQL优化)
提供映射标签,支持对象与数据库的ORM字段映射。
MyBatis因为是面向SQL的映射,所以灵活性比较高,SQL的性能也由我们自己来决定。
缺点:
SQL语句编写工作量大,对开发人员有一定要求。
数据库移植性差(假设现在数据库更换为了Oracle,SQL语句不一致,那么就需要再编写另一套SQL映射文件)
3. MyBatis的组件
3.1 MyBatis核心API
SqlSessionFactory
:它是SQL会话工厂,用于产生和数据库的会话对象。
它的生命周期:全局,每一个MyBatis应用都有且仅有一个SqlSessionFactory实例(单例:单个实例),它对应的就是一个envionment环境。
单例模式:【面试题】
在运行期间,单例类有且仅有一个实例向外提供!你在任何地方获取一个类的对象,它们都是同一个。
单例模式的组成:
私有化构造器( 防止外部使用构造器创建对象)。
提供静态的单例类实例变量(静态的信息只会随着类加载而加载,且被所有对象共享)
/**
* 单例类-懒汉(饱汉)模式
* @author Charles7c
* 2019年7月22日 上午11:28:06
*/
public class Singleton {
// 私有化构造
private Singleton() {}
// 提供静态的实例变量
private static Singleton singleton;
// 提供一个公共的静态的获取唯一的实例的方法
public static Singleton getInstance() {
// 懒汉模式 当有人需要唯一实例时才开始创建
if(singleton == null) {
singleton = new Singleton();
}
return singleton;
}
}
/**
* 单例类-懒汉(饱汉)模式
* @author Charles7c
* 2019年7月22日 上午11:28:06
*/
public class Singleton {
// 私有化构造
private Singleton() {}
// 提供静态的实例变量
private static Singleton singleton;
// 提供一个公共的静态的获取唯一的实例的方法
public static Singleton getInstance() {
// 懒汉模式 当有人需要唯一实例时才开始创建
if(singleton == null) {
singleton = new Singleton();
}
return singleton;
}
}
懒汉模式和饿汉模式的区别:
懒汉模式在类加载时不会进行唯一实例的初始化,在获取时才进行初始化,所以空间浪费比较小。
饿汉模式在类加载时就会初始化,所以占用空间!
懒汉模式因为获取时需要判断然后初始化,所以效率比较低。
饿汉模式,在后期获取实例比较快。
懒汉模式有线程安全问题。
饿汉模式没有线程安全问题。
SqlSession
核心会话对象,它是用来执行SQL映射语句的。
它的生命周期:线程(Thread)级别的,一次请求对应一个SqlSession!
SqlSession实例应用2:Mapper接口开发【推荐采用】:
创建Mapper接口
将Mapper.xml和接口进行绑定(binging)
Mapper.xml的namespace和接口的全类名一致。
xml中的SQL语句等信息要和接口中保持对应
将Mapper接口引入到核心配置文件
使用API操作
SqlSession sqlSession = null;
try {
sqlSession = MyBatisUtils.getSqlSession();
// 获取Mapper接口
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
List<User> userList = userMapper.getUserList();
for (User user : userList) {
System.out.println(user);
}
sqlSession.commit();
} catch (Exception e) {
e.printStackTrace();
sqlSession.rollback();
}finally {
MyBatisUtils.closeSqlSession(sqlSession);
}
3.2 MyBatis核心配置文件
properties(属性):
引入外部数据源文件(方便整个项目内的复用性和配置集中)
<!-- 引入外部properties配置信息 -->
<properties resource="db.properties"></properties>
....
<dataSource type="POOLED">
<property name="driver" value="${mysql.driver}"/>
<property name="url" value="${mysql.url}"/>
<property name="username" value="${mysql.username}"/>
<property name="password" value="${mysql.password}"/>
</dataSource>
直接在properties配置属性信息(方便在此文件中配置复用和集中)
<properties>
<property name="mysql.driver" value="com.mysql.jdbc.Driver"/>
<property name="mysql.url" value="jdbc:mysql:///smbms"/>
<property name="mysql.username" value="root"/>
<property name="mysql.password" value="root"/>
</properties>
上方两个也可以集合使用
<properties resource="db.properties">
<property name="xxx" value="xx"/>
</properties>
如果这两种方式出现相同配置,那么外部引入的优先级要更高一些。