文章目录
一、开发工具及环境
操作系统 | 集成环境 | 数据库 | JDK | Hibernate | DmDialect |
---|---|---|---|---|---|
Win10 | Eclipse | DM8 | 1.8 | 5.3.1 | 4.0 |
二、创建JAVA项目
安装Hibernate支持
打开插件市场
搜索Hibernate并安装JBOSS
在复选框中选择Hibernate Tools进行安装即可
准备驱动包
Hibernate包
在网上下载,我用的5.3.1
进入这个目录的lib文件夹下的required的文件夹
这都是我们需要用到的jar包。
JDBC包
在DM安装目录下的Drivers目录中
根据自己的DM的版本进行选择,我因为用的DM8,所以这里选择DmJdbcDriver18.jar。
Dialect包
在上面的dialect文件夹中
这里我用的4.0版本
创建项目
建空项目
回到eclipse
File->New->Project
Next
起个名字,Finish。
项目这就出现了。
导入jar包
右键项目名称
把上面我说的那些包全都导进来。
三、编辑工程
创建并编写控制文件
一直Next直到Finish。
这时候我们看见新建的控制文件
以这种方式打开
初始内容是这样的,用下面的内容替换它
<?xml version='1.0' encoding='UTF-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<!--程序执行的时候是否显示真正的sql语句-->
<property name="show_sql">true</property>
<!--使用的SQL对应的“方言”,此处是dm的“方言”-->
<property name="dialect">org.hibernate.dialect.DmDialect</property>
<!--连接数据库的Driver-->
<property name="connection.driver_class">dm.jdbc.driver.DmDriver</property>
<!--数据库连接url-->
<property name="connection.url">jdbc:dm://localhost:5237</property>
<!--用户名-->
<property name="connection.username">SYSDBA</property>
<!--密码-->
<property name="connection.password">SYSDBA</property>
<!--用于表的创建,这是Hibernate5的新特性,如果是低版本,不能这样建表-->
<property name="hbm2ddl.auto" >update</property>
<!--映射文件的相对路径,这里与控制文件在同级目录下-->
<mapping resource="Student.hbm.xml"/>
</session-factory>
</hibernate-configuration>
可以发现的是,我们只需要往session-factory标签中添加内容,自动建表的开关不能盲目使用,要依Hibernate版本来看,要复现这篇文档的话建议使用5.0及以上版本。映射文件的路径也要注意别写错。
创建并编写映射文件
像创建控制文件一样创建即可,然后把以下内容替换进去
<?xml version='1.0' encoding='UTF-8'?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/hibernate-Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!-- Generated 2019-1-27 1:00:12 by Hibernate Tools 3.5.0.Final -->
<hibernate-mapping>
<class name="Student" table="USERS">
<id name="id" type="int">
<column name="ID" />
<!--generator class="assigned" /-->
</id>
<property name="name" type="java.lang.String">
<column name="NAME" />
</property>
<property name="password" type="java.lang.String">
<column name="PASSWORD" />
</property>
</class>
</hibernate-mapping>
不同的是class标签。这是映射类的地方。从该文件可以看出:这对应着数据库里一个这样的表
注意:column标签里的name的值是表的字段名,而property标签的name的值对应着实体类的属性名,可以先自定义,但等下创建实体类就要依据这个来了。type则是实体属性的类型的,数据库与type映射关系是这样:
数据库 | type |
---|---|
INT | int |
varchar(n) | java.lang.String |
class标签里的内容是这样的
字段 | 含义 |
---|---|
name | 实体类名 |
table | 表名 |
这两个的名字是可以不一样的。建实体类的时候会产生class文件,建议命名为[name].class,不然数据库将无法映射到实体。
创建并编写实体类
把下面的代码替换进去
public class Student {
private int id;
private String name;
private String password;
public int getId()
{
return id;
}
public String getName()
{
return name;
}
public String getPassword()
{
return password;
}
public void setId(int id)
{
this.id= id;
}
public void setName(String name)
{
this.name = name;
}
public void setPassword(String password)
{
this.password = password;
}
}
类名注意一定要与映射文件中的类名相同。属性名一定要与映射文件中的属性名一致,不要误写成字段名。类方法的命名形如我,get/set[属性名(首字母大写)],不能随意,否则Hibernate可能会包找不到getter[xxxxxx]的错误。
创建编写测试文件
用同样的方法创建测试文件,文件名建议用Test.class,因为我下面要贴的代码是依据这个来的。如果你有别的命名,注意把我代码中的Test类名替换为你的文件名的前缀。
import org.hibernate.*;
import org.hibernate.cfg.*;
import org.hibernate.tool.hbm2ddl.SchemaExport;
import org.hibernate.tool.schema.TargetType;
import java.util.EnumSet;
import java.util.List;
import java.io.Serializable;
import org.hibernate.Query;
import org.hibernate.boot.Metadata;
import org.hibernate.boot.MetadataSources;
import org.hibernate.boot.registry.StandardServiceRegistry;
import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
import java.lang.Iterable;
import org.hibernate.cfg.Configuration;
@SuppressWarnings("deprecation")
class Dml{
//建数据表
public void create(){
Configuration conf = new Configuration().configure();//1、读取配置文件
StandardServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder().configure().build();
Metadata metadata = new MetadataSources(serviceRegistry).buildMetadata();
SchemaExport schemaExport = new SchemaExport();
schemaExport.create(EnumSet.of(TargetType.DATABASE), metadata);
}
//插入数据
public void insert(){
try
{
//通过Configuration获得一个SessionFactory对象
SessionFactory sf = new Configuration().configure().buildSessionFactory();
//打开一个Session
Session session = sf.openSession();
//开始一个事务
Transaction tx = session.beginTransaction();
//创建一个Student对象
Student stu = new Student();
//通过Student的setter方法改变它的属性
//注意student_id不用设置
stu.setId(1);
stu.setName("zha");
stu.setPassword("1234567");
//通过session的save()方法将Student对象保存到数据库中
session.save(stu);
//提交事务
tx.commit();
//关闭会话
session.close();
}
catch(Exception e)
{
e.printStackTrace();
}
}
//删除数据
public void delete(int id) {
try
{
SessionFactory sf = new Configuration().configure().buildSessionFactory();
Session session = sf.openSession();
Transaction tx = session.beginTransaction();
Student stu = (Student)session.get(Student.class, id);
session.delete(stu);
tx.commit();
session.close();
}
catch(Exception e)
{
e.printStackTrace();
}
}
//修改数据
public void update(int id, String name,String password) {
try {
SessionFactory sf = new Configuration().configure().buildSessionFactory();
Session session = sf.openSession();
Transaction tx = session.beginTransaction();
Student users = (Student)session.get(Student.class, id);//根据id查找记录
users.setName(name);//只修改指定列的记录
users.setPassword(password);
session.update(users);
tx.commit();
session.close();
} catch (Exception e) {
e.printStackTrace();
}
}
//查询数据
public void select(){
SessionFactory sf = new Configuration().configure().buildSessionFactory();
Session session = sf.openSession();
Transaction tx = session.beginTransaction();
try {
Query createQuery=session.createQuery("from Student");
List<Student> students=createQuery.list();
System.out.println("ID\tNAME\tPASSWORD");
for(Student student:students){
System.out.println(student.getId()+"\t"+student.getName()+"\t"+student.getPassword());
}
} finally {
session.close();
}
}
}
public class Test {
public static void main(String[] args)
{
Dml dml=new Dml();
// dml.insert();
// dml.delete(1);
// dml.update(1, "lala","1223435");
// dml.select();
dml.create();
}
}
实体类对应的表并不是必须事先存在的,因为上面的建表函数一旦检测到同名表便会进行级联删除然后根据映射文件重新建表,如果不存在,将直接建表。
由于代码写的匆忙,所以有些粗糙,譬如启动会话和事务的语句完全可以提取为一个函数,但我写了多次,这里有优化空间。
导入的包有很多,这都是需要用到的,由于版本的原因,有些函数已经不能用了,我用@SuppressWarnings(“deprecation”)对类进行注解才得以使用,所以这份代码能跑起来也相当不容易,因此,也并不局限于这样的写法。
最大的不同在于建表,如果Hibernate版本在5.0以下,建议替换为这样:
public void create() {
Configuration cfg = new Configuration().configure();
SessionFactory factory = cfg.buildSessionFactory();
Session session = null;
Configuration cfr = new Configuration().configure();
SchemaExport export = new SchemaExport(cfr);
export.create(true, true);
}
四、运行代码
建表测试
我用Dml类放置 的测试用例,现在在主函数中调用其中的create函数:
启动
控制台会飘红,不要在意,这不是报错,在这里只是Hibernate的提示信息,看到这两行黑字说明建表成功。第一行是级联删除,第二行是建表。当然,如果抛出了Exception那就说明配置或者代码有问题了。
去数据库里可以看见该表,可以发现它还是空的
插入测试
调用insert函数
代码比较粗糙,要传的用户直接在函数里写死了,可以自己改改。启动:
数据已经被插入到了表中
修改测试
调用update函数,这里将id为1的用户名字更改为lala,密码更改为1223435。
启动
效果
查询测试
为了展示多行打印的效果,先手动插入一行
启动程序
删除测试
这里删除ID为1的记录
效果
五、后记
感谢你的阅读,如有疑问可以评论、私信或者邮件提出,本人邮箱:wufeng@dameng.com