orm环境创建及demo


ORM概念

ORM即Object/Relation Mapping, 对象/关系数据库映射。ORM是一种规范,完成面向对象编程语言到关系数据库之间的映射。J2EE中的JPA就是一种ORM规范。

ORM框架有很多,例如JPA, Hibernate,iBATIS等。

Hibernate简介

Hibernate是JBoss旗下,同时也是RetHat组织的产品(JBoss加入了RetHat),是目前非常流行的ORM框架。

Hibernate中的重要概念为PO(Persistent Object), Hibernate采用低入侵的设计,这里的PO完全是一个普通的java类(POJO),其数据库操作功能完全由Hibernate实现,不需要POJO实现任何接口或者继承任何超类。

Hibernate环境搭建(Eclipse环境)

1.下载框架
  • Hibernate框架,官网下载 http://www.hibernate.org/downloads 

目前最新版是5.2.2,为了兼容和稳定起见我下载的是4.3.11版,hibernate-release-4.3.11.Final.zip ,解压后看到主要目录如下,

-project , 这个目录下放了很多demo project

-documentation 下面放了各种文档和教程,最重要的应该是Hibernate API, 即 javadocs

-lib 下面有很多二级目录,里面放了各种jar包,Hibernate是模块化的,其中required是Hibernate框架基础jar包,其他目录是一些扩展包,例如lib\optional\c3p0下面放了数据库连接池的jar包。

  • 另外,还需要下载日志框架包SLF4J,Hibernate会用它来在执行时候输出日志。

我下载的是1.6.1版本,可以在官网的数据仓库中找到  http://www.slf4j.org/dist/

2. 导入各种jar包

先在Eclipse中新建一个project,然后新建一个user library,例如叫做 hibernate-4-3-11,注意不要勾选system library,否则后面在读取Hibernate配置文件时候一直会报 java.lang.NullPointerException 异常。

导入以下jar包

-hibernate下的 lib\require下的所有jar包(10个),这是框架基本jar包

-hibernate下的lib\optional\c3p0的所有jar包,这是数据库连接池jar包,为Hibernate框架提供数据源

-slf4框架下的slf4j-api-1.6.1.jar (这是api) 和 slf4j-nop-1.6.1.jar (这是具体实现) 两个包

 我将所有jar包集中放在了一个目录里方便今后迁移,所有jar包如下,

将以上15个jar都添加进user library中去。

3.创建一个实体类

New类将要用来与数据库中的一张表对应,它只是一个普通类(POJO),我们放在src/hib路径下,后面Hibernate将会根据配置文件创建数据表

复制代码
 1 package hib;
 2 
 3 public class News {
 4     public int getId() {
 5         return id;
 6     }
 7     public void setId(int id) {
 8         this.id = id;
 9     }
10     public String getTitle() {
11         return title;
12     }
13     public void setTitle(String title) {
14         this.title = title;
15     }
16     public String getContent() {
17         return content;
18     }
19     public void setContent(String content) {
20         this.content = content;
21     }
22     private int id;
23     private String title;
24     private String content;
25     
26 }
复制代码
4.创建表映射文件

在News类相同的路径下创建一个xml文件News.hbm.xml,这个文件与News.java对应,叫做映射文件,是一个Hibernate将依据这个文件操作数据库。

通过某些插件,可以依据实体类News.java 自动创建News.hbm.xml,不过我还是先收工创建一下。

复制代码
 1 <?xml version="1.0"  encoding="UTF-8"?>    
 2 <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"  
 3 "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">  
 4 
 5 <hibernate-mapping package="hib">
 6     <class name="News" table="news_table">
 7         <id name="id" column="id">
 8             <generator class="identity" />
 9         </id>
10         <property name="title" type="string" column="title" />
11         <property name="content" type="string" column="content" />
12     </class>
13 </hibernate-mapping>
复制代码

News.hbm.xml的语法在Hibernate提供的手册(hibernate-release-4.3.11.Final/documentation/manual/en-US/html_single/index.html)1.1.3. The mapping file 中已经有详细描述,

