ideaspringmvc连接mysql,使用IntelliJ IDEA开发SpringMVC网站(三)数据库配置

news/2024/5/16 6:16:29/文章来源:https://blog.csdn.net/weixin_35006433/article/details/115974795

六、数据库配置

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

准备工作:

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

112a7152fd81

Paste_Image.png

1、创建Mysql数据库

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

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

112a7152fd81

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

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

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

详细表结构如下图所示:

112a7152fd81

112a7152fd81

使用MySQL Workbench添加外键流程:

112a7152fd81

112a7152fd81

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

2、IntelliJ IDEA导入数据库

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

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

112a7152fd81

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

112a7152fd81

注:这一部分有一点过时,更新的项目中直接把数据库的配置放在了mvc-dispatcher-servlet.xml中,但依然要做这一步的操作,为了这一步可以使用Persistence的工具。

关于新的配置,可以翻到博客底部。

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

112a7152fd81

persistemce.xml具体如下:

org.hibernate.ejb.HibernatePersistence

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

112a7152fd81

可以打开view-toolswindows中打开上面的菜单

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

112a7152fd81

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

112a7152fd81

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

112a7152fd81

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

112a7152fd81

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

112a7152fd81

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

112a7152fd81

112a7152fd81

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

112a7152fd81

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

112a7152fd81

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:打开事务管理器的注解驱动,可以使用注解的方法操纵数据库。

整体如下所示:

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xmlns:context="http://www.springframework.org/schema/context"

xmlns:mvc="http://www.springframework.org/schema/mvc"

xmlns:jpa="http://www.springframework.org/schema/data/jpa"

xmlns:tx="http://www.springframework.org/schema/tx"

xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd

http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd

http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd

http://www.springframework.org/schema/data/jpa http://www.springframework.org/schema/data/jpa/spring-jpa.xsd

http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd">

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

org.hibernate.ejb.HibernatePersistence

value="jdbc:mysql://localhost:3306/springdemo"/>

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

更新:

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

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

com.mysql.jdbc.Driver

jdbc:mysql://localhost:3306/springdemo?useSSL=false

root

111111

false

true

UTF-8

true

true

update

true

org.hibernate.dialect.MySQL5Dialect

true

true

true

org.hibernate.service.jdbc.connections.internal.C3P0ConnectionProvider

5

600

1800

50

SELECT 1;

true

3000

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_789726.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

对外汉语偏误语料库_干货收藏!最全对外汉语教学资源网站

快上研究生的你会面临成为新手教师的困难!很多新手教师在每次备课的时候,都要花费大量的时间和精力在找素材上。学姐们为大家准备了资源网站集锦,希望能够帮助各位老师更高效地备课。教学网站篇网络孔子学院网络孔子学院,这个网站…

mysql投票网站_PHP+Mysql实现网站顶和踩投票功能实例

PHPMysql实现网站顶和踩投票功能实例,通过记录用户IP,判断用户的投票行为是否有效,该实例也可以扩展到投票系统中。首先我们在页面上放置“顶”和“踩”的按钮,即#dig_up和#dig_down,按钮上分别记录了投票的票数以及所…

php支付宝异步回调验签失败,thinkphp网站支付宝异步回调验签失败问题_PHP开发框架教程...

了解Redis这个核心数据类型_PHP开发框架教程string字符串tring类型是二进制安全的,即string中可以包含任何数据,Redis 中的普通string采用rawencoding 即原始编码方式,该编码方式会动态扩容,并通过提前预分配冗余空间,…

java扶贫,java精准扶贫捐赠网站ssm框架

本精准扶贫网站管理系统主要包括系统用户管理模块、捐赠信息管理模块、投诉信息管理、扶贫资讯管理、登录模块、和退出模块等多个模块,系统采用了jsp的mvc框架,SSM(springMvcspringMybatis)框架进行开发,本系统使用mysql,独立运行,不依附于其他系统,可移…

重定向 header_[SEO名词]网站301重定向是什么?

301转向(或叫301重定向,301跳转)是当用户或搜索引擎向网站服务器发出浏览请求时,服务器返回的HTTP数据流中头信息(header)中的状态码的一种,表示本网页永久性转移到另一个地址。301重定向对网站真正的用途很大一部分是为了用户而设置的&#…

美国服务器网站怎么黑屏了,关于美国服务器IP的常见问题的详细解答!

原标题:关于美国服务器IP的常见问题的详细解答!在租用服务器时,与之密切相关的一个要素就是IP,关于IP的问题总是有人问起,这里列举几项常见的问题,以供参考。一、IP收费吗?一般情况下&#xff0…

