Hibernate是一种自动化的OR映射的框架,对JDBC进行了二次封装,省去好多映射的工作。它是连接Java应用程序和关系数据的中间件(组件),对JDBCAPI进行了封装,负责JAVA对象的持久化(就是保持到数据库里),在分层软件体系中它位于持久化层,封装了所有数据访问细节,使业务逻辑层可以专注于实现业务逻辑。它能够建立面向对象的域模型和关系数据模型之间的映射。
本篇文章主要介绍Hibernate入门程序,使代码能跑起来,对代码进行简要解析,过于细节问题望读者自行查阅资料。
本文建立两个实体类User和Acticle为例,讲述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.testHibernate的package
4、在com.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&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_article和uc_user),表中有对应的列属性。
读者可依次测试getUser()、saveArticle()、listArticles()、searchArticle()方法。
8、文章到此结束,测试不成功可留言在评论区大家一起探讨。由于本人知识有限,本文内容或不严谨,忘读者能大胆指出!感谢您的阅读!