Java-Hibernate简单增删改查

Hibernate 简单增删改查


转载自 https://www.shiyanlou.com/courses/document/971


一、实验环境说明

1. 环境登录

无需密码自动登录,系统用户名 shiyanlou,密码 shiyanlou

2. 环境介绍

本实验环境采用带桌面的 Ubuntu Linux 环境,实验中可能会用到桌面上的程序:

  • XfceTerminal: Linux 命令行终端,打开后会进入 Bash 环境,可以使用 Linux 命令;
  • Firefox:浏览器,可以用在需要前端界面的课程里,只需要打开环境里写的 HTML/JS 页面即可;
  • GVim:非常好用的编辑器,最简单的用法可以参考课程 Vim编辑器
  • Eclipse:Eclipse 是著名的跨平台的自由集成开发环境(IDE)。主要用来 Java 语言开发,但是目前亦有人通过插件使其作为 C++ 和 Python 等语言的开发工具。

3. 环境使用

使用 GVim 编辑器输入实验所需的代码,然后使用 XfceTerminal 命令行环境进行编译运行,查看运行结果,运行后可以截图并分享自己的实验成果,实验楼提供的截图是后台截图,无法作弊,可以真实有效证明您已经完成了实验。

实验记录页面可以在“我的课程”中查看,其中含有每次实验的截图及笔记,以及每次实验的有效学习时间(指的是在实验桌面内操作的时间,如果没有操作,系统会记录为发呆时间)。这些都是您学习的真实性证明。

二、MySQL 准备

本次课程使用 MySQL 数据库。首先启动 mysql :

$ sudo service mysql start

然后在终端下输入以下命令,进入到 MySQL 数据库(-u 表示用户名,比如这里的root,-p 表示密码,这里没有密码就省略了):

$ mysql -u root

图片描述信息

查看数据库列表:

图片描述信息

为了实验方便,我们在这里新建一个数据库并取名 hibernate 用作实验。

图片描述信息

进入该数据库,可以看到当前数据库是空的:

$ use hibernate;

图片描述信息

数据库的操作,暂时就到这里,我们现在可以着手新建项目了。

三、新建项目工程

  • 说明:Hibernate 以及其他必要文件已经内置在了实验环境中。

(1)导入必要的 JAR 包

新建一个 Java 工程,然后引入必要的 jar 包,右击项目工程,依次选择 Properties->Java Build Path->Libraries->Add External JARs。Hibernate jar 包路径为:/home/shiyanlou/hibernate-release-4.3.9.Final/lib/required/;mysql-connector jar 包的路径伪: /home/shiyanlou/mysql-connector-java-5.1.35-bin.jar。最后总的需要的包如下:

图片描述信息

(2)新建实体类 User.java

这个没什么太多说的,一个用户具有:id、username、password 三个属性。

package shiyanlou.test.hibernate.entity;

public class User {

    private int id;
    private String username;
    private String password;


    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getUsername() {
        return username;
    }
    public void setUsername(String username) {
        this.username = username;
    }
    public String getPassword() {
        return password;
    }
    public void setPassword(String password) {
        this.password = password;
    }

}

(3)配置 hibernate.cfg.xml

在 src 目录下,新建 hibernate.cfg.xml 文件,其配置如下:

<?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>

        <!-- Database connection settings -->

        <!-- 表示使用 mysql 数据库驱动类 -->
        <property name='connection.driver_class'>com.mysql.jdbc.Driver</property>

        <!-- jdbc 的连接 url 和数据库(使用我们之前新建的 hibernate)-->
        <property name='connection.url'>jdbc:mysql://localhost:3306/hibernate</property>

        <!-- 数据库用户名 -->
        <property name='connection.username'>root</property>

        <!-- 密码(这里为空) -->
        <property name='connection.password'></property>

        <!-- JDBC connection pool (use the built-in) -->
        <!-- <property name='connection.pool_size'>1</property>-->

        <!-- 数据库使用的方言 -->
        <property name='dialect'>org.hibernate.dialect.MySQLDialect</property>

        <!-- Echo all executed SQL to stdout -->
        <!-- 设置 打印输出 sql 语句 为真 -->
        <property name='show_sql'>true</property>

        <!-- 设置格式为 sql -->
        <property name='format_sql'>true</property>

        <!-- 第一次加载 hibernate 时根据实体类自动建立表结构,以后自动更新表结构 -->
        <property name='hbm2ddl.auto'>update</property>         

        <!-- 映射文件 -->
        <mapping resource='shiyanlou/test/hibernate/entity/User.hbm.xml'/>

    </session-factory>

</hibernate-configuration>

其中,数据库连接的 url 端口号,可以通过下面的命令来查看:

图片描述信息

对于用户名和密码,则是:

图片描述信息

(4)配置 User.hbm.xml

一个实体类对应一个映射文件,且位于同一个包(package)下。

图片描述信息

<?xml version='1.0'?>
<!DOCTYPE hibernate-mapping PUBLIC
        '-//Hibernate/Hibernate Mapping DTD 3.0//EN'
        'http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd'>

<!-- 映射对应的 package -->
<hibernate-mapping package='shiyanlou.test.hibernate.entity'>

    <!-- 实体类和数据库中的表对应(如果没有这个表则新建) -->
    <class name='User' table='user_info'>

        <!-- id主键 和其他属性对应表中相应的字段(这些都是在 User.java 实体类中定义的) -->
        <id name='id' column='user_id'/>
        <property name='username' column='user_username'></property>
        <property name='password' column='user_password'></property>

    </class>
