框架的概念:java
应用程序的半成品;mysql
提供可用的公用结构;程序员
按必定规则组织的一组组件;sql
主流框架的介绍:数据库
Struts 2框架:apache
Struts 2以WebWork优秀的设计思想核心,吸取了Struts框架的部分优势,提供了一个更加整洁的MVC设计模式实现的Web应用程序框架。它引入了几个新的框架特性:从逻辑中分离出横切关注点的拦截器,减小或者消除额配置文 件,贯穿整个框架的强大表达式语言,支持可变动和可重用MVC模式的标签API等。Struts 2充分利用了其余MVC框架学到的经验和教训,使整个框架更加清晰,更加灵活。编程
Hibernate框架:设计模式
Hibernate是一个优秀的持久化框架,负责简化将对象数据库保存到数据库中,或从数据库中读取数据并封装到对象的工做。Hibernat经过简单配置和编程便可替代JDBC烦琐的程序代码。Hibernate已经成为当前主流的数据库持久化框 架,被普遍应用。缓存
Spring框架:安全
Spring也是一个开源框架。它的目标是使现有的javaEE技术更容易使用和促进的编程习惯。它是一个轻量级的框架,渗透了javaEE技术的方方面面。它主要做为依赖注入容器和AOP实现存在,仍是提供了声明式事务,对DAO层的支 持等简化开发的功能。Spring还能够很方便地与SpringMVC,Struts2,mybatis,Hibernate等框架集成,其中大名鼎鼎的SSM集成框架指的就是基于SpringMVC+Spring+mybatis的技术框架,使用这个集成框架将使咱们的应用程序更 加健壮,稳固,轻巧和优雅,这也是当前最流行的java技术框架。
SpringMVC框架:
SpringMVC是Spring框架提供的构建Web应用程序的全功能MVCC模块,属于SpringFramework的后续产品,已经融合在Spring Web Flow里面,是结构最清晰的MVC Model2的实现。而且拥有高度的可配置性,支持多种视图的技术。 还能够进行定制开发,至关灵活。此外,Spring整合SpringMVC能够说是天缝集成,是一个高性能的架构模式。如今愈来愈普遍地应用于在互联网的开发中。
MyBatis框架:
MyBatis是一个优秀的数据库持久化层框架,在实体类和SQL语句之间创建映射关系,是一种半自动化的ORM实现。其封装性要低于Hibernate,性能优秀,而且小巧,简单易学,如今应用也愈来愈普遍。
mybatis和Hibernate框架的区别
1.Hibernate是全自动化,而mybatis是半自动;
Hibernate 彻底能够经过对象关系模型实现对数据库的操做,拥有完整的JavaBean对象与数据库的映射结构来自动生成SQL。而mybatis仅有基本的字段映射,对象数据库以及对象实际关系仍然须要经过手写SQL来实现和管理;
2.Hibernate数据库移植性远大于mybatis;
Hibernate经过强大的映射结构和SQL语言,大大下降了对象与数据库(Oracle,mysql等)的耦合性,而mybatis因为须要写sql,所以与数据库的耦合性直接取决于程序员写sql的方法,若是sql不具通用性而用了不少某数据库特性的sql 语句的话,移植性也会随之下降不少,成本很高;
3.Hibernate拥有完整的日志系统,mybatis则欠缺一些;
Hibernate日志系统很是健全,涉及普遍,包括:sql记录,关系异常,优化警告,缓存提示,脏数据警告等;而mybatis则除了基本记录功能外,功能薄弱不少;
4.mybatis相比Hibernate须要关心不少细节;
Hibernate胚子要比mybatis复杂的不少,学习成本也比mybatis高,但也正由于mybatis使用简单,才致使它要比Hibernate关心不少技术细节。mybatis因为不用考虑很对细节,开发模式上于传统JDBC区别很小,所以很容易上手开发项· 目,但忽略细节会致使项目前期bug较多,于是开发出相对稳定的软件很慢,而开发软件却很快。Hibernate则正好与之相反。可是若是使用Hibernate很熟练的话,实际上开发效率丝绝不差于甚至超越mybatis。
5.sql直接优化上,mybatis要比Hibernate方便不少;
因为mybatis的sql都是写在xml里,所以优化sql比Hibernate方柏霓不少。而Hibernate的sql不少都是自动生成的,没法支架维护sql;虽有sql,但功能仍是不急sql强大,见到报表等变态需求时,hql也歇菜,也就是说hql是由局限的; Hibernate虽然也支持原生sql,但开发模式上却与orm不一样,须要转换思惟,所以使用上不是很是方便。总之写sql的灵活度上Hibernate不急mybatis。
总结:
mybatis:小巧,方便,高效,简单,直接,半自动;
hibernate:强大,方便,高效,负载,绕圈子,全自动;
Struts 2 框架和SpringMVC框架的区别
1.拦截机制不一样
Struts2是类级别的拦截,每次请求就会建立一个Action,和Spring整合时Struts2的ActionBean注入做用域是原型模式prototype,而后经过setter,getter把request数据注入到属性。Struts2中,一个Action对应一个request,response上 下文,在接受参数时,能够经过属性接收,这说明属性参数是让对个方法共享的。Struts2中Action的一个方法能够对应一个url,而其余类属性却被全部方法共享,这也就没法用注解或其余方式标识其所属方法了,只能设计多例。
SpringMVC是方法级别的拦截,一个方法对应一个Request上下文,因此方法直接基本上是独立的,独享request,response数据。而每一个方法同时又和一个url对应,参数的传递是直接注入到方法中,是方法所独有的。处理结果经过 ModeMaop返回给框架。在Spring整合时,SpringMVC的Controller Bean默认单例模式Singleton,因此默认对全部的请求,只会建立一个Controller,又由于没有共享的属性,因此是线程安全的,若是要改变默认的做用域,须要添加 @Scope注解修改。
Struts2有本身拦截Interceptor机制,SpringMVC这是用的是独立Aop方式,这样致使Struts2配置文件量仍是比SpringMVC大。
2.底层框架的不一样
Strurs2采用Filter(StrutsPrepareAndExecuteFilter)实现,SpringMVC(DispatcherServlet)则采用Servlet实现。Filter在容器启动以后即初始化;服务器中止之后坠毁,晚于Servlet。Servlet在是在调用时初始化,先于Fileter调用, 服务器中止后销毁。
3.性能方面
Struts2类级别的拦截,每次请求对应实例一个新的Action,须要加载全部的属性值注入,SpringMVC实现了零配置,因为SpringMVC基于方法的拦截,有加载一次单例模式bea注入。因此SpringMVC开发效率和性能高Struts2。
4.配置方面
SpringMVC和Spring是无缝的。从这个项目的管理和安全上也比Struts高。
MyBatis三大基本要素
➢ 核心接口和类
➢ MyBatis 核心配置文件(mybatis-config.xml)
➢ SQL 映射文件(mapper.xml)
MyBatis核心接口和类

