interlij idea创建给Web项目添加Hibernate
来源:互联网 发布:软件发布 编辑:程序博客网 时间:2024/06/01 12:33
0、相关知识
java框架篇—hibernate入门
Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,使得Java程序员可以随心所欲的使用对象编程思维来操纵数据库。 Hibernate可以应用在任何使用JDBC的场合,既可以在Java的客户端程序使用,也可以在Servlet/JSP的Web应用中使用,最具革命意义的是,Hibernate可以在应用EJB的J2EE架构中取代CMP,完成数据持久化的重任。
流程图:
核心接口
Hibernate的核心接口一共有6个,分别为:Session、SessionFactory、Transaction、Query、Criteria和Configuration。这6个核心接口在任何开发中都会用到。通过这些接口,不仅可以对持久化对象进行存取,还能够进行事务控制。下面对这6个核心接口分别加以介绍。
Session
Session接口负责执行被持久化对象的CRUD操作(CRUD的任务是完成与数据库的交流,包含了很多常见的SQL语句。)。但需要注意的是Session对象是非线程安全的。同时,Hibernate的session不同于JSP应用中的HttpSession。这里当使用session这个术语时,其实指的是Hibernate中的session,而以后会将HttpSession对象称为用户session。
SessionFactory
SessionFactory接口负责初始化Hibernate。它充当数据存储源的代理,并负责创建Session对象。这里用到了工厂模式。需要注意的是SessionFactory并不是轻量级的,因为一般情况下,一个项目通常只需要一个SessionFactory就够,当需要操作多个数据库时,可以为每个数据库指定一个SessionFactory。
Transaction
Transaction 接口是一个可选的API,可以选择不使用这个接口,取而代之的是Hibernate 的设计者自己写的底层事务处理代码。 Transaction 接口是对实际事务实现的一个抽象,这些实现包括JDBC的事务、JTA 中的UserTransaction、甚至可以是CORBA 事务。之所以这样设计是能让开发者能够使用一个统一事务的操作界面,使得自己的项目可以在不同的环境和容器之间方便地移植。
Query
Query接口让你方便地对数据库及持久对象进行查询,它可以有两种表达方式:HQL语言或本地数据库的SQL语句。Query经常被用来绑定查询参数、限制查询记录数量,并最终执行查询操作。
Criteria
Criteria接口与Query接口非常类似,允许创建并执行面向对象的标准化查询。值得注意的是Criteria接口也是轻量级的,它不能在Session之外使用。
Configuration
Configuration 接口的作用是对Hibernate 进行配置,以及对它进行启动。在Hibernate 的启动过程中,Configuration 类的实例首先定位映射文档的位置,读取这些配置,然后创建一个SessionFactory对象。虽然Configuration 接口在整个Hibernate 项目中只扮演着一个很小的角色,但它是启动hibernate 时所遇到的每一个对象。
以上内容转载自:java框架篇-hibernate入门
Hibernate是一款ORM(Object-Relationship Mapping)框架,常用于Java EE开发中,同样的orm有mybatis,Hibernate的思想是这样的。
1、生成数据库表映射到XML
2、由SessionFactory工厂类获得Session(这个session对应于数据库session,而不是web的session)
3、通过Session执行HQL语句,完成数据库操作(主要操作是这一步,用Hibernate都是跟Session打交道)
4、HQL之前后可以加入Transaction(Transaction可以理解成数据库的事务)
PS:这是在hibernate官网的做法叫做native api,就是原生操作,官网还有其他操作用法,具体去官网了解。
其他Hibernate的相关知识还有:XML配置多表关系(one-to-many,many-to-one等)、级联操作、延迟加载、缓存技术
其实可以看到,这些数据库都有的操作,使用框架实现。
这篇文章并不讲这些只是,仅仅是一篇框架搭建文章,不涉及技术。
1、系统环境
IDE:InterliJ IDEA 2017.1.4
jdk版本:1.8
Maven版本:3.5
Hibernate版本:5.X
数据库:MySQL 5.7 包含user表的sql脚本
maven的目录规定是这样的:
2、创建项目
最后点finish
点Enable Auto-import
3、发布项目
点ok
点运行,搞定
若报错,可能是maven缺少一个依赖
<!-- ********************** Java Servlet API 4.0.0-b01 ********************** --> <dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>4.0.0-b01</version> </dependency>
添加进去就正常了
4、添加Hibernate
添加如下依赖:
<!-- ********************** Java Servlet API 4.0.0-b01 ********************** --> <dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>4.0.0-b01</version> </dependency> <!-- ********************** JUnit 4.12 ********************** --> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> </dependency> <!-- ********************** Hibernate 5.0.6.Final ********************** --> <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-core</artifactId> <version>5.0.6.Final</version> </dependency> <!-- ********************** MySQL 5.1.38 ********************** --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.38</version> </dependency> <!-- ********************** Java Transaction API 1.1 ********************** --> <dependency> <groupId>javax.transaction</groupId> <artifactId>jta</artifactId> <version>1.1</version> </dependency>
创建项目步骤的新建java目录并改变为source root必须做,次啊能正确生生成。
信息自己填了。
点ok生成
6、创建HibernateSessionFactory
创建一个工厂,生成session代码如下:
package util;import org.hibernate.HibernateException;import org.hibernate.Session;import org.hibernate.service.ServiceRegistry;import org.hibernate.boot.MetadataSources;import org.hibernate.boot.registry.StandardServiceRegistryBuilder;/** * Configures and provides access to Hibernate sessions, tied to the * current thread of execution. Follows the Thread Local Session * pattern, see {@link http://hibernate.org/42.html }. */public class HibernateSessionFactory { /** * Location of hibernate.cfg.xml file. * Location should be on the classpath as Hibernate uses * #resourceAsStream style lookup for its configuration file. * The default classpath location of the hibernate config file is * in the default package. Use #setConfigFile() to update * the location of the configuration file for the current session. */ private static final ThreadLocal<Session> threadLocal = new ThreadLocal<Session>(); private static org.hibernate.SessionFactory sessionFactory; private static ServiceRegistry serviceRegistry; static { try { serviceRegistry = new StandardServiceRegistryBuilder().configure().build(); try { sessionFactory = new MetadataSources(serviceRegistry).buildMetadata().buildSessionFactory(); } catch (Exception e) { StandardServiceRegistryBuilder.destroy(serviceRegistry); e.printStackTrace(); } } catch (Exception e) { System.err.println("%%%% Error Creating SessionFactory %%%%"); e.printStackTrace(); } } private HibernateSessionFactory() { } /** * Returns the ThreadLocal Session instance. Lazy initialize * the <code>SessionFactory</code> if needed. * * @return Session * @throws HibernateException */ public static Session getSession() throws HibernateException { Session session = (Session) threadLocal.get(); if (session == null || !session.isOpen()) { if (sessionFactory == null) { rebuildSessionFactory(); } session = (sessionFactory != null) ? sessionFactory.openSession() : null; threadLocal.set(session); } return session; } /** * Rebuild hibernate session factory */ public static void rebuildSessionFactory() { try { serviceRegistry = new StandardServiceRegistryBuilder().configure().build(); try { sessionFactory = new MetadataSources(serviceRegistry).buildMetadata().buildSessionFactory(); } catch (Exception e) { StandardServiceRegistryBuilder.destroy(serviceRegistry); e.printStackTrace(); } } catch (Exception e) { System.err.println("%%%% Error Creating SessionFactory %%%%"); e.printStackTrace(); } } /** * Close the single hibernate session instance. * * @throws HibernateException */ public static void closeSession() throws HibernateException { Session session = (Session) threadLocal.get(); threadLocal.set(null); if (session != null) { session.close(); } } /** * return session factory */ public static org.hibernate.SessionFactory getSessionFactory() { return sessionFactory; }}
在web.xml添加如下:
<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd" ><web-app> <display-name>Archetype Created Web Application</display-name> <servlet> <servlet-name>HibernateDemo</servlet-name> <servlet-class>servlet.servlet</servlet-class> </servlet> <!--添加如下4行--> <servlet-mapping> <servlet-name>HibernateDemo</servlet-name> <url-pattern>/HibernateServletDemo</url-pattern> </servlet-mapping></web-app>
Hibernate配置文件如下:
<?xml version='1.0' encoding='utf-8'?><!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD//EN" "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd"><hibernate-configuration> <session-factory> <property name="connection.username" >root</property> <property name="connection.password">root</property> <property name="connection.url">jdbc:mysql://localhost:3306/networkalbum?useSSL=false&characterEncoding=utf-8&useUnicode=true</property> <property name="connection.driver_class">com.mysql.jdbc.Driver</property> <mapping resource="POJO/user.xml"/> <mapping class="POJO.UserEntity"/> <!-- <property name="connection.username"/> --> <!-- <property name="connection.password"/> --> <!-- DB schema will be updated if needed --> <!-- <property name="hbm2ddl.auto">update</property> --> </session-factory></hibernate-configuration>
HibernateDemo这个servlet的代码:
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request,response); } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setCharacterEncoding("utf-8"); request.setCharacterEncoding("utf-8"); List<UserEntity> list = HibernateSessionFactory.getSession().createQuery("from UserEntity ").list(); PrintWriter writer = response.getWriter(); for (UserEntity user:list) { writer.write(user.getId()+""); writer.append(user.getName()); System.out.println(user.toString()); writer.write("\n"); } }
ps:发现一个bug,writer.write(user.getId());其中user.getId()的值是int类型,如果直接输出int类型浏览器会认为是其他类型的文件,浏览器不解析response的输出。
- interlij idea创建给Web项目添加Hibernate
- interlij idea创建给Web项目添加struts2
- interlij idea创建给Web项目添加SS2H
- interlij idea创建给Web项目添加Mybatis
- interlij idea创建给Web项目添加SS2M
- interlij idea创建给Web项目添加Mybatis
- interlij idea给Web项目添加SSM
- interlij idea给Web项目添加SSM(零配置文件
- IDEA 创建web项目
- idea创建web项目
- IDEA创建WEB项目
- Idea创建web项目
- idea创建web项目
- IntelliJ IDEA创建Web SpringMVC项目(二):添加springMVC框架
- IntelliJ IDEA创建Web SpringMVC项目(二):添加springMVC框架
- 利用Idea创建web项目
- idea 创建maven web 项目
- idea 创建一个web项目
- iperf详细使用图文教程
- js第一节课
- go语言log包的学习(log,Logger)
- SSH:解决Spring整合quartz定时任务执行两次问题
- 机器学习竞赛技巧
- interlij idea创建给Web项目添加Hibernate
- Django来敲门~第一部分【3. 创建第一个项目】
- Hive中管理表(内部表)和外部表的区别是什么,及分区表使用场景
- OpenCV从Mat中提取某些行或列
- LIBRARY_PATH和LD_LIBRARY_PATH的区别
- P1481 魔族密码
- 1166: 阶乘问题(一) [数学
- 第一次使用Android Studio时你应该知道的一切配置(一)
- SQL Server 事务隔离级别详解