Eclipse创建Hibernate入门实例代码详细解析

Hibernate是一种自动化的OR映射的框架,对JDBC进行了二次封装,省去好多映射的工作。它是连接Java应用程序和关系数据的中间件(组件)JDBCAPI进行了封装,负责JAVA对象的持久化(就是保持到数据库里),在分层软件体系中它位于持久化层,封装了所有数据访问细节,使业务逻辑层可以专注于实现业务逻辑。它能够建立面向对象的域模型和关系数据模型之间的映射。

本篇文章主要介绍Hibernate入门程序,使代码能跑起来,对代码进行简要解析,过于细节问题望读者自行查阅资料。

本文建立两个实体类UserActicle为例,讲述Hibernate入门。

废话不多说,代码说话。

1、eclipse创建maven([ˈmevən])工程(这里认为读者maven已配置好或已安装插件)



2、打开pom.xml文件,加上依赖代码获取必要jar包,这里给出示例(可全部直接复制)
<projectxmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0http://maven.apache.org/xsd/maven-4.0.0.xsd">

  <modelVersion>4.0.0</modelVersion>

  <groupId> Hibernate </groupId>

  <artifactId>Hibernate</artifactId>

  <version>0.0.1-SNAPSHOT</version>

  <dependencies>

      <!--单元测试-->

      <dependency>

         <groupId>junit</groupId>

         <artifactId>junit</artifactId>

         <version>4.12</version>

      </dependency>

      <!--hibernate核心-->

      <dependency>

         <groupId>org.hibernate</groupId>

         <artifactId>hibernate-core</artifactId>

         <version>5.0.9.Final</version>

      </dependency>

      <!--记录日志-->

      <dependency>

         <groupId>org.slf4j</groupId>

         <artifactId>slf4j-log4j12</artifactId>

         <version>1.7.2</version>

      </dependency>

      <!--数据库连接-->

      <dependency>

         <groupId>mysql</groupId>

         <artifactId>mysql-connector-java</artifactId>

         <version>5.1.15</version>

      </dependency>

   </dependencies>

</project>
完成后保存pom.xml文件,右击项目名称àMavenàUpdate Maven,然后查看MavenDependencies是否更新所需jar包如图:


3、src/main/java新建名com.testHibernatepackage

4com.testHibernate中创建实体类User.java,代码如下:
package com.testHibernate;

importjavax.persistence.Column;

importjavax.persistence.Entity;

importjavax.persistence.GeneratedValue;

importjavax.persistence.Id;

 

importorg.hibernate.annotations.GenericGenerator;

 

@Entity(name="uc_user")//表示被标示的User类对应数据库中的uc_user

publicclass User {

      @Id

      @GeneratedValue(generator="uuid")//主键生成器策略

      @GenericGenerator(name="uuid",strategy="uuid")//自定义主键生成器

      private String id;//作者id

      @Column(length=20,nullable=false)

      private String name;//作者名字

      @Column(length=3)

      private Integer age;//作者年龄

      public String getId() {

           return id;

      }

      public void setId(String id) {

           this.id = id;

      }

      public String getName() {

           return name;

      }

      public void setName(String name) {

           this.name = name;

      }

      public Integer getAge() {

           return age;

      }

      public void setAge(Integer age) {

           this.age = age;

      }

     

}

5、在com.testHibernate中创建实体类Article.java,代码如下:

package com.testHibernate;

import java.util.Date;

import javax.persistence.Column;

import javax.persistence.Embeddable;

import javax.persistence.Entity;

import javax.persistence.GeneratedValue;

import javax.persistence.Id;

import javax.persistence.ManyToOne;

import javax.persistence.Temporal;

import javax.persistence.TemporalType;

 

import org.hibernate.annotations.Generated;

import org.hibernate.annotations.GenericGenerator;

import org.hibernate.annotations.ManyToAny;

 

@Entity(name="news_article")//表示被标示的Article类对应数据库中的news_article