一、每一个 MyBatis 的应用程序都以一个 SqlSessionFactory 对象的实例为核心,SqlSessionFactory 对象实例能够经过 SqlSessionFactoryBuilder 对象来得到。首先获取 SqlSessionFactoryBuilder 对象,能够根据 XML 配置文件或 Configuration 类的实例构建该对象。而后获取 SqlSessionFactory 对象,有了 SqlSessionFactory 对象以后,就能够进而获取 Sqlsession 实例, Sqlsession 对象中彻底包含以数据库为背景的全部执行 SQL 操做的方法。能够用该实例来 直接执行已映射的 SQL 语句。
二、根据 XML 配置文件构建 SqlSessionFactory 的实例很是简单,建议使用。
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); //获取 SqlSessionFactory 对象实例
SqlSession session = sqlSessionFactory.openSession(); //获取 SqlSession 对象实例
try {
//业务逻辑代码:如经过调用 session 对象的一系列 SQL 操做方法,对数据库表执行 CRUD 操做
int count=session.selectOne("com.mybatis.dao.UserMapper.count", 2); //方式 1
int count= session.getMapper(UserMapper.class).count(2); //方式 2:更简单,代码更安全,减小类型转换错误(推荐使用)
} finally {
session.close(); //关闭 SqlSession
}
说明:
一、UserMapper mapper = session.getMapper(UserMapper.class); //获取映射器实例 mapper
二、映射器是你建立绑定映射语句的接口,映射器接口的实例能够从 SqlSession 中得到,映射器实例的最佳范围是方法范围。即它们应该在使用它们的方法中被请求,而后就抛弃掉。它们不须要明确地关闭。
SqlSessionFactoryBuilder
SqlSessionFactoryBuilder做用
SqlSessionFactoryBuilder 负责构建 SqlSessionFactory,而且提供了多个 build() 方法的重载,因为方法参数 environment 和 Properties 均可觉得 null,那么去除重复的,真正的重载方法其实只有以下三种:
build(Reader reader,String environment,Properties properties)
build(InputStream inputStream,String environment,Properties properties)
build(Configuration config)
经过上述分析,发现配置信息能够以三种形式提供给 SqlSessionFactoryBuilder 的 build() 方法,分别是 InputStream(字节流)、 Reader(字符流)、 Configuration(类),因为字节流与字符流都属于读取配置文件的方式,因此从配置信息 的来源就很容易想到构建一个 SqlSessionFactory 有两种方式:读取 XML 配置文件构造方式和编程构造方式。咱们采用读取 XML 配置文件的方式来构造 SqlSessionFactory。
SqlSessionFactoryBuilder生命周期和做用域
SqlSessionFactoryBuilder 的最大特色是:用过即丢。一旦建立了 SqlSessionFactory 对象以后,这个类就再也不须要存在了,所以 SqlSessionFactoryBuilder 的最佳范围就是存在于方法体内,也就是局部变量而已。即最佳范围是方法 范围 (本地方法变量)。
SqlSessionFactory
SqlSessionFactory 做用
SqlSessionFactory 简单的理解就是建立 SqlSession 实例的工厂。全部的 MyBatis 应用都是以 SqlSessionFactory 实例为中心, SqlSessionFactory 的实例能够经过 SqlSessionFactoryBuilder 对象来得到。有了它以后,顾名思义,就 能够经过 SqlSessionFactory 提供的 openSession() 方法来获取 SqlSession 实例。
说明: openSession() 方法的参数为 boolean 值时,若传入 true 表示关闭事务控制,自动提交; false 表示开启事务控制。若不传入参数,默认为 true。
openSession (
boolean
autoCommit)
openSession()
SqlSessionFactory 生命周期和做用域
SqlSessionFactory 对象一旦建立,就会在整个应用运行过程当中始终存在。没有理由去销毁或再建立它,而且在应用运行中也不建议屡次建立 SqlSessionFactory 。所以 SqlSessionFactory 的最佳做用域是 Application,即随着应 用的生命周期一同存在。那么这种 “存在于整个应用运行期间,而且同时只存在一个对象实例” 的模式就是所谓的单例模式(指在应用运行期间有且仅有一个实例)。即 SqlSessionFactory 的最佳范围是应用范围。
SqlSession
SqlSession做用
SqlSession 是用于执行持久化操做的对象,相似于 JDBC 中的 Connection 。它提供了面向数据库执行 SQL 命令所需的全部方法,能够经过 SqlSession 实例直接运行已映射的 SQL 语句。
SqlSession生命周期和做用域
正如其名, SqlSession 对应着一次数据库会话。因为数据库会话不是永久的,所以 SqlSession 的生命周期也不该该是永久的。相反,在每次访问数据库时都须要建立它(注意:并非说在 SqlSession 里只能执行一次 SQL,是彻底可 以执行屡次的,可是若关闭了 SqlSession ,那么就须要从新建立它)。建立 SqlSession 的地方只有一个,那就是 SqlSessionFactory 对象的 openSession()方法。
须要注意的是:每一个线程都有本身的 SqlSession 实例, SqlSession 实例不能被共享,也不是线程安全的。所以最佳的做用域范围是请求 request 范围或者方法范围。
关闭 SqlSession 是很是重要的。必需要确保 SqlSession 在 finally 语句块中正常关闭。可使用下面的标准方式来关闭:
SqlSession session =sqlSessionFactory.openSession();
try{
//do work
}finally{
session.close(); //关闭 SqlSession
}
SqlSession两种使用方式
//方式 1:经过 SQLSession 实例调用 selectList、selectOne 等方法来直接执行已映射的 SQL 语句。(不须要编写 DAO 接口)
// MyBatis 经过 mapper 文件的 namespace 和子元素的 id 来找到相应的 SQL,从而执行查询操做
userList=sqlSession.selectList("com.smbms.dao.UserMapper.getUserList");
说明:
一、com.smbms.dao.UserMapper.getUserList=namespace+id
二、使用方式一能够不用写接口中的方法,由于方式一直接执行映射文件的 SQL 语句。
三、执行 CRUD 操做,有参数传递时此方式不适用,应使用方式 2。
//方式 2:基于 mapper 接口方式操做数据。(官方推荐使用)
//建立绑定映射语句的接口 UserMapper.java,并提供接口方法 getUserList(),该接口称为映射器。
userList=sqlSession.getMapper(UserMapper.class).getUserList();
说明:
一、接口的方法必须与 SQL 映射文件中 SQL 语句的 id 一一对应。
二、第二种方式是经过 SQLSession 实例调用 getMapper(Mapper.class) 执行 Mapper 接口方法来实现对数据库的查询操做。
三、第一种方式是旧版本的 MyBatis 提供的操做方式,虽然如今也能够正常工做,可是第二种方式是 MyBatis 官方所推荐使用的,其表达方式也更加直白。代码更加清晰,类型安全,也不用担忧易错的字符串字面值以及强制类型转换。
获取SqlSession工具类(MyBatisUtil.java)
此 MyBatisUtil.java 文件是优化后获取 SqlSession ,关闭 SqlSession 的公用工具类。
package cn.mybatis.util;
import java.io.IOException;
import java.io.InputStream;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
public class MyBatisUtil {
private static SqlSessionFactory sessionFactory;
static{//在静态代码块下,sessionFactory 只会被建立一次
try {
//读取 mybatis-config.xml 文件
InputStream in = Resources.getResourceAsStream("mybatis-config.xml");
//建立SqlSessionFactoryBuilder对象
SqlSessionFactoryBuilder sessionFactoryBuilder = new SqlSessionFactoryBuilder();
//利用SqlSessionFactoryBuilder对象 去构建sessionFactory工厂
sessionFactory = sessionFactoryBuilder.build(in);
} catch (IOException e) {
e.printStackTrace();
}
}
//建立sqlSession
public static SqlSession getSqlSession(){
//利用sessionFactory工厂对象去生产sqlSession
SqlSession sqlSession = sessionFactory.openSession(false);//false表明不会自动提交事务,true 表明自动提交事务
return sqlSession;
}
//关闭sqlSession
public static void close(SqlSession sqlSession){
if(sqlSession!=null){
sqlSession.close();
}
}
}
MyBatis的基本要素——核心配置文件
MyBatis 核心配置文件( mybatis-config.xml),该文件配置了 MyBatis 的一些全局信息,包含数据库链接信息和 MyBatis 运行时所需的各类特性,以及设置和影响 MyBatis 行为的一些属性。
mybatis-config.xml文件结构
mybatis-config.xml 文件需配置一些基本元素,须要注意的是,该配置文件的元素节点是有前后顺序的,其层次结构以下图:
说明:
一、从上图中能够看出,configuration 元素是整个 XML 配置文件的根节点,其角色就至关因而 MyBatis 的总管, MyBatis 全部的配置信息都会存放在它里面。 MyBatis 还提供了设置这些配置信息的方法。 Configuration 可从配置 文件里获取属性值,也能够经过程序直接设置。Configuration 可供配置的内容以下。
二、mybatis-config.xml 文件的元素节点是有必定顺序的,节点位置若不按顺序排位,那么 XML 文件会报错
jdbc.properties文件
driver=com.mysql.jdbc.Driver
url=jdbc:mysql:///smbms
user=root
password=123
mybatis-config.xml文件
<?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="jdbc.properties"></properties>
<!-- 环境配置 -->
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<!-- 数据库链接相关配置 ,这里动态获取config.properties文件中的内容-->
<dataSource type="POOLED">
<property name="driver" value="${driver}" />
<property name="url" value="${url}" />
<property name="username" value="${user}" />
<property name="password" value="${password}" />
</dataSource>
</environment>
</environments>
<!-- mapping文件路径配置 -->
<mappers>
<mapper resource="com/mybatis/Dao/UserMapper.xml"/>
<!-- 若是没有UserMapper.xml文件 就须要如下操做 要在对应的接口中写注释方法 -->
<!--<mapper class="com.mybatis.Dao.UserMapper"></mapper>-->
</mappers>
</configuration>
小配置文件(名称必须与Dao接口名相同)
<?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">
<!-- mapper为映射的根节点,namespace指定Dao接口的完整类名
mybatis会依据这个接口动态建立一个实现类去实现这个接口,
而这个实现类是一个Mapper对象-->
<mapper namespace="com.mybatis.Dao.UserMapper">
<!-- parameterType:参数类型
resultType:返回的结果类型
id:对应Dao接口的方法-->
<select id="getOne" resultType="com.mybatis.entity.User">
SELECT * FROM smbms_user
</select>
<delete id="del" parameterType="int" >
DELETE FROM smbms_user WHERE id=#{id}
</delete>
<insert id="add" parameterType="com.mybatis.entity.User" >
INSERT INTO smbms_user(userCode,userName,userPassword,gender,birthday,phone,address,userRole,createdBy,creationDate)
VALUES (#{userCode},#{userName},#{userPassword},#{gender},#{birthday},#{phone},#{address},#{userRole},#{createdBy},#{creationDate})
</insert>
<update id="update" parameterType="com.mybatis.entity.User">
UPDATE smbms_user SET userCode=#{userCode} WHERE id=#{id}
</update>
</mapper>
接口中实现注解方式编写SQL
若是不想编写小配置文件需编写注释

使用注解测试SQL
