(二)详细代码教程——成功在Netbea…

来源:互联网 发布:淘宝怎么做数据分析 编辑:程序博客网 时间:2024/05/18 03:49
首先,新建Project以后,选择Java——Java应用程序:
(二)详细代码教程——成功在Netbeans下配置hibernate并连接本地MySQL服务器

然后添加类库:鼠标右键点击那个咖啡图标的项目——属性:
(二)详细代码教程——成功在Netbeans下配置hibernate并连接本地MySQL服务器
  选择库,然后选择添加库,添加Hibernate4.3.x(当然其他版本也相同,这里使用的是Netbeans帮下载好的自带库)。
  接下来,选择添加JAR/文件夹依次添加其他必须的库:
1、ejb3-persistence.jar (这个库额外从网上下载)
2、hibernate-jpa-2.1-api-1.0.0.Final.jar(这个库在自己下载解压的hibernate文件夹的lib——release——required文件夹里面,文中示例是拷贝到下载文件夹下的)
3、my-sql-connector-java-5.1.39-bin.jar(这个是安装MySQL的时候,勾选Connector.J5.1附带安装上的,Jar文件在相应的文件夹里面。)

接下来就依次讲解各部分代码:
(二)详细代码教程——成功在Netbeans下配置hibernate并连接本地MySQL服务器  (由于断断续续也在自己研究当中,写了一些奇怪的类,请大家忽视。那是自己测试用的,没有也无所谓。)
  MainClass.java主要就是拿来运行Test的。
  StudentTest.java里面写了一些启动hibernate,新建表格,并往里面插入数据、检索数据的代码。
  而Student.java就是基础类,定义了一个数据表的表头。其实也就是用java语言的格式来定义一个数据库,非常方便。
  Student.hbm.xml是配置文件,告诉Hibernate我该去哪个Java文件里面把MySQL返回的数据映射到Object。
  最后hibernate.cfg.xml是数据库连接的配置文件,告诉系统我该去连接哪个数据库,用户名和密码分别是啥,有没有啥额外的连接要求,是否开启日志等等。









  说了这么多,感觉很麻烦啊,为啥不Send一句SQL语句然后再把recv的数据用字符串分析来区分开呢?因为hibernate就是不想这么做啊!(大误……)
  我个人理解,首先这样是方便迁移吧。大家可以先看看这个Student类:

 importjava.io.Serializable;
public class Student implementsSerializable {
   private static final long serialVersionUID =5548279324472937805L;
   private int id;
   private String name;
   private int age;
  
   public Student() {
   }
   public int getId() {
       returnid;
   }
   public void setId(int id) {
       this.id =id;
   }
   public String getName() {
       returnname;
   }
   public void setName(String name) {
       this.name= name;
   }
   public int getAge() {
       returnage;
   }
   public void setAge(int age) {
       this.age =age;
   }
}
  可以看到这个类是个
非常纯粹的Java类。集成
到自己写的Java程序里面
非常方便,当Hibernate
取出数据库中的一行的时
候,就会生成这样一个
Student类,然后你就可
以把这个类导入自己的工
程项目里面来用了。
好的,我们建立了这样一个Student类

  接下来我们得对这个类进行“映射”。为何要映射?这里搜集了网上的一些说法:有说是因为xml文件方便配置,毕竟java文件一但编译成class了以后就不能再方便地改了(源文件不再自己手里,或者使用者只会用却没编程技术)。——但是我还是有个疑问,只改xml文件不改java类真的行吗?又有说法是因为xml才是标准,大家都要遵循……但是遵循什么,是为了分离而分离吗?
  ;、返回的^%$#类型是int类型。
  于是如何映射呢?我们建立一个:
  Student.hbm.xml文件
<?xmlversion="1.0"?>
<!DOCTYPEhibernate-mapping SYSTEM"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
    <!--一个class标签对应一个实体类,name属性指定实体类名称,table属性指定关联的数据库表-->
   <classname="Student"table="stu_tab">
       <!-- 主键 -->
      <id name="id"column="stu_id">
         <!-- 主键的生成策略 -->
          <generatorclass="native"></generator>
      </id>
       <!--其他属性,name对应实体类的属性,column对应关系型数据库表的列 -->
      <propertyname="name"column="stu_name"></property>
      <propertyname="age"column="stu_age"></property>
  </class> 
</hibernate-mapping>
 



