框架技术概述
框架的概念
是一种经过检验的,具有特定功能的半成品软件。
作用
1.可以节省大量基础代码的编写工作,从而提高工作效率和开发速度,为构建新的应用程序提供了极大的便利
2.可以使混乱的东西变得结构化、规范化
3.提供了优秀的架构设计,保证了应用结构风格统一,且为基础功能提供了优质的实现
一、初识主流框架
1、Spring框架
Spring是一个开源框架,它由Rod Johnson创建。它是为了解决企业应用开发的复杂性而创建的。Spring使用基本的JavaBean来完成以前只可能由EJB完成的事情。然而,Spring的用途不仅限于服务器端的开发。从简单性、可测试性和松耦合的角度而言,任何Java应用都可以从Spring中受益。
2、Spring MVC框架
Spring MVC 框架的正式名称是“Spring Web MVC”,是基于 Servlet API构建的 Web 框架,从一开始就包含在 Spring Framework 中,是目前最主要的 MVC 框架。Spring MVC 框架是全功能 MVC 模块结构清晰、使用灵活,具有高度的可配置性,可以方便地进行定制化开发,所支持的视图技术非常全面。
3、Struts 2框架
Struts 2框架是一个基于 Web 的MVC 架Struts 2 架借鉴了 WebWork 架的优秀设计,引入了多种新特性,如拦截器、值栈、OGNL 表达式语言,而默认设置、注解及“惯例重于配置”原则等特性的应用能够大大减少XML配置。
4.Hibernate框架(完全的ORM)
Hibernate 框架是一个优秀的持久化框架,是一个典型的ORM解决方案,通过简单地配置和编码可实现烦琐的JDBC代码才能实现的功能,具有出色的封装性和移植性。
5.MyBatis框架(半自动化的ORM实现)
MyBatis 框架是一个基于 ORM (Object Relational Mapping,对象/关系映射) 的优秀的持久化框架但是,MyBatis 框架不是一个完整的 ORM 实现,而是一种半自动化的 ORM 实现。MyBatis 框架的主要特点是SQL映射器机制。MyBatis 架使用XML或注解将 Java 中的接口和 POJO(Plain Ordinary JavaObiect,普通的 Java 对象)与 SQL 语句结合在一起,使用灵活、简单易学、性能优秀,并且随着互联网企业和应用的兴起而得到广泛应用。
数据的持久化简介
持久化就是将内存中有用的数据以某种技术保存起来,并且可以再次取出来应用。即可以将内存中的数据模型(可以是任意数据结构或对象模型)转换为存储模型(可以是XML\二进制流、关系模型等),以及将存储模型转换为内存中的数据模型。数据库技术及将数据以文件形式保存在永久介质(磁盘等)中的序列化技术等,都是对数据进行持久化的例子。
ORM简介(对象关系的映射)
编写程序时,以面向对象的方式处理数据;保存数据时,以对象关系映射处理数据;ORM是一种在关系型数据库和面向对象编程语言之间进行数据转换的编程技术。它试图通过在对象模型和数据库关系模型之间建立起对应关系,从而达到通过JavaBean对象操作数据库表中数据的目的
使用MyBatis框架实现数据库操作
MyBatis框架的主要思想
将SQL语句从程序代码中分离出来,配置在XML文件中,便于统一管理,降低程序的耦合度
好处
1:分离JDBC中的变化部分,抽象出规律性的内容进行封装,MyBatis框架的API封装了所有JDBC访问数据库的代码,从程序中消除了所有SQL参数设置及处理结果及的JDBC代码;
2:实现对SQL语句的灵活管理,可以直接在XML文件中修改SQL语句而不影响程序代码。
搭建基于MyBatis框架的开发环境
MyBatis环境搭建的基本步骤:
1.下载所需的jar文件
2.创建项目并添加所需的jar文件
3.编写MyBatis框架的核心配置文件(mybatisConfig.xml)
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"https://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<!--用来读取外部配置文件-->
<properties resource="database.properties"></properties>
<!--配置环境 默认为开发环境-->
<environments default="development">
<!--开发环境-->
<environment id="development">
<!--事务管理器 使用JDBC来管理事务-->
<transactionManager type="JDBC"/>
<!--数据源-->
<dataSource type="POOLED">
<property name="driver" value="${driverClass}"/>
<property name="url" value="${url}"/>
<property name="username" value="${username}"/>
<property name="password" value="${password}"/>
</dataSource>
</environment>
</environments>
<!--加载映射文件-->
<mappers>
<mapper resource="work/mapper/SysUserMapper.xml"/>
</mappers>
</configuration>
4.创建实体类
5.创建Mapper接口
6.创建数据库连接信息配置文件(database.properties)
driverClass=com.mysql.cj.jdbc.Driver
url=jdbc:mysql://localhost:3306/cvs_db?characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai
username=root
password=root
7.创建SQL映射文件(SysUserMapper.xml)
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"https://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<!--用来读取外部配置文件-->
<properties resource="database.properties"></properties>
<!--配置环境 默认为开发环境-->
<environments default="development">
<!--开发环境-->
<environment id="development">
<!--事务管理器 使用JDBC来管理事务-->
<transactionManager type="JDBC"/>
<!--数据源-->
<dataSource type="POOLED">
<property name="driver" value="${driverClass}"/>
<property name="url" value="${url}"/>
<property name="username" value="${username}"/>
<property name="password" value="${password}"/>
</dataSource>
</environment>
</environments>
<!--加载映射文件-->
<mappers>
<mapper resource="work/mapper/SysUserMapper.xml"/>
</mappers>
</configuration>
8.编写测试类的工具类(SysUserUtil)
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import java.io.IOException;
import java.io.InputStream;
public class SysUserUtil {
//配置文件的地址
private final static String CONFIG_PATH = "mybatisConfig.xml";
private static SqlSessionFactory sessionFactory = null;
/**
* 获取SqlSessionFactory
* @return
* @throws IOException
*/
private static SqlSessionFactory getSessionFactory() throws IOException {
//用完即丢 局部变量
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
if (sessionFactory == null) {
InputStream is = Resources.getResourceAsStream(CONFIG_PATH);
//全局唯一
sessionFactory = builder.build(is);
}
return sessionFactory;
}
/**
* 获取sqlSession
*
* @return
*/
public static SqlSession getSqlSession() throws IOException {
SqlSession sqlSession = getSessionFactory().openSession(true);
return sqlSession;
}
/**
* 获取sqlSession
*
* @return
*/
public static SqlSession getSqlSession(boolean autocommit) throws IOException {
SqlSession sqlSession = getSessionFactory().openSession(autocommit);
return sqlSession;
}
/**
* 关闭sqlsession
*
* @param sqlSession
*/
public static void closeSqlSession(SqlSession sqlSession) {
sqlSession.close();
}
}
9.编写测试类(Test)
import org.apache.ibatis.session.SqlSession;
import work.entity.SysUser;
import work.mapper.SysUserMapper;
import work.util.SysUserUtil;
import java.io.IOException;
import java.util.List;
public class Test {
public static void main(String[] args) {
SqlSession sqlSession = null;
try {
sqlSession = SysUserUtil.getSqlSession();
SysUserMapper mapper = sqlSession.getMapper(SysUserMapper.class);
List<SysUser> all = mapper.findall();
for (SysUser user : all) {
System.out.println(user.getRealName());
}
} catch (IOException e) {
throw new RuntimeException(e);
}finally {
SysUserUtil.closeSqlSession(sqlSession);
}
}
}
运行结果
每个类的位置
MyBatis框架的优点
1.与直接使用JDBC相比,代码量减少50%以上。
2.简单小巧且易学易用,能够快速上手应用。
3.基于原生SQL,使用灵活,不会对数据库的现有设计产生任何影响。
4.SQL语句通过XML文件进行维护,与程序代码解耦,便于统一管理和优化,并可方便的重用。
5.支持编写动态SQL语句,与应用代码解耦。
6.支持Java对象属性与查询结果集字段的映射(ORM)。
MyBatis框架的缺点
1.SQL语句的编写工作量大,且对开发人员的SQL使用经验有一定要求
2.原生SQL语句依赖特定的数据库产品,导致数据库移植性差,不能方便的更换数据。
MyBatis框架的基本要素
MyBatis框架的核心对象
每个基于 MyBatis 的应用都是以一个 SqlSessionFactory 的实例为核心的。SqlSessionFactory 的实例可以通过 SqlSessionFactoryBuilder 获得。而 SqlSessionFactoryBuilder 则可以从 XML 配置文件或一个预先配置的 Configuration 实例来构建出 SqlSessionFactory 实例。
SqlSessionFactoryBuilder
用过即丢,声明为局部变量,生命周期只存在于方法体内
SqlSessionFactory
生命周期与应用的生命周期相同,声明为全局变量;保证整个应用运行时,只存在一个对象实例(单例)
SqlSession
非线程安全,不能共享;对应一次数据库会话,会话结束必须关闭;一个SqlSession实例可以执行多次sql语句
MyBatis框架的核心配置文件
configuration | 配置 |
---|---|
properties | 属性 |
settings | 设置 |
typeAliases | 类型别名 |
typeHandlers | 类型处理器 |
environments | 环境配置 |
dataSource | 数据源 |
mappers | 映射器 |
属性(properties)
用来读取外部配置文件,这些属性可以在外部进行配置,并可以进行动态替换
<properties resource="database.properties"></properties>
设置好的属性可以在整个配置文件中用来替换需要动态配置的属性值。比如:
<dataSource type="POOLED">
<property name="driver" value="${driverClass}"/>
<property name="url" value="${url}"/>
<property name="username" value="${username}"/>
<property name="password" value="${password}"/>
</dataSource>
设置(settings)
设置名 | 描述 | 有效值 | 默认值 |
---|---|---|---|
logImpl | 指定 MyBatis 所用日志的具体实现,未指定时将自动查找。 | SLF4J、LOG4J(3.5.9 起废弃)、LOG4J2、JDK_LOGGING 、COMMONS_LOGGING、STDOUT_LOGGING、NO_LOGGING | 未设置 |
一个配置完整的 settings 元素的示例如下:
<settings>
<setting name="cacheEnabled" value="true"/>
<setting name="lazyLoadingEnabled" value="true"/>
<setting name="aggressiveLazyLoading" value="true"/>
<setting name="multipleResultSetsEnabled" value="true"/>
<setting name="useColumnLabel" value="true"/>
<setting name="useGeneratedKeys" value="false"/>
<setting name="autoMappingBehavior" value="PARTIAL"/>
<setting name="autoMappingUnknownColumnBehavior" value="WARNING"/>
<setting name="defaultExecutorType" value="SIMPLE"/>
<setting name="defaultStatementTimeout" value="25"/>
<setting name="defaultFetchSize" value="100"/>
<setting name="safeRowBoundsEnabled" value="false"/>
<setting name="safeResultHandlerEnabled" value="true"/>
<setting name="mapUnderscoreToCamelCase" value="false"/>
<setting name="localCacheScope" value="SESSION"/>
<setting name="jdbcTypeForNull" value="OTHER"/>
<setting name="lazyLoadTriggerMethods" value="equals,clone,hashCode,toString"/>
<setting name="defaultScriptingLanguage" value="org.apache.ibatis.scripting.xmltags.XMLLanguageDriver"/>
<setting name="defaultEnumTypeHandler" value="org.apache.ibatis.type.EnumTypeHandler"/>
<setting name="callSettersOnNulls" value="false"/>
<setting name="returnInstanceForEmptyRow" value="false"/>
<setting name="logPrefix" value="exampleLogPreFix_"/>
<setting name="logImpl" value="SLF4J | LOG4J | LOG4J2 | JDK_LOGGING | COMMONS_LOGGING | STDOUT_LOGGING | NO_LOGGING"/>
<setting name="proxyFactory" value="CGLIB | JAVASSIST"/>
<setting name="vfsImpl" value="org.mybatis.example.YourselfVfsImpl"/>
<setting name="useActualParamName" value="true"/>
<setting name="configurationFactory" value="org.mybatis.example.ConfigurationFactory"/>
</settings>
类型别名(typeAliases)
类型别名可为 Java 类型设置一个缩写名字。 它仅用于 XML 配置,意在降低冗余的全限定类名书写。例如:
<typeAliases>
<typeAlias alias="Author" type="domain.blog.Author"/>
<typeAlias alias="Blog" type="domain.blog.Blog"/>
<typeAlias alias="Comment" type="domain.blog.Comment"/>
<typeAlias alias="Post" type="domain.blog.Post"/>
<typeAlias alias="Section" type="domain.blog.Section"/>
<typeAlias alias="Tag" type="domain.blog.Tag"/>
</typeAliases>
也可以指定一个包名,MyBatis 会在包名下面搜索需要的 Java Bean,比如:
<typeAliases>
<package name="domain.blog"/>
</typeAliases>
每一个在包 domain.blog 中的 Java Bean,在没有注解的情况下,会使用 Bean 的首字母小写的非限定类名来作为它的别名。 比如 domain.blog.Author 的别名为 author;若有注解,则别名为其注解值。见下面的例子:
@Alias("author")
public class Author {
...
}
常见的 Java 类型内建的类型别名
别名 | 映射的类型 |
---|---|
_byte | byte |
_char | char |
_character | char |
_long | long |
_short | short |
_int | int |
_integer | int |
_double | double |
_float | float |
_boolean | boolean |
string | string |
byte | byte |
map | Map |
hashmap | HashMap |
环境配置(environments)
MyBatis 可以配置成适应多种环境,这种机制有助于将 SQL 映射应用于多种数据库之中, 现实情况下有多种理由需要这么做。例如,开发、测试和生产环境需要有不同的配置;或者想在具有相同 Schema 的多个生产数据库中使用相同的 SQL 映射.尽管可以配置多个环境,但每个 SqlSessionFactory 实例只能选择一种环境。
environments 元素定义了如何配置环境
<environments default="development">
<environment id="development">
<transactionManager type="JDBC">
<property name="..." value="..."/>
</transactionManager>
<dataSource type="POOLED">
<property name="driver" value="${driver}"/>
<property name="url" value="${url}"/>
<property name="username" value="${username}"/>
<property name="password" value="${password}"/>
</dataSource>
</environment>
</environments>
事务管理器(transactionManager)
在 MyBatis 中有两种类型的事务管理器
1.JDBC:这个配置直接使用了 JDBC 的提交和回滚功能,它依赖从数据源获得的连接来管理事务作用域
<transactionManager type="JDBC">
<property name="skipSetAutoCommitOnClose" value="true"/>
</transactionManager>
2.MANAGED :这个配置几乎没做什么
<transactionManager type="MANAGED">
<property name="closeConnection" value="false"/>
</transactionManager>
数据源(dataSource)
三种内建的数据源类型
1.UNPOOLED:这个数据源的实现会每次请求时打开和关闭连接。
2.POOLED:这种数据源的实现利用“池”的概念将 JDBC 连接对象组织起来,避免了创建新的连接实例时所必需的初始化和认证时间。
<dataSource type="POOLED">
<property name="driver" value="${driverClass}"/>
<property name="url" value="${url}"/>
<property name="username" value="${username}"/>
<property name="password" value="${password}"/>
</dataSource>
3.JNDI:这个数据源实现是为了能在如 EJB 或应用服务器这类容器中使用,容器可以集中或在外部配置数据源,然后放置一个 JNDI 上下文的数据源引用。
映射器(mappers)
使用相对于类路径的资源引用
<mappers>
<mapper resource="org/mybatis/builder/AuthorMapper.xml"/>
<mapper resource="org/mybatis/builder/BlogMapper.xml"/>
<mapper resource="org/mybatis/builder/PostMapper.xml"/>
</mappers>