public class Article {

      @Id//表示下面的id字符串为主键

      @GeneratedValue(generator="uuid")//主键生成器策略

      @GenericGenerator(name="uuid",strategy="uuid")//自定义主键生成器

      private String id;//文章id

      @Column(length=1000)//指定title列属性的长度为1000

      private String title;//文章标题

      @Column(length=20,nullable=false)//指定title列属性的长度为20,不能为空

      private String content;//文章内容

      @Temporal(TemporalType.TIMESTAMP)//得到形如'HH:MM:SS'格式的日期

      private Date creatTime=new Date();//文章日期

      @ManyToOne//指定多对一的关系,Article->User是多对一关系

      private User user;//文章作者

      public User getUser() {

           return user;

      }

      public void setUser(User user) {

           this.user = user;

      }

      public String getId() {

           return id;

      }

      public void setId(String id) {

           this.id = id;

      }

      public String getTitle() {

           return title;

      }

      public void setTitle(String title) {

           this.title = title;

      }

      public String getContent() {

           return content;

      }

      public void setContent(String content) {

           this.content = content;

      }

      public Date getCreatTime() {

           return creatTime;

      }

      public void setCreatTime(Date creatTime) {

           this.creatTime = creatTime;

      }

}

6、配置hibernate.cfg.xml文件
src/main/resources新建hibernate.cfg.xml文件,可参考代码如下:
<?xml version='1.0' encoding='utf-8'?>

<!DOCTYPEhibernate-configurationPUBLIC

        "-//Hibernate/HibernateConfiguration DTD 3.0//EN"

        "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">

<hibernate-configuration>

    <session-factory>

        <propertyname="connection.driver_class">com.mysql.jdbc.Driver</property>

        <!-- 数据库连接驱动 -->

        <propertyname="connection.url">jdbc:mysql://127.0.0.1:3306/mybatis?useUnicode=true&amp;characterEncoding=utf-8</property>

        <!-- 数据库所在url,数据库名为mybatis,设置编码为utf-8 -->

        <propertyname="connection.username">root</property>

        <propertyname="connection.password">root</property>

        <!-- 数据库用户名和密码 -->

        <propertyname="connection.pool_size">1</property>

        <!-- 连接池 -->

        <propertyname="dialect">org.hibernate.dialect.MySQL5Dialect</property>

        <!--设置使用sql方言-->

        <propertyname="cache.provider_class">org.hibernate.cache.internal.NoCacheProvider</property>

        <!-- 禁用二级缓存  -->

        <!--开启二级缓存 

       <propertyname="cache.provider_class">org.hibernate.cache.HashtableCacheProvider</property>

       <propertyname="cache.region.factory_class">org.hibernate.cache.EhCacheRegionFactory</property>

       <propertyname="net.sf.ehcache.configurationResourceName">ehcache.xml</property>

        -->

        <!--在控制台能打印sql语句-->

        <propertyname="show_sql">true</property>

        <propertyname="hbm2ddl.auto">update</property>

        <!--

         create:先删除,再创建

         update:如果表不存在就创建,不一样就更新,一样就什么都不做。

         create-drop:初始化时创建表,SessionFactory执行close()时删除表。

         validate:验证表结构是否一致,如果不一致,就抛异常。

       -->

       <mappingclass="com.mashensoft.User"/>

       <mappingclass="com.mashensoft.Article"/>

       <!-- 类所在路径的映射 -->

    </session-factory>

</hibernate-configuration>

7、新建log4j.properties属性文件
src/main/resources新建log4j.properties属性文件,可参考代码如下:


log4j.rootLogger=INFO,console

log4j.appender.console=org.apache.log4j.ConsoleAppender

log4j.appender.console.layout=org.apache.log4j.PatternLayout

log4j.appender.console.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss,SSS} [%c]-[%p]%m%n

log4j.logger.java.sql=DEBUG  



该属性文件主要是用来记录日志,读者若想详细了解可自行查阅资料。

 