然后我们得对Hibernate进行配置,告诉它我们连接哪个数据库,用户名和密码都是啥:
<?xmlversion='1.0'encoding='utf-8'?>
<!DOCTYPEhibernate-configuration PUBLIC
      "-//Hibernate/Hibernate Configuration DTD3.0//EN"
      "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
   <!--
       配置mysql数据库的连接参数 
      dialect就是“方言”,因为hibernate是要把Java对象转换成关系数据库来描述的,
   而关系数据库虽然有一些统一的标准,如SQL-92等,但是实际上各数据库如Oracle, MySQL,
    MS SQLServer等等为了提高性能或增加功能都提供了一些额外的标准或语法,因此,hiber-
   nate为了更好适配各种关系数据库,针对每种数据库都指定了一个方言dialect。
      你可以看到hibernate里面实际上方言只是一个类,它里面将不同数据类型、SQL语法转
   换成hibernate能理解的统一的格式。但注意,如果没有对应的dialect,Hibernate是无法
   使用这种数据库进行对象关系转换的。
      上次我用了个H2数据库,找到一个H2的dialect,就可以马上用起Hibernate了。
   -->
   <propertyname="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
    <!--驱动程序名 -->
   <propertyname="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
    <!--数据库名称 -->
   <propertyname="hibernate.connection.url">jdbc:mysql://localhost:3306/Mysql?useSSL=true</property>
    <!--用户名 -->
   <propertyname="hibernate.connection.username">root</property>
    <!--密码 -->
   <propertyname="hibernate.connection.password">password</property>
   
   
    <!--【非必须】让hibernate打印它所生成的SQL代码
        print all generated SQL to theconsole
   -->
   <propertyname="hibernate.show_sql">true</property>
   <!--WARN: HHH000402: Using Hibernate built-inconnection pool (not for production use!)
      Hibernate自带的连接池性能不高,缺乏响应大批量请求以及容错能力,甚至还有BUG,
      在项目运用中不值得推荐。所以会WARN,警告我们不要使用build-in连接池。添加下列
       代码可解决问题:
   -->
   <propertyname="c3p0.min_size">5</property><!--在连接池中可用数据库连接的最小数目-->
   <propertyname="c3p0.max_size">30</property><!--在连接池中所有数据库连接的最大数目-->
   <propertyname="c3p0.time_out">1800</property><!--设定数据库连接的超时时间-->
   <propertyname="c3p0.max_statement">50</property><!--可以被缓存的PreparedStatement的最大数目-->
   
   
    <!--设置默认schema -->
   <propertyname="hibernate.default_schema">newschema</property>
    <!--添加Student.hbm.xml映射文件 -->
   <mappingresource="Student.hbm.xml"/>
   
</session-factory>
</hibernate-configuration>
 



我们开始写测试的类StudentTest.java:
在这个类中,我们进行几个功能(大家可以按照需要来增减):
importorg.hibernate.Session;
importorg.hibernate.SessionFactory;
importorg.hibernate.Transaction;
importorg.hibernate.boot.registry.StandardServiceRegistryBuilder;
importorg.hibernate.cfg.Configuration;
importorg.hibernate.service.ServiceRegistry;
importorg.hibernate.tool.hbm2ddl.SchemaExport;
public class StudentTest{
   public void createTable() {
      Configuration cfg = new Configuration().configure();
      SchemaExport se = new SchemaExport(cfg);
      se.create(true, true);
   }
   public void get() {
      Configuration cfg = new Configuration().configure();
//选择用哪个目录下的hibernate.hbm.xml配置文件
      StandardServiceRegistryBuilder ssrb = newStandardServiceRegistryBuilder()
            .applySettings(cfg.getProperties());
      ServiceRegistry service = ssrb.build();
      SessionFactory factory =cfg.buildSessionFactory(service);
       Sessionsession = factory.openSession();
      Transaction tx = session.beginTransaction();
       try{
          Student stu = (Student)session.get(Student.class, 1);
         stu.setName("lisi");
          tx.commit();
       } catch(Exception e) { 
          tx.rollback();
       } finally{
          session.close();
      }
   }

   public void add() {
      Configuration cfg = new Configuration().configure();
       //如果是hibernate4.0以前的版本,使用如下的方式创建SessionFactory对象
       // SessionFactory factory =cfg.buildSessionFactory();
      StandardServiceRegistryBuilder ssrb = newStandardServiceRegistryBuilder()
            .applySettings(cfg.getProperties());
      ServiceRegistry service = ssrb.build();
      SessionFactory factory =cfg.buildSessionFactory(service);
      
       Sessionsession = factory.openSession();
      Transaction tx = session.beginTransaction();

       try{
           //new一个Student类的对象,在未执行session.save(stu1)方法时,它是瞬时对象
          Student stu1 = newStudent();
          stu1.setName("yuzhiping");
          stu1.setAge(22);
         session.save(stu1);
          stu1.setAge(43);
          tx.commit();
       } catch(Exception e) {
          tx.rollback();
       } finally{
          session.close();
      }
   }
}

   大家可以看到,Create方法
里面没有Student类。我猜想Hiber-
nate可能会把注册在配置文件里面
的所有表头都个给在数据库里面建
立新表。







  接着get方法通过Session获取
了表里面的第一个元素,然后对这
个元素的Name进行了修改,修改
成了list。








  而add方法在表里面新添加一
行元素。可以看到新加元素比较简
单,直接new一个Student,然后
在session里面save就可以了。





最后是MainClass.java。用来执行我们写的StudnetTest.java
很简单:
public class MainClass{
   public static void main(String[] args){
      StudentTest st = new StudentTest();
      st.createTable();
      st.add();
      st.get();
   }
}

当然为了能够在正确的schema(数据库)中创建表,我们也写了一个配置文件:
orm.xml
<?xmlversion="1.0"encoding="UTF-8"?>
<entity-mappings
xmlns="http://java.sun.com/xml/ns/persistence/orm"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/persistence/ormhttp://java.sum.com/xml/ns/persistence/orm_1_0.xsd"
version="1.0">
<persistence-unit-metadata>
<persistence-unit-defaults>
<schema>newschema</schema>
</persistence-unit-defaults>
</persistence-unit-metadata>
</entity-mappings>

最终的效果可以通过MySQLClient命令行查看,也可以通过Workbench查看。这里我用Workbench查看如下:
(二)详细代码教程——成功在Netbeans下配置hibernate并连接本地MySQL服务器

配置中遇到的各种问题的解决办法汇总
0 0
原创粉丝点击