每一个持久化的实体类(例如上面的News.java),都需要有一个到数据表的映射,这里的<class>元素就是一个映射

表的主键用<id>元素表示,其他字段则用<property>元素表示,每个字段元素中可以添加name, colume, type属性,分别表示字段名称和类型

5.创建Hibernate主配置文件

Hibernate配置文件的默认名称是Hibernate.cfg.xml,我们创建这个文件并放在src根目录,文件内容如下,

复制代码
 1 <?xml version="1.0" encoding="UTF-8"?>  
 2 <!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN"  
 3                                          "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">  
 4 
 5 <hibernate-configuration>
 6     <session-factory>
 7     
 8         <property name="connection.driver_class">com.mysql.jdbc.Driver</property>
 9         <property name="connection.url">jdbc:mysql://127.0.0.1:3306/think_blog?useUnicode=true&amp;characterEncoding=UTF-8</property> <!-- 指定字符集的方式-->
10         <property name="connection.username">root</property>
11         <property name="connection.password"></property> 
12 
13         <property name="hibernate.c3p0.max_size">20</property>
14         <property name="hibernate.c3p0.min_size">1</property>
15     
16         <property name="hibernate.c3p0.timeout">5000</property>
17     
18         <property name="hibernate.c3p0.max_statements">100</property>
19         <property name="hibernate.c3p0.idle_test_period">3000</property>
20         <property name="hibernate.c3p0.acquire_increment">2</property>
21         <property name="hibernate.c3p0.validate">true</property>
22         <property name="dialect">org.hibernate.dialect.MySQLDialect</property> <!--数据库方言-->
23       <!--自动建表及打印sql -->
24         <property name="hbm2ddl.auto">update</property>
25         <property name="show_sql">true</property>
26         <mapping resource="hib/News.hbm.xml" />
27     </session-factory>
28 </hibernate-configuration>
复制代码

 

 对上面的关键点解释如下:

  • 数据库连接字符串:如果要指定字符集,在url后面加上?useUnicode=true&characterEncoding=UTF-8, 但因为url要放在xml文件中,需要将&符号转义成"&amp;"
  • 我也使用使用<property name="connection.charset">utf8</property> 这种方式兼容中文,但是好像并不起作用
  • 数据库方言:我使用的是MySQL数据库,最开始我使用的数据库方言配置是org.hibernate.dialect.MySQLInnoDBDialect,但是发现无法通过Hibernate自动建表,后来发现换成org.hibernate.dialect.MySQLDialect就行了。
  • 所有数据库方言配置可以在手册中找到 ,hibernate-release-4.3.11.Final/documentation/manual/en-US/html_single/index.html#tutorial-firstapp-mapping 的 3.4.1. SQL Dialects
  • 是否根据实体类和映射文件自动建表:<property name="hbm2ddl.auto">update</property>
  • 打印SQL到控制台:<property name="show_sql">true</property>
6. 创建测试类

NewsManager也放在hib路径下,在这个类中初始化Hibernate执行数据库操作

复制代码
 1 package hib;
 2 
 3 import org.hibernate.Session;
 4 import org.hibernate.SessionFactory;
 5 import org.hibernate.Transaction;
 6 import org.hibernate.cfg.Configuration;
 7 
 8 public class NewsManager {
 9     public static void main(String[] args) {
10         //实例化Configuration
11         //configure()方法默认加载  /hibernate.cfg.xml
12         Configuration conf = new Configuration().configure();
13         //用Configuration创建SessionFactory
14         SessionFactory sf = conf.buildSessionFactory();
15         //用SessionFactory打开Session
16         Session sess = sf.openSession();
17         //开始事务
18         Transaction tx = sess.beginTransaction();
19         //创建消息实例
20         News n = new News();
21         //设置消息标题和消息内容
22         n.setTitle("天王盖地虎");
23         n.setContent("宝塔镇河妖");
24         //保存消息
25         sess.save(n);
26         //提交事务
27         tx.commit();
28         //关闭session 和 SessionFactory
29         sess.close();
30         sf.close();    
31         System.out.println("执行完毕");
32     }
33 }
复制代码

 

