一.正如我们所想的SSH老框架一个,没有研究的意义,(个人意见不要喷我)
但是SSH却有和现在较为流行的框架有相同的地方SSM(Spring+SpringBoot+mybatis)
二.SSH
1.SSH是一个集成框架,从职责上来分为表示层,业务逻辑层,数据持久化层,域模块层
1.1.表示层:位于最外层(最上层),最接近用户。用于显示数据和接收用户输入的数据,为用户提供一种交互式操作的界面(说人话就是各位老板上网时鼠标点的地方和键盘写的地方)
1.2.业务逻辑层:业务规则的制定、业务流程的实现等与业务需求有关的系统设计,对于数据访问层而言,它是调用者;对于表示层而言,它却是被调用者
(大概意思就是程序猿小哥哥们一天天实现的业务需求,功能啥的)
1.3数据持久化层:有时候也称为是持久层,其功能主要是负责数据库的访问,可以访问数据库系统、二进制文件、文本文档或是XML文档。简单的说法就是实现对数据表的Select,Insert,Update,Delete的操作。如果要加入ORM的元素,那么就会包括对象和数据表之间的mapping,以及对象实体的持久化。(就是注册的数据放到一个数据库里面,下次登录的时候可以取到,不至于丢了)
1.4.域模块层:(通俗意思javaBean)
二.了解顺序
2.1就个人理解一般业务先前端在后端,而后端又分为上面这几个部分,而后端的业务一般来说对于我们这种小白就是先dao->service->web(表示层)
当然也有大牛随便写代码都6的一*,dao也就是我们的Hibernate ,spring就是我们的业务逻辑层service,struts2相当于我们的servlet差不多吧
三.Hibernate了解.
首先要了解Hibernate的工作原理:对Jdbc进行了封装,相当于使用了jdbc,对JDBC进行封装的框架有DBUtils,mybatis,还有就是主角Hibernate
Hibernate的接口:1.SessionFactory获取session对象
2.session操作数据库的接口相当于那个SQL中的statement
3.Transaction对象,就是事务(我吐了,这个太多了)
事务是一个面试重点:1.ACID特性:原子性,隔离性,持久性,一致性.
2.事务的隔离级别:
2.1.脏读:这个太捞了,就是你没有提交的数据就可以读到数据
2.2.不可重复读:就是一个A事务不停读,B事务进行提交,A还在读,所以数据产生问题(这个用于数据修改)
2.3幻读:就是一个A事务不停读,B事务进行提交,A还在读,所以数据产生问题(这个用于插入和删除数据)
3.MySQL事务隔离级别(四种)
3.1.可重复读:不能解决幻读
3.2 .读未提交:什么问题都解决不了
3.3.不可重复读:不能解决 不可重复读和幻读
3.4.串行化:非常优秀没得一点问题,但是一般不使用,性能低.,对空间造成浪费
4.回滚.断点
4.1.回滚没啥好记得
4.2.保存点:有两组事务AB,CD,这样吧,每月15号放工资15000元,公司账户扣钱,你卡加钱成为一组事务AB.
还有你和银行的短信服务,花10块钱就有短信的那种,刚好这一段时间网不好,短信没发过来,你也没收到
叫做事务CD,例子可能不好你就这样理解,两组操作写在一起了,AB完成,CD未完成怎么办.算了看代码吧手录一段
//获取连接
Connection conn=null;//理解为已经获取到连接了,(不要和我杠)
try{
Statement.update(A);Statement.update(B);
SavePonit ap=new SavePoint();
sp.set();
Statement.update(C);Statement.update(D);
}catch(SqlException e){
if(sp!=null){
conn.commit();
}else{
conn.rollback();
}
}finally{
conn.close();
}
代码 分析:不管AB,CD 哪一个有问题都会跳到catch对吧,然后AB 出现问题sp必然为空 ,否则在异常情况下sp不为空提 交 AB,否则直接回滚到ABCD之前 .问题得以解决
上面这个图就是解释,但是我不太喜欢PPT.
1.
<!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd"> <hibernate-configuration> <session-factory > <!--1.配置数据库连接的4个参数 --> <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property> <property name="hibernate.connection.url">jdbc:mysql:///hibernate_day1</property> <property name="hibernate.connection.username">root</property> <property name="hibernate.connection.password">root</property> <!--是否显示sql语句 --> <property name="show_sql">true</property> <!-- 是否格式化sql语句 --> <property name="format_sql">true</property> <property name="hibernate.current_session_context_class">thread</property> <!-- 是否自动提交事务 --> <property name="hibernate.connection.autocommit">true</property> <!--<property name="hibernate.hbm2ddl.auto"></property> 配置映射文件与数据库表的关系, update:如果数据库没有表,自动帮你创建[常用] create:每次启动hibernate都帮你创建表 create-drop,每次启动hibernate都帮你创建表,执行完成后删除表 validate:检验hbm文件,如果与数据库的字段不一致,会抛出异常--> <property name="hibernate.hbm2ddl.auto">update</property> <property name="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</property> <!-- 配置JavaBean于表的映射关系 --> <mapping resource="domain/User.hbm.xml"/>//这个就是写的时候使用的一个模型的映射可以改
3.2
package untils; import org.hibernate.session; import org.hibernate.sessionfactory; import org.hibernate.cfg.configuration; public class hibernateutils { private static sessionfactory sessionfactory; static { configuration configuration=new configuration().configure();//读取配置文件 sessionfactory=configuration.buildsessionfactory();//使用Configureation获取会话工厂 //监听程序关闭,这部分代码就是在数据库操作完成之后将session对象和sessionFactory关闭 runtime.getruntime().addshutdownhook(new thread(){ @override public void run() { //关闭会话工厂 system.out.println("资源释放..."); getsession().close(); sessionfactory.close(); } }); } public static session getsession(){ return sessionfactory.opensession();//得到一个session,在hibernate中是session来操作数据库的 } public static session getcurrentsession(){ return sessionfactory.getcurrentsession(); } }
四.操作数据库(由于代码较多,不好查找,并且不能只看代码理解,所以以后不可不粘贴代码只写理解)
4.1,获取一个数据
session.get("填写sql或者hql","查询数据的类型");比如
User user=(User)session.get("sql语句",User.class).unique();
如果查询的是一堆数据的话后面就是.list,用ArrayList接收返回数据,之后遍历即可;
4.2,load和get的区别
其实就是懒加载和及时加载的问题,get是直接去数据库查询如果没有就返回空(null),而load就是默认存在数据然后
交给一个代理,懒加载原理就是默认存在,当你使用当这一个数据是才会到数据库查询,如果使用懒加载不存在数据的话
就会报一个运行时异常,这里记不清了,大家可以自行实践,好像是一个nullpointException吧
4.3 可以使用dbcp和c3p0来结合hibernate使用
这里不得不提c3p0和dbcp的区别的
4.3.1.c3p0在性能上回避我们的dbcp性能更高一点,因为dbcp如果你使用的个数超过了连接池个数就会全面崩盘,所有连接都断开
这依旧是看网课卡,甚至断线的原因之一,还有用分布式高并发处理问题时候用到一个技术叫hash分流技术,相当于一个布隆过滤器
而我们的c3p0这会使用LRU算法将长时间未使用的断开连接以达到拒绝卡顿,完美上网的作用.
4.3.2.其实这个就是把我们的配置文件进行读取获取连接.
五.hibernate里面的二级缓存
5.1二级缓存的类型:类缓存,对象缓存,时间戳缓存
<property name="hibernate.cache.use_second_level_cache">true</property>开启二级缓存.默认关闭的
写不动了,过两天再写^~^https://music.163.com/#/song?id=1415566662
框架SSH(Spring+Struts2+Hibernate)
原文:https://www.cnblogs.com/whr-blogs/p/12397157.html