6、创建测试类MainTest.java如下:

package com.testHibernate;

import java.util.List;

import org.hibernate.Criteria;

import org.hibernate.Session;

import org.hibernate.SessionFactory;

import org.hibernate.boot.MetadataSources;

import org.hibernate.boot.registry.StandardServiceRegistry;

importorg.hibernate.boot.registry.StandardServiceRegistryBuilder;

import org.hibernate.criterion.Restrictions;

import org.junit.BeforeClass;

import org.junit.Test;

import org.slf4j.Logger;

import org.slf4j.LoggerFactory;

 

 

public class MainTest {

   private static Logger log = LoggerFactory.getLogger(MainTest.class);

   //取得MainTest类的测试日志,可在后面编写代码打印在控制台上

   private static SessionFactory sessionFactory;

   //声明会话工厂

   private Useruser;

   //声明用户

   @BeforeClass//@BeforeClass在该类初始化时初始化注册表

   public static void init() {

      StandardServiceRegistryregistry =null;

      //初始化注册表

      try {

         registry = newStandardServiceRegistryBuilder().configure().build();

         sessionFactory =new MetadataSources(registry).buildMetadata().buildSessionFactory();

         log.info("sessionFactory初始化完成!");//打印日志

      } catch (Exceptione) {

         log.error("init:",e);

         StandardServiceRegistryBuilder.destroy(registry);

      }

   }

 

   // 添加用户

   @Test

   public void addUser() {

      Session session = sessionFactory.openSession();//获取会话

      try {

         session.beginTransaction();//开启事务

         User user = new User();

         user.setName("小明");//添加用户名

         user.setAge(10);//年龄

         session.save(user);//保存用户

         session.getTransaction().commit();//提交事务

         session.close();//别忘了要关闭

      } catch (Throwablee) {

         e.printStackTrace();

         session.getTransaction().rollback();//事务回滚

      }

 

   }

 

   // 查看用户

   @Test

   public void getUser() {

      Session session=sessionFactory.openSession();

      String id="这里填写你数据库表中的id名";

      this.user=session.get(User.class,id);

      session.close();

      log.info("username:"+user.getName());

    

   }

  

   //发表文章

   @Test

   public void saveArticle(){

      getUser();

      Article ar1=new Article();

      ar1.setTitle("测试文章");

      ar1.setContent("这是一篇测试文章");

      ar1.setUser(user);

      Session session=sessionFactory.openSession();

      session.beginTransaction();

      session.save(ar1);

      session.getTransaction().commit();//提交事务

      session.close();

     

   }

 

   // 查看某个用户的所有文章

   @Test

   public void listArticles() {

      getUser();

      Session session=sessionFactory.openSession();

      Criteria cri=session.createCriteria(Article.class);

      //标准查询接口

      cri.add(Restrictions.eq("user",this.user));

      List<Article>artlist=cri.list();

      for(Articlear:artlist){

         log.info("文章标题:"+ar.getTitle());

      }

      session.close();

   }

 

   // 搜索文章并可以查看所属人

   @Test

   public void searchArticle() {

      Session session=sessionFactory.openSession();

      Criteria cri=session.createCriteria(Article.class);

      cri.add(Restrictions.like("title","测试%"));

      List<Article>artlist=cri.list();

      for(Articlear:artlist){

         log.info("文章标题:"+ar.getTitle()+",所属用户:"+ar.getUser().getName());

      }

      session.close();

   }

}

读者可依次测试各方法。

首先把光标放在addUser()方法任意位置,右击鼠标->Run as->JunitTest。如果测试通过,在你数据库中会被新建两个表(news_articleuc_user),表中有对应的列属性。

读者可依次测试getUser()saveArticle()listArticles()searchArticle()方法。

8、文章到此结束,测试不成功可留言在评论区大家一起探讨。由于本人知识有限,本文内容或不严谨,忘读者能大胆指出!感谢您的阅读!

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值