hibernate简单实现连接数据库,并实现数据的操作
1:创建实体类
package com.yinfu.entity; public class User { private int id;
private String username;
private String password;
private String address;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
} }
User.Java
2:创建实体类与数据库表对应的配置文件:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<!--
配置类和表的对应
class标签
name属性:实体类全类名
table属性:数据库表名称,用hibernate不需要自己创建表,他可以根据配置文件自动生成数据库表
-->
<class name="com.yinfu.entity.User" table="t_user">
<!--
配置实体类ID与表中的ID进行对应
hibernate要求实体类属性有一个唯一值
hibernate要求表有作为唯一值得字段
-->
<!--id标签
name属性:实体类中的id名称
column属性:表字段中的id名称
-->
<id name="id" column="id">
<!-- 设置数据库表的增长策略
native:生成表id值就是主键自增长
-->
<generator class="native"></generator>
</id>
<!-- 配置其他属性和表的字段的对应
name属性:实体类中的属性名
column属性:表中的字段名
-->
<property name="username" column="username"></property>
<property name="password" column="password"></property>
<property name="address" column="address"></property>
</class>
</hibernate-mapping>
User.hbm.xml
3:hibernate核心配置文件(1.数据库信息,2.hibernate信息,3.实体类与数据库映射的配置文件注入信息)
此配置文件文件名和位置是固定的:文件名:hibernate.cfg.xml 位置:要放在src文件夹下
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<!-- 此配置文件的文件名和位置是固定的的
文件名:hibernate.cfg.xml
位置:要写在src文件中
-->
<session-factory>
<!-- 第一部分:配置数据库信息 -->
<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="hibernate.connection.url">jdbc:mysql://localhost:3306/test</property>
<property name="hibernate.connection.username">root</property>
<property name="hibernate.connection.password">song12345</property> <!-- 第二部分:配置hibernate信息(可有可无) -->
<!-- 输出底层的SQL语句 -->
<property name="hibernate.show_sql">true</property>
<!-- 对底曾语句进行格式化 -->
<property name="hibernate.format_sql">true</property>
<!-- hibernate帮创建表,需要配置
update:如果有表就更新,没有表就创建
-->
<property name="hibernate.hbm2ddl.auto">update</property>
<!-- 配置数据库的方言
识别不同数据库中的特有的语句和关键字
比如:分页查询
MySQL关键字是limit
oracle中的使用的是top-n分析中的rownum
-->
<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
<!-- 指定线程管理方式,与本地线程进行绑定,实现单线程操作 -->
<property name="hibernate.current_session_context_class">thread</property> <!-- 第三部分:把映射文件放到核心配置文件中 -->
<mapping resource="com/yinfu/entity/User.hbm.xml"/> </session-factory> </hibernate-configuration>
hibernate.cfg.xml
4:用Junit进行简单测试:
package com.yinfu.test; import static org.junit.Assert.*; import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import org.junit.Test; import com.yinfu.entity.User;
import com.yinfu.utils.HibernateUtils; public class HibernateTest { @Test
public void test() {
//1.加载hibernate核心配置文件
//只会到src下去寻找hibernate的核心配置文件
Configuration cfg = new Configuration();
cfg.configure();
//2.创建sessionFactory对象
//读取hibernate核心配置文件内容,根据configuration对象创建sessionFactory对象
//在这过程中,根据映射关系,在相应数据库中把表创建
SessionFactory sessionFactory = cfg.buildSessionFactory();
//3.根据sessionFactory得到session对象
//类似于jdbc中的connection链接
Session session = sessionFactory.openSession();
//4.开启事务
Transaction tx = session.beginTransaction();
//5.逻辑代码实现crud操作
//session中有:增加:save方法 修改:update 删除:delete方法 根据ID查询:get方法
User user = new User();
user.setUsername("李四");
user.setPassword("12345");
user.setAddress("韩国");
session.save(user);
//6.提交事务
tx.commit();
//7.释放资源
session.close();
sessionFactory.close(); }
}
test
4.1,将创建SessionFactory对象的代码提出来,放到static静态代码块中,当此类加载的时候只创建一个对象,并重复使用此对象,能够进行优化
首先创建Utils工具类:
package com.yinfu.utils; import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration; //工具类
public class HibernateUtils { private final static Configuration cfg;
private final static SessionFactory sessionFactory; //用静态代码块来实现对象只在类加载的时候创建一次(静态代码块只执行一次)
static{
//创建configuration对象,
cfg = new Configuration();
cfg.configure();
//根据Configuration对象创建sessionFactory对象
sessionFactory = cfg.buildSessionFactory();
} //返回与本地线程绑定的session
public static Session getSession(){
return sessionFactory.getCurrentSession();
} //创建一个方法用于返回sessionFactory对象
public static SessionFactory getSessionFactory(){
return sessionFactory;
} }
HibernateUtils
然后创建测试类:
package com.yinfu.test; import static org.junit.Assert.*; import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import org.junit.Test; import com.yinfu.entity.User;
import com.yinfu.utils.HibernateUtils; public class HibernateTest {
@Test
public void testStatic() {
//利用工具类得到与本地线程绑定的session
Session session = HibernateUtils.getSession();
//4.开启事务
Transaction tx = session.beginTransaction();
//5.逻辑代码
//增加方法:
//此user为瞬时态数据(user中没有id,与session无关)
User user = new User();
user.setUsername("赵六");
user.setPassword("12345");
user.setAddress("玛雅文明");
session.save(user); //根据ID查询:
//第一个参数:实体类的类对象。第二个参数:id值
//此user为持久态数据(有id,与session有关)
// User user = session.get(User.class, 1);
// System.out.println(user); //修改方法:
// User user = session.get(User.class, 1);
// user.setUsername("张三");
// session.update(user); //删除方法:
//第一种:
// User user = session.get(User.class, 1);
// session.delete(user);
//第二种:
// User user = new User();
// user.setId(2);
// session.delete(user); //6.提交事务
tx.commit();
//7.释放资源
session.close(); } }
test
由于在工具类中将session与当前线程进行了绑定,执行结果正确了,但是会有一个异常,这个异常是由于当session与本地线程进行绑定之后,session会随着线程的结束而自动关闭,不在需要手动进行session关闭,当还有session.close()方法的时候回报此异常。
数据的三种状态:
1:瞬时态数据(没有ID,与session无关):
User user = new User();
user.setUsername("赵六");
user.setPassword("12345");
user.setAddress("玛雅文明");
2:脱管状态:(有id,与session无关)
User user = new User();
user.setId(1);
3:持久态数据:(有id,与session有关)
User user = session.get(User.class, 1);
hibernate简单实现连接数据库,并实现数据的操作的更多相关文章
- 16~25.spring+hibernate简单实例 .连接数据库并进行增删改查
1.概念 Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,它将POJO与数据库表建立映射关系,是一个全自动的orm框架,hibernate可以自动生成SQ ...
- 框架之 hibernate简单入门
hibernate框架的搭建 Hibernate框架的概述 1. Hibernate框架的概述 * Hibernate称为 * Hibernate是一个开放源代码的对象关系映射(ORM)框架,它对JD ...
- Hibernate 一对多 保存和修改数据
Student和Sclass表,Student外键cid是Sclass的cid create table sclass( cid ) primary key, cname ) )go create t ...
- 菜鸟学习Hibernate——简单的增、删、改、查操作
上篇博客利用Hibernate搭建起一个简单的例子,把数据库的映射显示了出来在上一篇的博客基础上这篇博客讲述如何利用Hinbernate框架实现简单的数据库操作. 1.加入junit.jar 2.新建 ...
- jquery ajax json简单的分页,模拟数据,没有封装,只显示原理
简单的分页,模拟数据,没有封装,显示原理,大家有兴趣可以自己封装,这里只是个原理过程,真正的分页也差不多是这个原理,只是请求数据不太一样,html部分: <!TOCTYPE HTML> & ...
- CoreData的简单使用(二)数据的增删改查,轻量级的版本迁移
上一篇中我们已经使用CoreData创建了一个SQLite数据库 CoreData的简单使用(一)数据库的创建 现在对数据库进行数据的CRUD(增删改查) 1.Data Model 的设置 创建一个D ...
- 新秀学习Hibernate——简单的增加、删、更改、检查操作
部分博客使用Hibernate单的样例,把数据库的映射显示了出来在上一篇的博客基础上这篇博客讲述怎样利用Hinbernate框架实现简单的数据库操作. 1.增加junit.jar 2.新建一个工具类H ...
- JAVA入门[19]-Hibernate简单示例
一.Hibernate简介 在很多场景下,我们不需要使用JdbcTemplate直接操作SQL语句,这时候可以用ORM工具来节省数大量的的代码和开发时间.ORM工具能够把注意力从容易出错的SQL代码转 ...
- 简单的连接数据库的java程序模板
简单的连接数据库的java程序,方便临时使用: import java.sql.*; import java.io.*; import java.sql.DriverManager; import j ...
随机推荐
- Scala入门到精通——第十六节 泛型与注解
本节主要内容 泛型(Generic Type)简单介绍 注解(Annotation)简单介绍 注解经常使用场景 1. 泛型(Generic Type)简单介绍 泛型用于指定方法或类能够接受随意类型參数 ...
- 关键路径(AOE)---《数据结构》严蔚敏
// exam1.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include <iostream> #include &l ...
- 【Mongodb教程 第九课 】MongoDB 删除文档
remove() 方法 MongoDB的 remove() 方法用于从集合中删除文档.remove() 方法接受两个参数.第一个是删除criteria ,第二是justOne标志: deletion ...
- Android Client and PHP Server
1 FEApplication https://github.com/eltld/FEApplication https://github.com/eltld/FE-web https://githu ...
- NoSQL之Redis探析
下载地址:wget http://download.redis.io/releases/redis-2.8.8.tar.gz安装steps:1 下载Official Website : http:// ...
- 云Hbase数据库在亿方云实践之路
本文主要先介绍了亿方云,进而谈及了数据架构,着重分析了HBase实践等 2017云栖大会HBase专场,亿方云科技CTO 王成军带来HBase在亿方云客户端同步系统中的应用实践的演讲.本文主要先介绍了 ...
- html页面内锚点定位及跳转方法总结
1.最简单的方法是锚点用<a>标签,在href属性中写入DIV的id.如下: <!DOCTYPE html><html><head><style& ...
- js需要注意的地方
1.function xx(){}定义函数,而对象和函数合写才是方法. 2.typeof返回一个用于识别其运算数类型的字符串.但是需要注意的是,比如typeof null返回的对象是object而不是 ...
- YTU 2800: 逗逗泡泡的保密电文
2800: 逗逗泡泡的保密电文 时间限制: 1 Sec 内存限制: 128 MB 提交: 229 解决: 114 题目描述 某电报局的电文保密的规律是将每个英文字母变成其后的第4个字母(很原始的那 ...
- POJ - 3177 Redundant Paths(边双连通分支)(模板)
1.给定一个连通的无向图G,至少要添加几条边,才能使其变为双连通图. 2. 3. //边双连通分支 /* 去掉桥,其余的连通分支就是边双连通分支了.一个有桥的连通图要变成边双连通图的话, 把双连通子图 ...