注意上面的Configuration().configure()方法,是从默认的路径src下加载Hibernate配置文件Hibernate.cfg.xml。

 

启动mysql数据库


 

同时我们查看mysql数据库,发现在think_blog库下多了一张表News_table,同时在表中我们插入了一条数据,

到此,我们的Hibernate环境就算是配置成功了,并且成功执行了一个基本的demo。

 

从测试类中可以总结Hibernate的一般步骤,

  • -加载Hibernate配置文件(Hibernate.cfg.xml,默认从src目录加载),从而获得Hibernate的Configuration实例
  • -通过Configuration的实例创建Session工厂
  • -通过Session工厂打开一个session
  • -通过session开起一个事务
  • -进行实体类的set或者get操作
  • -将实体类的操作结果保存进session
  • -提交事务
  • -关闭session及session工厂资源

以上步骤完全是面向对象的编程方式,不直接操作数据库,但是通过Hibernate完成了数据库操作,这便是Hibernate的基本原理。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
下面是一个简单的 `sea_orm` CRUD 操作的示例。 首先,我们需要创建一个数据库模型,用于描述数据库中的表和列。以下是一个示例模型: ```rust use sea_orm::{Database, EntityTrait, FromQueryResult, IntoActiveModel, QueryFilter, QueryOrder, SeaRc, SetTrait}; #[derive(Clone, Debug, PartialEq, DeriveEntityModel)] #[sea_orm(table_name = "users")] pub struct UserModel { #[sea_orm(primary_key)] pub id: i32, pub name: String, pub email: String, pub age: i32, } ``` 在上面的代码中,我们定义了一个名为 `UserModel` 的实体模型,它对应了数据库中的 `users` 表,包含了 `id`、`name`、`email` 和 `age` 四个列,并将 `id` 列标记为主键。 接下来,我们可以使用 `sea_orm` 提供的 API 来执行 CRUD 操作。以下是一个示例代码,演示了如何使用 `sea_orm` 进行增删改查操作: ```rust use sea_orm::{DbConn, IntoActiveModel, QueryFilter}; // 连接到数据库 let db = DbConn::connect("mysql://root:password@localhost:3306/mydb").await?; // 插入一条新记录 let new_user = UserModel { id: 1, name: "Alice".to_owned(), email: "alice@example.com".to_owned(), age: 25, }; let inserted_user = new_user.clone().into_active_model(); let inserted_user = UserModel::insert(inserted_user).exec(&db).await?; // 根据主键查询记录 let user = UserModel::find_by_id(inserted_user.id).one(&db).await?; assert_eq!(user, inserted_user); // 更新记录 let updated_user = UserModel { id: inserted_user.id, name: "Bob".to_owned(), email: "bob@example.com".to_owned(), age: 30, }; let updated_user = updated_user.clone().into_active_model(); let updated_user = UserModel::update(updated_user).exec(&db).await?; // 再次查询记录,验证是否更新成功 let user = UserModel::find_by_id(updated_user.id).one(&db).await?; assert_eq!(user, updated_user); // 删除记录 let deleted_user = UserModel::delete() .filter(UserModel::id.eq(updated_user.id)) .exec(&db) .await?; assert_eq!(deleted_user, 1); ``` 在上面的代码中,我们首先连接到了数据库,然后使用 `into_active_model` 方法将一个 `UserModel` 结构体转换为一个 `ActiveModel<UserModel>`,从而能够进行插入操作。接着,我们使用 `find_by_id` 方法根据主键查询记录,使用 `update` 方法更新记录,使用 `delete` 方法删除记录。 需要注意的是,在执行 CRUD 操作时,我们需要使用 `exec` 或 `one` 方法来执行查询或修改操作。这些方法会返回一个 `Result` 或 `Result<Option<T>>` 对象,我们可以使用 `?` 运算符来处理错误。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值