用Eclipse搭建ssh框架
问:ssh是哪三大框架,以及他们的作用是什么?
答:分别是struts,spring,hibernate.
struts的作用是:是web层,其核心是mvc模式,他可以自动获取参数,自动类型转换,自动页面跳转(将业务接口返回的结果包装起来发送给指定的视图,并由视图完成处理结果的展现),还有一个就是做一些简单的校验或者是国际化工作。
spring的作用是:是业务层,采用IOC和AOP,是用于项目解耦。
hibernate的作用是:数据层,数据库的封装
事先需要做的准备工作:
1.安装jdk,这里就不多说了,我使用的是jdk1.8
2.需要用到的工具:eclipse,mysql等等
好,接下来我们就开始创建项目了。
第一步:创建一个叫做ssh的项目吧。但是得提醒大家不要忘记勾选web.xml文件,请看如下截图。
第二步:搭建struts2环境
首先;引入struts2的包
接下来需要修改WEB-INF里面的web.xml文件
由于待会我们就要引入spring了,所以这个监听器我们这里一块配置
第三小步就是添加我们的struts.xml文件了
接下来我们需要创建一个action类,名字就叫做indexAction吧
中间的话我们先相应的建一个dao类和service类
刚刚的那个注入,也就替换了以前的new对象。
接下来我们来先建jsp文件,我们先不写里面的内容,只是把流程弄出来
第三步:搭建spring和hibernate的环境
首先我们也是需要导包的
这里我们的文件和源码是不需要导进来的
到这里包并没有导完,还需要导struts2-spring的包
如下:
接着我们导hibernate需要的包
接着我们来看看我们的实现类
同理dao的实现类也是一样的
hibernate包导完了我们就可以用sessionFactory注入了
接下来我们编写applicationContext.xml文件
看到实体类的映射文件我这里就随便举个例子说下
接着我们继续弄applicateContext.xml文件
如上图那样的话我们需要在自己写一份jdbc的属性,所以我们需要在头部导入
接着我们需要创建一份jdbc.properties
现在我们来运行,发现程序报错了
然后发现是c3p0的架包没有导入
再来运行
看到这里我们就知道框架搭建成功了
下面是我画的一张流程图,大家可以参考下
接下来我来跟大家分享用EntityManagerFactory来实现上面一样的功能
由于这样的话我们需要在dao的实现类注入EntityManagerFactory,
代码如下:
package dao; import java.util.List; import javax.persistence.EntityManager; import javax.persistence.EntityManagerFactory; import javax.persistence.PersistenceContext; import entity.BookCard; public class IndexDaoImpl implements IndexDao { //注入: //private SessionFactory sf; //public void setSf(SessionFactory sf) { //this.sf = sf; //} @PersistenceContext private EntityManagerFactory emf; public void setEmf(EntityManagerFactory emf) { this.emf = emf; } @Override public List<BookCard> getAllBookCard(){ //这个是没有交给spring去做的实例化对象 //sf=new Configuration().configure().buildSessionFactory(); //Session session=sf.openSession();//实例化session //session.beginTransaction();//实例化一个事务 /*List<BookCard> list= session.createQuery("from BookCard").getResultList(); session.getTransaction().commit(); session.close(); //sf.close(); */ EntityManager entityManager=emf.createEntityManager(); List<BookCard> list=entityManager.createQuery("from BookCard",BookCard.class).getResultList(); entityManager.close(); //emf.close(); return list; } }
大家可以做个对比,其实大同小异
但是EntityManagerFactory需要persistence.xml
代码如下
<?xml version="1.0" encoding="UTF-8"?> <persistence version="1.0" xmlns:persistence="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence persistence_2_1.xsd "> <persistence-unit name="jpa" transaction-type="RESOURCE_LOCAL"> <provider>org.hibernate.jpa.HibernatePersistenceProvider</provider><!-- 驱动实现类,入口类 --> <mapping-file>entity/BookCard.hbm.xml</mapping-file> <properties> <!-- Common properties --> <property name="hibernate.dialect" value="org.hibernate.dialect.MySQL5Dialect"></property> <property name="hibernate.show_sql" value="true"></property> <property name="hibernate.format_sql" value="true"></property> <property name="hibernate.hbm2dll.auto" value="update"></property> <property name="hibernate.connection.driver_class" value="com.mysql.jdbc.Driver"></property> <property name="hibernate.connection.url" value="jdbc:mysql://localhost:3306/CardDB"></property> <property name="hibernate.connection.username" value="root"></property> <property name="hibernate.connection.password" value="123456"></property> </properties> </persistence-unit> </persistence>
当然也别忘了applicationContext.xml里面需要配置,如下:
<bean id="myEntityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
<property name="persistenceUnitName" value="jpa" />
</bean>
这里还需要说的一个就是,如果实体类.hbm.xml删除了,那就要配着注解才可以使用。
下面是实体类的映射文件,如下:
<?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> <hibernate-mapping package="entity"> <!-- 这里的名和数据库那边一一对应,不写则默认一样 --> <class name="BookCard" table="BookCard"> <id name="cid" column="cid"> <generator class="increment"/> </id> <property name="name"></property> <property name="sex"></property> <property name="cardDate" column="cardDate"></property> <property name="deposit"></property> </class> </hibernate-mapping>
再次声明一下,如果删除了映射文件,那么就要在实体类那边注解。
现在,我们把实体类的映射文件删了,但是我们要在实体类那边加上注解,如下:
package entity; import java.math.BigDecimal; import java.util.Date; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.Id; import javax.persistence.Table; @Entity @Table(name="BookCard")//如果不加则表明类名和表名相同 public class BookCard { private int cid ; private String name; private String sex ; private Date cardDate; private BigDecimal deposit; public BookCard() { super(); } public BookCard(String name, String sex, Date cardDate, BigDecimal deposit) { super(); this.name = name; this.sex = sex; this.cardDate = cardDate; this.deposit = deposit; } @Id @GeneratedValue(generator="increament") public int getCid() { return cid; } public void setCid(int cid) { this.cid = cid; } @Column public String getName() { return name; } public void setName(String name) { this.name = name; } @Column public String getSex() { return sex; } public void setSex(String sex) { this.sex = sex; } @Column public Date getCardDate() { return cardDate; } public void setCardDate(Date cardDate) { this.cardDate = cardDate; } @Column public BigDecimal getDeposit() { return deposit; } public void setDeposit(BigDecimal deposit) { this.deposit = deposit; } }
运行结果如下: