使用Maven创建Hibernate项目

1.首先使用Idea创建一个Maven项目,最基本的就好。

2.在pom文件中加入JAR包引用。(随便搜索一个项目POM就好了)

这里多引用了一点Spring的,纯hibernate项目可以删除。Junit用于单元测试。


<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>StudyD1</groupId>
    <artifactId>StudyD1</artifactId>
    <version>1.0-SNAPSHOT</version>
    <packaging>jar</packaging>

    <properties>
        <junit.version>4.12</junit.version>
        <jstl.version>1.2</jstl.version>
        <commons.version>1.2</commons.version>
        <mysql.version>5.1.39</mysql.version>
        <c3p0.version>0.9.2.1</c3p0.version>
        <hibernate.version>5.3.0.Final</hibernate.version>
        <hibernate.validator.version>5.4.0.Final</hibernate.validator.version>
        <spring.version>4.3.3.RELEASE</spring.version>
        <log.version>1.2.17</log.version>
    </properties>
    <dependencies>

    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>${junit.version}</version>

    </dependency>

    <dependency>
        <groupId>jstl</groupId>
        <artifactId>jstl</artifactId>
        <version>${jstl.version}</version>
    </dependency>


    <dependency>
        <groupId>commons-logging</groupId>
        <artifactId>commons-logging</artifactId>
        <version>${commons.version}</version>
    </dependency>


    <!-- Hibernate start -->
    <dependency>
        <groupId>org.hibernate</groupId>
        <artifactId>hibernate-core</artifactId>
        <version>${hibernate.version}</version>
    </dependency>

    <dependency>
        <groupId>org.hibernate</groupId>
        <artifactId>hibernate-validator</artifactId>
        <version>${hibernate.validator.version}</version>
    </dependency>

    <dependency>
        <groupId>org.hibernate</groupId>
        <artifactId>hibernate-entitymanager</artifactId>
        <version>${hibernate.version}</version>
    </dependency>

    <dependency>
        <groupId>org.hibernate</groupId>
        <artifactId>hibernate-c3p0</artifactId>
        <version>${hibernate.version}</version>
    </dependency>

    <!-- Hibernate end -->

    <!-- 引用c3p0 依赖  start-->
    <dependency>
        <groupId>com.mchange</groupId>
        <artifactId>c3p0</artifactId>
        <version>${c3p0.version}</version>
    </dependency>
    <!-- 引用c3p0 依赖  end-->

    <!-- Mysql start -->
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>${mysql.version}</version>
    </dependency>
    <!-- Mysql end -->

    <!-- Spring start -->
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-core</artifactId>
        <version>${spring.version}</version>
    </dependency>

    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-context</artifactId>
        <version>${spring.version}</version>
    </dependency>

    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-context</artifactId>
        <version>${spring.version}</version>
    </dependency>

    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-aop</artifactId>
        <version>${spring.version}</version>
    </dependency>

    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-test</artifactId>
        <version>${spring.version}</version>
        <scope>test</scope>
    </dependency>

    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-webmvc</artifactId>
        <version>${spring.version}</version>
    </dependency>

    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-orm</artifactId>
        <version>${spring.version}</version>
    </dependency>
    <!-- Spring end -->

    <!-- Log4j start -->
    <dependency>
        <groupId>log4j</groupId>
        <artifactId>log4j</artifactId>
        <version>${log.version}</version>
    </dependency>
    <!-- Log4j end -->

    <dependency>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-resources-plugin</artifactId>
        <version>2.4.3</version>
    </dependency>
    </dependencies>

    <build>
        <finalName>studentScore</finalName>
        <pluginManagement><!-- lock down plugins versions to avoid using Maven defaults (may be moved to parent pom) -->
            <plugins>
                <plugin>
                    <artifactId>maven-clean-plugin</artifactId>
                    <version>3.0.0</version>
                </plugin>
                <!-- see http://maven.apache.org/ref/current/maven-core/default-bindings.html#Plugin_bindings_for_war_packaging -->
                <plugin>
                    <artifactId>maven-resources-plugin</artifactId>
                    <version>3.0.2</version>
                </plugin>
                <plugin>
                    <artifactId>maven-compiler-plugin</artifactId>
                    <version>3.7.0</version>
                </plugin>
                <plugin>
                    <artifactId>maven-surefire-plugin</artifactId>
                    <version>2.20.1</version>
                </plugin>
                <plugin>
                    <artifactId>maven-war-plugin</artifactId>
                    <version>3.2.0</version>
                </plugin>
                <plugin>
                    <artifactId>maven-install-plugin</artifactId>
                    <version>2.5.2</version>
                </plugin>
                <plugin>
                    <artifactId>maven-deploy-plugin</artifactId>
                    <version>2.8.2</version>
                </plugin>
            </plugins>
        </pluginManagement>
    </build>
