博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
使用IntelliJ IDEA开发SpringMVC网站(三)数据库配置
阅读量:6402 次
发布时间:2019-06-23

本文共 9669 字,大约阅读时间需要 32 分钟。

原文:

摘要 讲解在IntelliJ IDEA中,如何进行Mysql数据库的配置

目录[-]

转载请注明出处:

注:在阅读本文前,请先阅读:

访问GitHub下载最新源码:

文章已针对IDEA 15做了一定的更新,部分更新较为重要,请重新阅读文章并下载最新源码。

六、数据库配置

      下面,就要通过一个简单的例子,来介绍SpringMVC如何集成Spring Data JPA(由 Hibernate JPA 提供),来进行强大的数据库访问,并通过本章节的讲解,更加深刻地认识Controller是如何进行请求处理的,相信看完这一章节,你就可以开始你的开发工作了。

准备工作:

    在src\main\java中新建两个包:com.gaussic.model、com.gaussic.repository,将在后面用上,如下图所示:

140541_vzfm_2287879.png

1、创建Mysql数据库

      本文的讲解使用Mysql数据库,如果使用其它数据库的读者,可以去网上参考其他的配置教程,在此不做太多的叙述。数据库是一个底层的东西,底层的细节对上层的抽象并没有太大的影响,因此,只要配置好数据库,本章的内容仍然是适用于所有数据库的(貌似如此)。

      假设我们现在要建立一个小小的博客系统,其数据库ER图如下所示(当然这只是一个小小的例子,真实的博客系统比这要复杂的多):

165825_C5z3_2287879.png

    新建一个数据库springdemo,在数据库中,有两张表:

    (1)用户表user:用户登录信息,主键id设为自增

    (2)博文表blog:储存用户发表的博文,主键id设为自增,其中有一个外键user_id链接到user表。

    详细表结构如下图所示:

154242_uNGE_2287879.png

165707_Xx0o_2287879.png

使用MySQL Workbench添加外键流程:

154625_EKjj_2287879.png

170158_DzeJ_2287879.png

注意:在添加外键时,应该根据需求设置,例如右边红框中的Foreign Key Options,默认在Delete时是NO ACTION,说明在删除一个用户时,如果数据库中存在该用户的文章,那么就无法删除该用户,也无法删除该用户的所有文章,而如果将该选项改为CASCADE,那么删除该用户,就会同时删除该用户所有的文章。通常后者是不太可取的,因为如果发生了删除用户的误操作,很有可能该用户的内容被连带删除,且不可逆,这也是实现真实系统时需要考虑的原因之一。

2、IntelliJ IDEA导入数据库

    对于此前所接触的一些常用的框架中,一张数据表往往对应一个Java Bean。在SpringMVC中,这个Java Bean相当于model。那么,这个类是否需要自己来写呢?不需要,利用IntelliJ IDEA可以帮我们自动的生成这些JavaBean。

    首先,右键项目,选择Add Framework Support:

161733_veHn_2287879.png

下拉选择JavaEE Persistence,右边provider选择Hibernate:

191503_1Qcl_2287879.png

    在这一步结束后,我们可以发现,在resources里面生成了persistence.xml配置文件,左边栏出现了一个Persistence标题(若没有请点击左下角那个灰框):

191743_X28m_2287879.png

    persistemce.xml具体如下:

    
        
org.hibernate.ejb.HibernatePersistence
        
            
            
            
            
            
            
            
            
        
    

    我们先不着急填写这个配置文件。点开左边栏的Persistence,显示如下图所示:

191844_e9cw_2287879.png

右键项目名,选择Generate Persistence Mapping,再选择By Database Schema:

191911_tyeY_2287879.png

出现如下界面,其主要需要配置的地方如下图红框所示:

163428_RxJL_2287879.png

    点击Choose Data Source右边的三个点选择数据源,在弹出的界面左上角选择“+”,选择Mysql:

163618_u1DC_2287879.png

在如下界面填写主机、端口号、数据库名、用户名、密码,如果驱动丢失点击下面的Download可以下载驱动,点击 Test Connection可以测试数据库是否连接成功:

