Spring框架
Spring理念包括Ioc(Inversion of Control,控制反转)和AOP(Aspect Oriented Programming,面向切面编程)
Spring Ioc简介
Ioc是一个关联Java Bean关系(创建,事件,行为,依赖关系)的容器。依靠描述(XML)完成对象的创建及其依赖关系。
例如。插座依赖国家标准(可定义为一个接口,Socket)来生产,现有两种插座(Socket1,Socket2)。如果用户需要使用插座1,代码如下:
Socket socket = new Socket1();//Socket是个接口,Socket是个实现类,所以此处用了上转型
user.setSocket(socket);
user.userSocket();
如果需要使用Socket2,那就需要修改代码如下:
Socket socket = new Socket2();
user.setSocket(socket);
user.userSocket();
这种情况Socket接口和其实现类耦合度较高。SpringIoc可以解决这个问题。
SpringIoc可以使用配置方式完成对象创建。先用一段XML描述插座和用户的引用插座1.
<bean id="socket" class="Socket1"/>
<bean id="user" class="com.cc.User">
<property name="socket" ref="socket"/>
</bean>
如果需要插座2,直接把Socket1改成Socket2
<bean id="socket" class="Socket2">
上述相当于是用XML配置依赖关系,当socket bean为Socket1时,SpringIoc会拿到Socket1注入给使用者,当socket bean为Socket2时,SpringIoc也指挥拿Socket2注入给使用者,这就是控制反转的含义。
除此之外,SpringIoc还可以对Java Bean生命周期进行管、可以延迟加载、也可以在其生命周期内定义一些行为等。
SpringAOP
举个例子,现有生产部门和财务部门对订单进行处理。生产部门审批通过准备付款,但财务部门发现订单价格超值,需要取消订单。这样操作会影响到财务部门和生产部门。我们把预算超支这个条件称为切面。它会影响订单、生产部门、财务部门三个OOP对象。
SpringAOP常用于数据库事务编程。可用一段伪代码来进行简单说明
/**
*Spring AOP处理订单伪代码
*@param order订单
**/
private void proceed(Order order){
//判断生产部门是否通过订单,数据库记录订单
boolean pflag = productionDept.isPass(order);
if(pflag){//如果生产部门通过进行财务部门审批
if(financialDept.isOverBudget(order)){//财务审批是否超限
throw new RuntimeException("预算超支!!");
}
}
}
在SpringAOp实现数据库事务管理中,以异常作为消息。在默认情况下(可以通过Spring配置文件修改),只要Spring接收到一场消息,他就会将数据库事务回滚,从而保证数据一致性。
MyBatis简介
Mybatis是个基于Java的持久层框架。目前它的数据访问层DAO(Date Access Object)是不需要实现类的,它只需要一个接口和XML(或注解)。
Hibernate也是十分流程的持久层框架,和Mybatis一样,他们需要首先定义个POJO(Plain Ordinary Java Object)和数据库表对应起来,如下
package com.cc.pojo;
public class Role implements java.io.Serializable {
private Integer id;
private String roleName;
private String note;
/** setter and getter**/
}
无论Mybatis和Hibernate都依靠某种方法,将数据库表和POJO映射起来,这样程序员就可以操作POJO来完成相关逻辑。
Hibernate简介
Mybatis和Hibernate都可以通过XML或者注解提供映射规则,因为Mybatis中注解方式会受到一定限制,所以Mybatis通常使用XML方式实现映射关系。
Hibernate的设计理念是完全面向POJO,Mybatis不是。Hibernate不再需要编写SQL就可以操作数据库,是一种全表映射的体现。而Mybatis则不同,需要我们提供SQL去运行。
Hibernate映射文件如下
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="com.cc.pojo.Role" table="t_role">
<id name="id" type="java.lang.Integer">
<column name="id"/>
<generator class="identity"/>
</id>
<property name="roleName" type="String">
<column name="role_name" length="60" not-null="true"/>
</property>
<property>
<column name="note" length="512"/>
</property>
</class>
</hibernate-mapping>
上述XML文件将POJO和表t_role进行映射配置,Hibernate会根据映射关系来生产对应sql。下面对其增、删、查、改。
Session session = null;
Transaction tx = null;
try{
//打开Session
session = HibernateUtil.getSessionFactory().openSession();
//事务
tx = session.beginTransaction();
//POJO
Role role = new Role();
role.setID(1);
role.setRoleName("rolename1");
role.setNote("note1");
session.save(role);//保存
Role role2 = (Role) session.get(Role.class,1);//查询
role2.setNote("修改备注");
session.update(role2);//更新
System.out.println(role2.getRoleName());
session.delete(role2);//删除
tx.commit();
}catch(Exception ex){
if(tx != null && tx.isActive()){
tx.rollBack();//回滚事务
}
ex.printStackTrace();
}finally{
if(session != null && session.isOpen()){
session.close();
}
}
Mybatis
与Hibernate不同的是,Mybatis不屏蔽SQL,程序员可自己制定SQL,从而优化性能,符合移动互联网的高并发、大数据、高性能、高响应要求。
Mybatis配置文件如下
<?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="com.cc.mapper.RoleMapper">
<resultMap id="roleMap" type="com.cc.pojo.Role">
<id property="id" column="id"/>
<result property="roleName" column="role_name"/>
<result property="note" column="note"/>
</resultMap>
<select id="getRole" resultMap="roleMap">
select id,role_name,note from t_role where id = #{id}
</select>
<delete id="deleteRole" parameterType="int">
delete from t_role where id = #{id}
</delete>
<insert id="insertRole" parameter="com.cc.pojo.Role">
insert into t_role(role_name,note) values(#{roleName},#{note})
</insert>
<update id="updateRole" parameterType="com.cc.pojo.Role">
update t_role set
role_name = #{rolename},
note = #{note}
where id = #{id}
</update>
</mapper>
注意。mapper元素中的namespace属性需要和一个接口的全限定名保持一致,里面的SQL的id也需要和接口定义的方法完全保持一致。接口定义如下。
package com.cc.mapper
import com.cc.pojo.Role;
public interface RoleMapper{
public Role getRole(Integer id);
public int deleteRole(Integer id);
public int insertRole(Role role);
public int updateRole(Role role);
}
该接口不需要定义实现类,可直接使用。下面对角色类进行增、删、查、改。
SqlSession sqlSession = null;
try{
sqlSession = MybatisUtil.getSqlSession();
RoleMapper roleMapper = sqlSession.getMapper(RoleMapper.class);
Role role = roleMapper.getRole(1);//查询
System.out.println(role.getRoleName());
role.setRoleName("update_role_name");
roleMapper.updateRole(role);//更新
Role role2 = new Role();
role2.setNote("note2");
role2.setRoleName("role2");
roleMapper.insertRole(role);//插入
roleMapper.deleteRole(5);//删除
sqlSession.commit();//提交事务
}catch(Exception ex){
ex.printStackTrace();
if(sqlSession != null){
sqlSeesion.rollback();//回滚事务
}
}finally{//关闭连接
if(sqlSession != null){
sqlSession.close();
}
}
Mybatis和Hibernate在业务逻辑上是大同小异的。Mybatis需要提供SQL和接口,所以他的工作量比Hibernate大,但是由于可以自定义SQL,映射关系,所以其灵活性、可优化性就超过了Hibernate。
Spring MVC简介
MVC模式吧应用程序分为不同方面,同时提供这些元素的松耦合。
- Model(模型):封装了应用程序的数据和由它们组成的POJO。
- View(视图):负责把模型数据渲染到视图上,将数据以一定形式展现给用户。
- Controller(控制器):负责处理用户请求,并建立适当的模型把它传递给视图渲染。
Spring MVC 重点在于它的流程和一些重要的注解,包括控制器、视图解析器、视图等重要内容。
最流行的NoSQL-Redis
对于NoSQL数据库而言,它存储的数据是半结构化的。
Redis称为主要的NoSQL工具,原因如下:
- 响应快速:每秒可以执行大约110000个写入操作,或者81000个读操作,其速度远超数据库。
- 支持6种数据类型:包含字符串、哈希结构、列表、集合、可排序集合、基数。字符串可存入java基础数据类型,哈希可以存储对象,列表可以存储List对象等。类型少有两大好处:1. 满足存储各种数据结构的需要。2. 数据类型少,使得规则就少,需要的判断和逻辑就少,这样读/写速度更快。
- 操作都是原子的:确保两个客户同时访问Redis服务器时,得到的是更新后的值(最新值)。
- MultiUtility工具:Redis可以在任何短暂的数据中使用,例如缓存、消息传递队列、wen应用程序绘画、网站页面点击数中。
SSM+Redis结构框图及概述
- Spring IoC(Inversion of Control,控制反转)承担了一个资源管理、整合、即插即拔的功能。
- Spring AOP(Aspect Oriented Programming,面向切面编程),特别在数据库管理方面。
- Spring MVC 用户把模型、视图和控制器分层,组成一个有机灵活的系统。
- MyBatis 提供了一个数据库访问的持久层,通过MyBatis-Spring项目,它便能和Spring无缝对接。
- **Redis **作为最流行的NoSQL(非关联数据库),它提供了高速处理数据和缓存数据的功能,使得系统大部分只需要缓存页面,而无须从数据库磁盘中重复读写;在一些需要告诉运算的场合中,也可以通过先用它来完成运算,再把数据批量存入数据库,这样便能极大提高了互联网系统的性能和响应能力。