</project>

3.创建实体类。首先创建一个实体包,在包里面新建一个class文件。

public class Book {
    private int id;
    private String name;
    private int number;
    省略了set,get方法
}

4.配置主配置文件,主配置文件在项目classpath根目录或者resources目录。文件名为hibernate.cfg.xml。如果不是这个名字,可在程序方法参数中设置文件路径,后面有写。

<?xml version="1.0" encoding="GBK"?>
<!-- 指定Hibernate配置文件的DTD信息 -->
<!DOCTYPE hibernate-configuration PUBLIC
        "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
        "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<!-- hibernate- configuration是连接配置文件的根元素 -->
<hibernate-configuration>
    <session-factory>
        <!-- 指定连接数据库所用的驱动 -->
        <property name="connection.driver_class">com.mysql.jdbc.Driver</property>
        <!-- 指定连接数据库的url,hibernate连接的数据库名 -->
        <property name="connection.url">jdbc:mysql://localhost/dbname</property>
        <!-- 指定连接数据库的用户名 -->
        <property name="connection.username">****</property>
        <!-- 指定连接数据库的密码 -->
        <property name="connection.password">****</property>
        <!-- 指定连接池里最大连接数 -->
        <property name="hibernate.c3p0.max_size">20</property>
        <!-- 指定连接池里最小连接数 -->
        <property name="hibernate.c3p0.min_size">1</property>
        <!-- 指定连接池里连接的超时时长 -->
        <property name="hibernate.c3p0.timeout">5000</property>
        <!-- 指定连接池里最大缓存多少个Statement对象 -->
        <property name="hibernate.c3p0.max_statements">100</property>
        <property name="hibernate.c3p0.idle_test_period">3000</property>
        <property name="hibernate.c3p0.acquire_increment">2</property>
        <property name="hibernate.c3p0.validate">true</property>
        <!-- 指定数据库方言 -->
        <property name="dialect">org.hibernate.dialect.MySQLDialect</property>
        <!-- 根据需要自动创建数据表 -->
        <property name="hbm2ddl.auto">update</property>
        <!-- 显示Hibernate持久化操作所生成的SQL -->
        <property name="show_sql">true</property>
        <!-- 将SQL脚本进行格式化后再输出 -->
        <property name="hibernate.format_sql">true</property>
        <!--设置数据源,由于上述使用的属性有hibernate.c3p0.*,会自动设置为C3P0可不设。默认为hibernate数据源。-->
        <property name="hibernate.connection.provider_class">org.hibernate.c3p0.internal.C3P0ConnectionProvider</property>
        <!--current_session作用域,thread表示当前线程用同一个session-->
        <property name="current_session_context_class">thread</property>
        <!-- 罗列所有的映射文件,resources为文件路径,最好和主配置文件同一目录,自己开始没同一目录报错了.原因未知,就是找不到 -->
        <mapping resource="Book.hbm.xml"/>
    </session-factory>
</hibernate-configuration>

5.配置映射文件。

创建映射文件,位置同上。放在JAVA包中不知为何会找不到,放在主配置文件同一个目录,解决问题。名字随意。

最好为  类名.hbm.xml.                           eg:Book.hbm.xml。

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
        "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<!--package为实体类包名-->
<hibernate-mapping package="entity">
    <!--name为类名,如果没写包名,这里的类名要写成权限定性类名.
    table为表名,不写默认为简单类名。tips:Windows系统mysql数据库默认不区分大小写。-->
    <class name="Book" table="book">
        <!--id标签表示这是主键,name为实体类属性名,column为对应表的
        gernarator参考https://blog.csdn.net/ye1992/article/details/19632001说明
        这里native就好了。-->
        <id name="id" column="book_id">
            <generator class="native"/>
        </id>
        <!--name为属性名,colunmn就是列名-->
        <property name="number" column="number"/>
        <property name="name" column="name"/>
    </class>
