【javaEE互联网轻量级框架整合开发】学习笔记 第一章 认识SSM框架和Redis

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结构框图及概述

SSM+Redis结构框图

  • Spring IoC(Inversion of Control,控制反转)承担了一个资源管理、整合、即插即拔的功能。
  • Spring AOP(Aspect Oriented Programming,面向切面编程),特别在数据库管理方面。
  • Spring MVC 用户把模型、视图和控制器分层,组成一个有机灵活的系统。
  • MyBatis 提供了一个数据库访问的持久层,通过MyBatis-Spring项目,它便能和Spring无缝对接。
  • **Redis **作为最流行的NoSQL(非关联数据库),它提供了高速处理数据和缓存数据的功能,使得系统大部分只需要缓存页面,而无须从数据库磁盘中重复读写;在一些需要告诉运算的场合中,也可以通过先用它来完成运算,再把数据批量存入数据库,这样便能极大提高了互联网系统的性能和响应能力。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值