SSH自学笔记
2、
表示层:struts
业务层:spring采用ioc和aop的思想。
持久层:hibernate采用orm思想。
配置hibernate时,session工厂不用选,还有就是要预先建立mysql数据库连接,
利用datebase逆向工程可以生成实体类,生成映射文件并更新映射文件,idgenerator选择native自增长类型,“下一步”,idgenerator选择native,propertyname填写参数的别名,不该也行,然后,项目下面就会生成一个对应表的实体类,
配置spring时,正常配置就行,不用特别修改。
Hibernate中,一个数据库表逆向生成一个持久化类,每个持久化类对属性的存取方法使用了标准javabean命名约定,同时把类属性的访问级别设为私有。这是推荐的设计,但并不是必须的。
所有的持久化类都要求有无参的构造器,因为hiberate必须使用java反射机制为你创建对象。
Hibernate需要知道怎么去加载和存储持久化类的对象,这正是hibernate映射文件发挥作用的地方。映射文件中的column属性告诉hibernate,我们使用表的哪个字段作为主键,嵌套元素generator指定了标识符生成策略,在这里我们指定native(自增长,主键),assign(手工赋值,主键),foreign(较少使用,此主键又为外键),hibernate强烈建议给每个表加一个自增长的类id只能出现一次,表示主键,column一定是指数据库表列名,property,id指的是实体类属性名。他根据已配置的数据库方言自动选择最佳的标识符生成策略。Property元素的name属性告诉hibernate使用哪个getter和setter方法。
持久化:就是将程序数据在瞬时状态和持久状态之间相互转化。
DAO:DAO是一种模式,业务逻辑和数据访问解耦合。
ORM:对象关系映射,是DAO接口针对关系型数据库的一种实现,本质上就是一个DAO实现类。
Hibernate逆向工程:生成实体类,映射文件,配置文件。
Hibernate的三种状态:临时态(未受管理),持久态,游离态(未受管理)。
临时态:新建;持久态:save,update;游离态:session.clear(),session.close()之后。
临时态和游离态的区别:游离态:数据库中有与之对应的数据。临时态:数据库中不一定有与之对应的数据。
持久态的数据在事务提交时,自动与数据库对应表记录自动匹配,把程序对象值赋给数据库值。
游离态一定是由持久态转化而来的。
13、一对多:从POJO对象看,在一的一方有多的一方的set集合,多的一方有一的一方的实体类。
14、从配置文件看:
多对一:一的一方有<set>节点,其内部有<ont-to-many>节点,多的一方有<many-to-one>的节点。
单项一对多:只在一的一方有多的一方的set集合,多的一方没有一的一方的实体类。
延迟加载:session必须处于打开状态。
Order-by="title",设置根据什么进行排序。一的一方set内多方集合中实体的排序方式。
Cascade:表示是否进行级联操作。
All:对所有操作都进行级联;
None:对所有操作都不进行级联;
Save-update:执行更新操作时级联;
Delete:执行删除时级联操作。
inverse:是“反转”的意思,表示关联关系的控制权,即按照关联的某一方的对象状态来同步更新数据库。为true,表示有对方负责,为false,表示有自己负责。
主键关系的一对一,两种实现:
主键关系的一对一,不允许使用延迟加载,lazy的值都为false。
外键关系的一对一,主键方依然为即时加载,但外键方为延迟加载。
首先配置数据库,子表的主键依赖于父表的主键,父表的主键自动增长,子表的主键非自动增长。然后,逆向生成映射文件,并修改映射文件,在父表java文件中,添加字表的实体类和方法,删除set的相关信息。在主表的映射文件中,删除set的相关信息,在字表的映射文件中,删除many-to-one的相关信息。在主表的映射文件中,添加<one-to-onename="women"class="com.xaygc.Women"/>(其中的women字段对应父表中的子表实体类名称。)然后,在子表的映射文件中,添加<one-to-onename="men"class="com.xaygc.Men"/>(其中的men字段对应子表中父表实体类名称)。然后,修改子表的映射文件:
<generatorclass="foreign">
<paramname="property">men</param>
</generator>
其中的men和下面的one-to-one的表中的name名字是一样的。
外键关系的一对一。
Hibernate的即时加载和延迟加载:
即时加载:不管是否使用,马上从数据库中取出,放入内存。如:session.get()方法。优点:响应速度快,效率高,不需要session一直处于打开状态。缺点:占用资源多。
延迟加载:代码执行后,并不马上执行sql语句从数据库中获取数据,而是在使用对象时才加载,如:session.load()方法。优点:占用资源少。缺点:相应速度慢,需要session一直处于打开状态。
注意:如果使用延迟加载,session要一直处于open状态,否则会报异常。