</hibernate-mapping>

6.开始编写测试类

6.1.插入(save和persist方法均可插入).save是hibernate的API,而persist是JPA的API。id按照映射文件设置的方法自动生成。

import entity.Book;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
import org.junit.Test;

public class Testtt {
    @Test
    public void test1(){
//        加载主配置文件,configure()中可添加参数,参数为主配置文件路径
        Configuration configuration = new Configuration().configure();
//        创建session工厂对象
        SessionFactory sessionFactory = configuration.buildSessionFactory();
//        通过session工厂获取current_session对象,也就是配置文件中设置的同一线程共享session。
        Session session = sessionFactory.getCurrentSession();
//        创建实体类对象
        Book book = new Book("亲热天堂1",9527);
        try{
//            开始事务
            session.beginTransaction();
//            往数据库insert book
            session.save(book);
//            提交事务
            session.getTransaction().commit();
        }catch (Exception e){
//            如果上面的程序出异常,事务回滚
            session.getTransaction().rollback();
        }
    }
}

6.2.删除(注意:删除的底层是根据主键id删除的,所以必须要有id属性)。使用delete方法

@Test

public void test2(){

// 加载主配置文件,configure()中可添加参数,参数为主配置文件路径 Configuration configuration = new Configuration().configure();// 创建session工厂对象 SessionFactory sessionFactory = configuration.buildSessionFactory();// 通过session工厂获取current_session对象,也就是配置文件中设置的同一线程共享session。 Session session = sessionFactory.getCurrentSession();// 创建Book对象,并设置id。 Book book = new Book(); book.setId(1008); try{// 开始事务 session.beginTransaction();// 从数据库删除 book session.delete(book);// 提交事务 session.getTransaction().commit(); }catch (Exception e){// 如果上面的程序出异常,事务回滚 session.getTransaction().rollback(); } }

6.3。更新(底层和删除一样,根据id吗所以也要有id属性。)

使用update方法。tips:还有一个saveOrUpdate方法,有id就更新,没id就插入。有id但是不存在则会报错。

 @Test
    public void test3(){
//        加载主配置文件,configure()中可添加参数,参数为主配置文件路径
        Configuration configuration = new Configuration().configure();
//        创建session工厂对象
        SessionFactory sessionFactory = configuration.buildSessionFactory();
//        通过session工厂获取current_session对象,也就是配置文件中设置的同一线程共享session。
        Session session = sessionFactory.getCurrentSession();
//        创建Book对象,设置它的所有属性并设置id。
        Book book = new Book("亲热天堂",95278);
        book.setId(1009);
        try{
//            开始事务
            session.beginTransaction();
//            往数据库删除 book
            session.update(book);
//            提交事务
            session.getTransaction().commit();
        }catch (Exception e){
//            如果上面的程序出异常,事务回滚
            session.getTransaction().rollback();
        }
    }

6.4查找

get方法当找不到是会返回null,load方法找不到是会报错。

@Test
    public void test4(){
//        加载主配置文件,configure()中可添加参数,参数为主配置文件路径
        Configuration configuration = new Configuration().configure();
//        创建session工厂对象
        SessionFactory sessionFactory = configuration.buildSessionFactory();
//        通过session工厂获取current_session对象,也就是配置文件中设置的同一线程共享session。
        Session session = sessionFactory.getCurrentSession();
        try{
//            开始事务
            session.beginTransaction();
//            从数据获取id为1009的Book并打印出来,需要重写Book的toString方法。
//            get第一个参数为类类型,第二个为id值。
            System.out.println(session.get(Book.class,1009));
//            提交事务
            session.getTransaction().commit();
        }catch (Exception e){
//            如果上面的程序出异常,事务回滚
            session.getTransaction().rollback();
        }
    }

7.额外注意:

不管你的程序中sql的顺序是如何,底层的执行顺序都是:增加->修改->删除->查找。

session的flush方法会立即执行上一部分的所有命令。这一部分依然按照上述顺序执行。

参考:

配置文件:https://blog.csdn.net/wangchuanqi1234/article/details/51131285


阅读更多
想对作者说点什么?

博主推荐

换一批

没有更多推荐了,返回首页