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

首先,新建Project以后,选择Java——Java应用程序:
(二)详细代码教程——成功在Netbeans下配置hibernate并连接本地MySQL服务器

然后添加类库:鼠标右键点击那个咖啡图标的项目——属性:
(二)详细代码教程——成功在Netbeans下配置hibernate并连接本地MySQL服务器
  选择库,然后选择 添加库,添加 Hibernate 4.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.J 5.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类:

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

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



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



我们开始写测试的类StudentTest.java:
在这个类中,我们进行几个功能(大家可以按照需要来增减):
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
import org.hibernate.cfg.Configuration;
import org.hibernate.service.ServiceRegistry;
import org.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 = new StandardServiceRegistryBuilder()
                .applySettings(cfg.getProperties());
        ServiceRegistry service = ssrb.build();
        SessionFactory factory = cfg.buildSessionFactory(service);
        Session session = 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 = new StandardServiceRegistryBuilder()
                .applySettings(cfg.getProperties());
        ServiceRegistry service = ssrb.build();
        SessionFactory factory = cfg.buildSessionFactory(service);
        
        Session session = factory.openSession();
        Transaction tx = session.beginTransaction();

        try {
            //new 一个Student类的对象,在未执行session.save(stu1)方法时,它是瞬时对象
            Student stu1 = new Student();
            stu1.setName("yu zhiping");
            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
<?xml version="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/orm http://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>

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值