从前慢-SEO

SEO 1 广告 商家给相应公司钱,就有了广告,每点击一下,就会耗费商家的钱, 这里的广告也叫SEM2 百度快照 符合SEO标准,被百度收录,显示百度快照。 这里的百度快照也叫SEO3 搜索引擎概述 搜索引擎是指根据一定的策略、运用特定的计算机程序,从 互联网上搜…

Linux下如何禁止浏览器访问某些网站

cd 到/etc sudo vim hosts 修改hosts文件 在如下位置插入 127.0.0.1 Tab键 需要屏蔽的网址 保存退出,被屏蔽的网站已无法访问

基于openerp的erpcmsone:可当网站程序可当内部知识管理及ERP,及前后端合一的通用网站程序选型,设计与部署

本文关键字:openerp website,erp backend website,erp based portal,netdisk storage based blog,uniform www and erp system 作为一个自己不断尝试建站自用的vps和虚机重度用户,我需要的是一个外能当个人博客用内能当云存储使用的网站程序&#xff0c…

python在线实战_实战 - 廖雪峰的官方网站

看完了教程,是不是有这么一种感觉:看的时候觉得很简单,照着教程敲代码也没啥大问题。 于是准备开始独立写代码,就发现不知道从哪开始下手了。 这种情况是完全正常的。好比学写作文,学的时候觉得简单,写的时…

一种设想:打造小程序版本公号和自托管的公号,将你的网站/blog做到微信/微信公号里且与PC端合一

本文关键字:打造小程序版本公号,打造微网站版本公号,,从私有云到私流,微信移动生态,微信开发者号注册,将你的网站做到微信,微信blog微网站/小程序,将认证后端做在网盘中,,将你的网站…

一个netdisk storage backend app webos和增强的全功能网站云设想

本文关键字:利用网盘空间,network filesystem代替静态网站空间,做成静态网站的动态模块,利用v2y,nginx给onedriveonemanager做自动cdn,利用网盘代替函数计算 在前面《利用大容量网盘onedrive配合公有云做你的nas及做站》我们说到用网盘空间达成网站云和用网盘做附件…

vue seo关键词设置_SEO 技术指南

从搜索引擎出现之初,SEO 就一直是个避不开的话题,许多产品将搜索引擎看做一个潜在的获客渠道,希望通过”流量“为产品带来价值。搜索一下”SEO“这个关键词,会出现大把的推广公司,甚至有专门的 SEO 工程师,…

如何利用铁威马NAS搭建网站服务器?

利用铁威马NAS,你可以将TNAS架设成一个网站服务器。如需启用网站服务器功能,请前往 TOS 桌面 > 控制面板 > 网络服务 > 网站服务器。 1.勾选“启用网站服务器”; 2.设置网站服务器的端口号,设置网站根目录(…

教你利用铁威马NAS轻松搭建网站服务器

在铁威马NAS中,你可以将TNAS架设成一个网站服务器。如需启用网站服务器功能,需要开启网站服务器。 1.登录TOS系统; 2.单击TOS桌面-控制面板-网络服务-网站服务器; 3.勾选启用网站服务器; 4.设置网站服务器端口号&am…

如何利用铁威马NAS搭建网站服务器

Web Server可以将TNAS 架设成一个网站服务器,在网站服务器中设定多个虚拟主机。如需启用网站服务器功能,需要开启网站服务器。 如何利用铁威马NAS搭建网站服务器 1.TOS应用中心Web Serve应用; 2.下载完成后,单击桌面&#xff0c…

推荐Maven Repository网站

该网站提供Maven/Ivy各类软件最新版本信息,并提供dependency配置信息,非常方便。Http链接地址:Maven Repository

解决IIS管理器的网站可访问但ftp无法访问的问题

解决IIS管理器的网站可访问但ftp无法访问的问题 本问题的具体描述: IIS管理器已开启ftp和网页站点,也进行了ip绑定,网页站点在本机可访问,在局域网其他机器也可访问,ftp站点在本机可访问,但在局域网其他机器…

下面是应用SharePoint开发的网站的截图,个人感觉很不错

转自 http://www.theferal.com/new1.htm 转载于:https://www.cnblogs.com/huangfh/archive/2004/11/22/67021.html

超级好用的5个免费在线版流程图制作网站

超级好用的5个免费在线版流程图制作网站 1. zen flowchart 虽然是英文,但其实也并没有多么复杂的内容,而且浏览器现在都带有页面翻译的功能,所以还是蛮方便的!初次使用需要注册,也并不难,随便自己的一个邮…