Hibernate 学习笔记

来源:互联网 发布:软件产品类别 编辑:程序博客网 时间:2024/06/18 02:15

学生时代就这样玩完了,哈哈、、

不过学习却是还要继续、、

就这样发发牢骚吧、、、、、大笑


1、hibernate未毕业之时也曾看过,具体看到哪儿也全忘了尴尬,笔记也因为重装系统丢了尴尬尴尬尴尬,索性毕业就记在这儿吧。

首先,hibernate的学习使用数据库是MySQL,这个用起来比较方便。Oracle工作中也就只安装了客户端,所有数据只有连接内网才能访问,太麻烦。

使用hibernate之前,要导入各种jar包,这个也啰嗦一下吧。记忆力不好、、、

a)主要导入的jar包为hibernate包下的lib->required下的所有jar包,除此之外还有log4j.jar,hibernate要打印日志。

b)配置文件hibernate.cfg.xml,配置要访问的数据。至于如何配置,在hibernate的jar中也可以找到,路径:\project\etc\hibernate.properties,在这个文件中可以看到MySQL是如何配置的:

#hibernate.dialect org.hibernate.dialect.MySQLDialect
#hibernate.dialect org.hibernate.dialect.MySQLInnoDBDialect
#hibernate.dialect org.hibernate.dialect.MySQLMyISAMDialect
#hibernate.connection.driver_class com.mysql.jdbc.Driver
#hibernate.connection.url jdbc:mysql:///test
#hibernate.connection.username gavin
#hibernate.connection.password

具体配置如下:

<hibernate-configuration>
<session-factory>
<!-- hibernate的方言,用来确定链接的数据类型 -->
<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
<!-- 数据库的链接驱动 -->
<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
<!-- 数据的链接字符串和用户名以及密码 -->
<property name="hibernate.connection.url">jdbc:mysql://localhost:3306/haut</property>
<property name="hibernate.connection.username">root</property>
<property name="hibernate.connection.password">mysql</property>
<!-- 在使用hibernate的时候会显示相应的sql语句 -->
<property name="show_sql">true</property>

<!-- 会自动完成类到数据库的转换 -->
<property name="hibernate.hbm2ddl.auto">update</property>
<mapping resource="been/User.hbm.xml" />
</session-factory>
</hibernate-configuration>

这个数据配置文件,个人感觉就和使用Java代码通过JDBC访问是一样的,没啥区别。解析XML文件之后还要对JDBC设置。当然这些应该就是hibernate自己的事情了。

c)配置完成之后,就要创建一个实体类,也就是一个JavaBean文件,把一个数据库表的各个字段当做参数全都设置一下而已。然后还要配置hbm文件。(好多的配置文件、、、睡觉)hbm文件用来指定数据库表和各个字段,具体配置如下:

<hibernate-mapping package="been">
<class name="User" table="tb_user">
<id name="user_account">
<generator class="assigned"></generator>
</id>
<property name="user_name" />
<property name="user_password" />
<property name="user_sex" />
<property name="level" />
</class>
</hibernate-mapping>

其中有些字段,暂时就不说了吧。好像也是很麻烦的样子,等等在整理。最后把这个配置文件添加到hibernate.cfg.xml中。具体看上面的配置。

d)这些写配置完成之后就可以写测试类了。测试类的主要代码如下:

// 得到src路径下hibernate配置文件的信息
Configuration cfg = new Configuration().configure();
ServiceRegistry service = new ServiceRegistryBuilder().applySettings(cfg.getProperties()).buildServiceRegistry();
SessionFactory factory = cfg.buildSessionFactory(service);
Session session = factory.openSession();
// 开启事务
session.beginTransaction();
User user = new User();
user.setUser_account("326866020@qq.com");
user.setUser_name("云栖竹径");
user.setUser_password("haut");
user.setUser_sex("0");
session.save(user);
// 提交事务
session.getTransaction().commit();

2、关于hbm配置文件中Id

配置实体类和数据库的配置文件:***.cfg.xml。在这个配置文件中,有一个和特别的东西,至少我是这么认为的。
这个特别的东西,就是 
<id name="account">
<generator class="native"></generator>
</id>
首先是Id的name,这个应该和数据库表的字段保持一致,对应的实体类也是如此。刚开始的时候可能会纠结于,这个Id是不是name也应该定义为Id,我就是非常纠结。最后自己试一下,可以确定Id这个字段虽然有着特殊的地方,但是name并不是固定的。但是需要和Model类中的id字段保持一致。name的值和数据库对应的列名一致可以省略column。
另外,详细介绍的是Id下的子标签generator。
classe 的参数值有很多:
native:自动递增, MySQL
increment:自动递增
sequence:序列,Oracle
这三者的区别在于:
native包容后两者,sequence用于Oracle数据库。一般常用的是native,native是根据所配置的数据库类型,自动选择自增长的类型。
需要说一点,使用这个属性的时候,数据库的字段一定要定义为自增长类型,否则提交的时候会报错。

assigned:是自定义的,你可以自由对Id这个字段使用set赋值,即便你在数据库设定了该字段为自增长都没有关系。


个人感觉最常用的大概就是两个大的分类。使用native的时候插入数据的时候,hibernate打印的日志就不会显示Id这个字段,会在原来的基础上自增长。使用assigned通过set赋值,会根据所赋值插入说句,hibernate的日志此时也会显示该Id字段。
使用assigned的场景:Hibernate: insert into user (account, user_name) values (? ,?)

使用native的场景:Hibernate: insert into user (user_name) values (?)

PS:这个地方测试的时候犯了一个错误,不小心删掉了save方法,无论如何都插入不了数据。大概这就是新手的悲哀、、、、、尴尬


3、hibernate的增删改查直接附代码。需要说明的是,load方法的两个参数,最后一个为指定的Id。

代码:

package test;
import java.util.List;
import org.hibernate.Session;
import org.junit.Test;
import been.User;
import utils.HibernateUtils;
public class TestCRUD {
public static void main(String[] args) {
TestCRUD test=new TestCRUD();
//test.testAdd();
test.testLoad();
}
public void testAdd() {
Session session = null;
session = HibernateUtils.openSession();
session.beginTransaction();
User user = new User();
//user.setAccount(3);
user.setUser_name("云栖竹径");

session.save(user);
// 提交事务
session.getTransaction().commit();
}
public void testLoad() {
Session session = null;


session = HibernateUtils.openSession();
User user = (User) session.load(User.class, 1);
System.out.println(user);
}
/*
public void testUpdate() {
Session session = null;
try {
session = HibernateUtils.openSession();
session.beginTransaction();
User user = (User) session.load(User.class, "326866020@qq.com");


session.update(user);
session.getTransaction().commit();
} catch (Exception e) {
e.printStackTrace();
if (session != null)
session.close();
} finally {
HibernateUtils.close(session);
}
}

public void testDelete() {
Session session = null;


session = HibernateUtils.openSession();
session.beginTransaction();
User user = new User();
user.setId(1);
session.delete(user);
session.getTransaction().commit();
}


@Test
public void testList() {
Session session = null;
session = HibernateUtils.openSession();
session.beginTransaction();
List<User> users = session.createQuery(" from User").setFirstResult(0).setMaxResults(2).list();
for (User user : users)
System.out.println(user);
}
public void testPager() {
Session session = null;
session = HibernateUtils.openSession();
session.beginTransaction();
List<User> users = session.createQuery(" from User").list();
for (User user : users)
System.out.println(user);
}*/
}

0 0
原创粉丝点击