</hibernate-mapping>

四、运行

一个示例的项目结构如图所示(不一定完全一样):

图片描述信息

我们需要根据不同的情况,改变测试类的行为。

(1)增

public class Test {

    @SuppressWarnings('unchecked')
    public static void main(String[] args) {

        // 获取 Hibernate 配置信息
        Configuration configuration = new Configuration().configure();

        // 根据 configuration 建立 sessionFactory
        SessionFactory sessionFactory = configuration.buildSessionFactory();

        // 开启 session(相当于开启 JDBC 的 connection)
        Session session = sessionFactory.openSession();

        // 创建并开启事务对象
        session.beginTransaction();

        // 新建对象,并赋值
        User user = new User();
        user.setId(1);
        user.setUsername('admin');
        user.setPassword('admin');

        // 保存对象
        session.save(user);

        // 提交事务
        session.getTransaction().commit();

        // 关闭 session 和 sessionFactory
        session.close();
        sessionFactory.close();
    }
}

Eclipse 控制台输出:

图片描述信息

对比查看 mysql 中的 hibernate 数据库中的 user_info 表:

图片描述信息

你可以多新建几个测试用户,以方便实验。例如:

图片描述信息

(2)查

public class Test {

    @SuppressWarnings('unchecked')
    public static void main(String[] args) {

        Configuration configuration = new Configuration().configure();
        SessionFactory sessionFactory = configuration.buildSessionFactory();
        Session session = sessionFactory.openSession();
        session.beginTransaction();

        // 利用 StringBuilder 来连接查询语句
        StringBuilder hq = new StringBuilder();

        // 从 User 里面查找(注意 from 后有空格)
        // 相当于 'select * from user_info;'
        hq.append('from ').append( User.class.getName() );

        // 利用 session 建立 query
        Query query = session.createQuery( hq.toString() );

        // 序列化 query 的结果为一个 list 集合
        List<User> users = query.list();

        // 打印每一个 User 信息(这里只打印了名字,你也可以打印其他信息)
        for (User user : users) {
            System.out.println( user.getUsername() );

        }

/*      User user = new User();
        user.setId(3);
        user.setUsername('user2');
        user.setPassword('helloworld');

        session.save(user);*/

        session.getTransaction().commit();
        session.close();
        sessionFactory.close();
    }
}

Eclipse 控制台输出:

图片描述信息

(3)改

假设现在我们需要把 user1 的密码改成一个比较复杂的 “123-user”。

public class Test {

    @SuppressWarnings('unchecked')
    public static void main(String[] args) {
        Configuration configuration = new Configuration().configure();
        SessionFactory sessionFactory = configuration.buildSessionFactory();
        Session session = sessionFactory.openSession();
        session.beginTransaction();

        StringBuilder hq = new StringBuilder();

        // 对比查找的操作来看,因为我们需要修改指定 name 的用户密码,后面需要再添加查询条件
        // 注意 from、where 的空格,':name' 表示一个参数
        hq.append('from ').append(User.class.getName()).append(' where user_username=:name');

        Query query = session.createQuery(hq.toString());

        // 这里就设定参数 name 的值为'user1'
        query.setString('name','user1' ); 

        List<User> users = query.list();

        for (User user : users) {

            // 修改 user1 的密码
            user.setPassword('123-user');

            // 注意这里是 update
            session.update(user);
        }

        session.getTransaction().commit();
        session.close();
        sessionFactory.close();
    }

Eclipse 控制台输出:

图片描述信息

对比查看 mysql (user1 的密码已经被修改):

图片描述信息

另外,你也可以直接通过这样的方式实现修改:

User user = new User();
user.setId(2);
user.setUsername('user1');
user.setPassword('123-user');

// update
session.update(user)

(4)删

同修改类似,也需要先通过条件查找,再进行删除;

public class Test {

    @SuppressWarnings('unchecked')
    public static void main(String[] args) {
        Configuration configuration = new Configuration().configure();
        SessionFactory sessionFactory = configuration.buildSessionFactory();
        Session session = sessionFactory.openSession();
        session.beginTransaction();

        StringBuilder hq = new StringBuilder();

        // 对比查找时候的操作来看,因为我们需要修改指定 name 的用户密码,后面需要再添加查询条件
        // 注意 from、where 的空格,':name' 表示一个参数
        hq.append('from ').append(User.class.getName()).append(' where user_username=:name');

        Query query = session.createQuery(hq.toString());

        // 这里就设定参数 name 的值为'user1'
        query.setString('name','user1' ); 

        List<User> users = query.list();

        for (User user : users) {
            // 注意这里是 delete
            session.delete(user);
        }

        session.getTransaction().commit();
        session.close();
        sessionFactory.close();
    }

Eclipse 控制台输出为:

图片描述信息

对比查看 mysql (可以看到 user1 已经被删除):

图片描述信息

同样的道理,你也可以这样来删除:

User user = new User();
user.setId(2);

// delete
session.delete(user);

五、小结

本次课程我们利用 Hibernate 实现了数据库操作的【增删改查】四大基本操作。

六、思考

考虑把【增删改查】操作封装成单独的功能类或函数,这样使用起来就很方便不用直接改代码。这也是良好的编码习惯。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值