163808_eb51_2287879.png

    在以上界面配置完成后,点OK,第一次使用需要Setup Master Password:

    164622_rs6v_2287879.png

    回到如下页面,package填写model包(1),勾选Prefer primitive type使用原始数据类型(2),勾选Show default relationships以显示所有数据库关系(3),再点击刷新按钮(4),将会找到数据库中的两个表,勾选两个数据表(5),再勾选Generate Column Defination以生成每一列的描述信息(6)。选中blog表然后点击“+”号按钮,添加外键关系(7)。

205813_NmEP_2287879.png

210658_pKKH_2287879.png

    点击OK后,在Database Schema Mapping中可以发现多出了两个关系,如图所示:

210911_nFZM_2287879.png

   再点击OK,稍后,打开model包,可以看到生成了两个Java Bean,在SpringMVC中称为两个实体,它们对应了数据库的两张表:

170744_KzXw_2287879.png

BlogEntity如下所示(注意把java.sql.Date改为java.util.Date):

package com.gaussic.model;import javax.persistence.*;import java.util.Date;/** * Created by dzkan on 2016/3/8. */@Entity@Table(name = "blog", schema = "springdemo", catalog = "")public class BlogEntity {    private int id;    private String title;    private String content;    private Date pubDate;    private UserEntity userByUserId;    @Id    @Column(name = "id", nullable = false)    public int getId() {        return id;    }    public void setId(int id) {        this.id = id;    }    @Basic    @Column(name = "title", nullable = false, length = 100)    public String getTitle() {        return title;    }    public void setTitle(String title) {        this.title = title;    }    @Basic    @Column(name = "content", nullable = true, length = 255)    public String getContent() {        return content;    }    public void setContent(String content) {        this.content = content;    }    @Basic    @Column(name = "pub_date", nullable = false)    public Date getPubDate() {        return pubDate;    }    public void setPubDate(Date pubDate) {        this.pubDate = pubDate;    }    @Override    public boolean equals(Object o) {        if (this == o) return true;        if (o == null || getClass() != o.getClass()) return false;        BlogEntity that = (BlogEntity) o;        if (id != that.id) return false;        if (title != null ? !title.equals(that.title) : that.title != null) return false;        if (content != null ? !content.equals(that.content) : that.content != null) return false;        if (pubDate != null ? !pubDate.equals(that.pubDate) : that.pubDate != null) return false;        return true;    }    @Override    public int hashCode() {        int result = id;        result = 31 * result + (title != null ? title.hashCode() : 0);        result = 31 * result + (content != null ? content.hashCode() : 0);        result = 31 * result + (pubDate != null ? pubDate.hashCode() : 0);        return result;    }    @ManyToOne    @JoinColumn(name = "user_id", referencedColumnName = "id", nullable = false)    public UserEntity getUserByUserId() {        return userByUserId;    }    public void setUserByUserId(UserEntity userByUserId) {        this.userByUserId = userByUserId;    }}

    再看UserEntity:

package com.gaussic.model;import javax.persistence.*;import java.util.Collection;/** * Created by dzkan on 2016/3/8. */@Entity@Table(name = "user", schema = "springdemo", catalog = "")public class UserEntity {    private int id;    private String nickname;    private String password;    private String firstName;    private String lastName;    private Collection
 blogsById;    @Id    @Column(name = "id", nullable = false)    public int getId() {        return id;    }    public void setId(int id) {        this.id = id;    }    @Basic    @Column(name = "nickname", nullable = false, length = 45)    public String getNickname() {        return nickname;    }    public void setNickname(String nickname) {        this.nickname = nickname;    }    @Basic    @Column(name = "password", nullable = false, length = 45)    public String getPassword() {        return password;    }    public void setPassword(String password) {        this.password = password;    }    @Basic    @Column(name = "first_name", nullable = true, length = 45)    public String getFirstName() {        return firstName;    }    public void setFirstName(String firstName) {        this.firstName = firstName;    }    @Basic    @Column(name = "last_name", nullable = true, length = 45)    public String getLastName() {        return lastName;    }    public void setLastName(String lastName) {        this.lastName = lastName;    }    @Override    public boolean equals(Object o) {        if (this == o) return true;        if (o == null || getClass() != o.getClass()) return false;        UserEntity that = (UserEntity) o;        if (id != that.id) return false;        if (nickname != null ? !nickname.equals(that.nickname) : that.nickname != null) return false;        if (password != null ? !password.equals(that.password) : that.password != null) return false;        if (firstName != null ? !firstName.equals(that.firstName) : that.firstName != null) return false;        if (lastName != null ? !lastName.equals(that.lastName) : that.lastName != null) return false;        return true;    }    @Override    public int hashCode() {        int result = id;        result = 31 * result + (nickname != null ? nickname.hashCode() : 0);        result = 31 * result + (password != null ? password.hashCode() : 0);        result = 31 * result + (firstName != null ? firstName.hashCode() : 0);        result = 31 * result + (lastName != null ? lastName.hashCode() : 0);        return result;    }    @OneToMany(mappedBy = "userByUserId")    public Collection
 getBlogsById() {        return blogsById;    }    public void setBlogsById(Collection
 blogsById) {        this.blogsById = blogsById;    }}

3、配置数据库

    既然数据库已经导入了,那么前期准备工作基本完成,还需要进行最终的配置。

    首先,打开mvc-dispatcher-servlet.xml,添加下列配置(如果某些地方报错,请选中并按Alt + Insert补全配置):

    
    

    讲解:

    (1) jpa:repositories:这一部分涉及到数据库的接口,将在后面详解;

    (2)entityManagerFactory:实体管理器工厂,读取persistence.xml配置;

    (3)transactionManager:事务管理器,利用entityManager进行事务管理;

    (4)tx:annotation-driven:打开事务管理器的注解驱动,可以使用注解的方法操纵数据库。

整体如下所示:

    
    
    
    
    
    
    
    
    
        
        
        
        
    
    
    
        
        
    
        
        
    

    下面,填充persistence.xml,将persistence-unit的name改为 defaultPersistenceUnit。在下面的文件中,我添加了一些更为详细的配置:

    
        
org.hibernate.ejb.HibernatePersistence
        
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
        
    

    现在,重新启动tomcat,如果没有报错,说明数据库已经配置完成了,接下来就要讲解数据库的相关开发工作。

更新:

      阅读评论发现许多同学的persistence.xml出现了问题,因为出现问题的原因可能有很多,如果没有完全的报错以及代码的话,我这边很难解决问题,一个办法就是在上面提问并贴出代码,我这边尽量解答。另一个办法就是下载最新的代码运行看有没有什么问题。

       最后一个办法,尝试另外一种配置方法,无需persistence.xml,直接在mvc-dispatcher-servlet.xml中配置数据库,如下所示:

    
    
    
        
        
        
            
com.mysql.jdbc.Driver            
jdbc:mysql://localhost:3306/springdemo            
root            
111111            
false            
true            
UTF-8            
true            
true            
validate            
true            
org.hibernate.dialect.MySQL5Dialect            
true            
true        
    

          删除persistence.xml,直接修改entityManagerFactory bean为如上图所示。这个方法可以拜托persistence.xml的困扰,但是有一个小小的问题,如果之前没有添加Java EE Persistence这个框架的,文中的Persistence工具栏将不会显示。一个解决办法就是,先修改mvc-dispatcher-servlet,然后再添加Java EE Persistence框架,等能够看到Persistence工具栏后,删除persistence.xml,余下的步骤可以继续操作。

        转载请注明出处:

你可能感兴趣的文章
SVG 扬帆起航
查看>>
NET Core-学习笔记(二)
查看>>
职业生涯上的点点滴滴
查看>>
Linux下添加新硬盘,分区及挂载
查看>>
一起来将vscode变成私人定制笔记本
查看>>
Flutter 云音乐
查看>>
RecyclerView实现多type页面
查看>>
个人的web商城网站
查看>>
debian fcitx
查看>>
排中律与实无穷问题的性质分析
查看>>
08/23 学习总结
查看>>
关于Ubuntu下安装phpmyadmin后mysqli丢失的解决
查看>>
物理层
查看>>
linux多网卡路由设置
查看>>
win7环境下的栈溢出与实战
查看>>
查看ios字体库方法
查看>>
八大监听器
查看>>
self.navigationController退出到指定页面,或者一次性pop出n个页面
查看>>
Quartz实现数据库动态配置定时任务
查看>>
iptables 端口转发以及双向通信
查看>>