其他分享
首页 > 其他分享> > Spring Boot + Hibernate 项目搭建和登录注册例子

Spring Boot + Hibernate 项目搭建和登录注册例子

作者:互联网

开发工具:IntelliJ IDEA

本篇将记录创建一个 Spring Boot + Hibernate 项目,并且编写一个注册登录的例子,毕竟Java的东西配置起来真有点麻烦

创建数据库

就随便一点吧,使用MySql,数据库就用 test ,新建一个 users 表,随便设置几个字段

注意

  1. 要按照命名规范,单词均小写,不同单词之间使用下划线隔开
  2. Hibernate 貌似不推荐使用外键,需要我们在代码中手动控制实体之间的关系
    其实是我在使用 Hibernate 和 Mybatis 的时候,用了很多时间都没解决外键的问题,写配置也觉得挺麻烦的
    感觉有时候不如自己封装JDBC,只能感叹 Entity Framework Core 是真的好用,大概是我还太菜了吧,等我有时间解决外键的问题再写另一篇记录吧 T_T

创建 Spring Boot 项目

注意:有可能因为网络问题创建不成功,可以使用代理网络或者手机热点试试

新建项目,选择 Spring Initializr,JDK 一般都是1.8吧,因为只是例子,所以我就随便选一个版本了

Group:一般的是域名
Artifact:项目名称

因为是例子,所以我随便起名了,然后Next

可以选择一些需要的库,也可以之后用Maven添加,这里我就选一个Web,然后Next

到这里其实只需要改一个路径就好了,路径最后的文件夹名称一定要和项目名称一致,然后就创建了

创建完项目,右键 src

配置Maven,这里就不详细展开讲了,Maven的配置 baidu bing之类的搜索引擎随便查都有答案

修改 pom.xml 文件,因为配置过于麻烦,所以我直接把做好的扔出来了,不包括数据库日志依赖库,需要什么就自己添加吧

<?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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.4.1</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.springboot_hibernate.online_shop</groupId>
    <artifactId>demo</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>war</packaging>

    <properties>
        <java.version>11</java.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis-reactive</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>io.projectreactor</groupId>
            <artifactId>reactor-test</artifactId>
            <scope>test</scope>
        </dependency>
        <!--springboot依赖-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
            <!-- 移除嵌入式tomcat插件 -->
            <exclusions>
                <exclusion>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-starter-tomcat</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-thymeleaf</artifactId>
        </dependency>
        <!-- JAP -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
        </dependency>
        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-entitymanager</artifactId>
        </dependency>
        <dependency>
            <groupId>org.aspectj</groupId>
            <artifactId>aspectjweaver</artifactId>
        </dependency>
        <!-- 数据库驱动-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
            <version>3.1.0</version>
            <scope>provided</scope>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

配置本地 tomcat

当然,上方的配置已经移除了自带的 tomcat ,接下来我们自己部署

选择本地 tomcat 路径

配置部署文件

这个两个选哪个都行

配置 MySql

输入用户名和密码,填写连接字符串,然后点击 Test Connection
连接字符串参考:jdbc:mysql://localhost:3306?useUnicode=true&characterEncoding=utf8&serverTimezone=GMT%2B8&useSSL=false

项目结构 和 application.peoperties

项目结构,仅供参考

配置 application.peoperties

spring.datasource.driver-class-name=com.mysql.jdbc.Driver
# 这里是数据库连接字符串,可能需要修改
spring.datasource.url=jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf8&serverTimezone=GMT%2B8&useSSL=false
spring.datasource.username=root
spring.datasource.password=123456
spring.thymeleaf.encoding=UTF-8
# 视图路径
spring.thymeleaf.prefix=classpath:/templates/Views/

# Specify the DBMS
spring.jpa.database = MYSQL
# Show or not log for each sql query
spring.jpa.show-sql = true
# Hibernate ddl auto (create, create-drop, update)
spring.jpa.hibernate.ddl-auto = update
# Naming strategy
spring.jpa.hibernate.naming-strategy = org.hibernate.cfg.ImprovedNamingStrategy
# stripped before adding them to the entity manager
spring.jpa.properties.hibernate.dialect = org.hibernate.dialect.MySQL5Dialect

主页和控制器

主函数

@SpringBootApplication
@EnableJpaRepositories
@EntityScan(basePackages = "com.springboot.demo.Models")
public class DemoApplication extends SpringBootServletInitializer
{
    @Override
    protected SpringApplicationBuilder configure(SpringApplicationBuilder springApplicationBuilder)
    {
        return springApplicationBuilder.sources(DemoApplication.class);
    }

    public static void main(String[] args)
    {
        SpringApplication.run(DemoApplication.class, args);
    }

}

主页 html,在 Views,新建 Home 文件夹,在Home文件夹下新建 Index.html 文件

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <link href="css/MySheetStyle.css" type="text/css" rel="stylesheet">
    <title>Index</title>
</head>
<body>
<h1>This is Home Index Page</h1>
</body>
</html>

控制器,这里注意一下,我使用 ModelAndView 作为返回值,主要是懒得敲前端代码,具体返回值可以自己定义字符串或者Json之类的
  我还是喜欢 ASP.NET Core ,View 和 ViewComponent 是真的方便,虽然前后端不分离,但是后端代码写起来着爽啊,毕竟我只是写后端的 ( ̄_, ̄ )

@RestController
public class HomeController
{
    @RequestMapping("/")
    public ModelAndView Index()
    {
        ModelAndView mav=new ModelAndView();
        mav.setViewName("Home/Index");
        return mav;
    }
}

运行项目,还算成功

Hibernate 生成实体类

选择项目结构

选择 Modules ,添加 Hibernate

应用和确定,就会在左侧出现 persistence 选项

点击,然后右键 demo 选项,再选择 Generate Persistence Mapping ,选择 By Database Schema

选择数据库连接,再选择需要生成的实体类,这里我稍微更改了类名,因为数据库的表是 users ,而实体类我想叫 User ,前缀后缀看个人喜好吧,hibernate 配置文件可以自己新建一个,我的配置文件在 resources 目录下,然后 Ok 就会生成实体类和相应的配置文件

生成的实体类 UserEntity ,这里我去掉了 catalog

package com.springboot.demo.Models;

import javax.persistence.*;

@Entity
@Table(name = "users", schema = "test")
public class UserEntity
{
    private int id;
    private String username;
    private String password;

    @Id
    @Column(name = "id", nullable = false)
    public int getId()
    {
        return id;
    }

    public void setId(int id)
    {
        this.id = id;
    }

    @Basic
    @Column(name = "username", nullable = false, length = 50)
    public String getUsername()
    {
        return username;
    }

    public void setUsername(String username)
    {
        this.username = username;
    }

    @Basic
    @Column(name = "password", nullable = false, length = 20)
    public String getPassword()
    {
        return password;
    }

    public void setPassword(String password)
    {
        this.password = password;
    }

    @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 (username != null ? !username.equals(that.username) : that.username != null)
        {
            return false;
        }
        if (password != null ? !password.equals(that.password) : that.password != null)
        {
            return false;
        }

        return true;
    }

    @Override
    public int hashCode()
    {
        int result = id;
        result = 31 * result + (username != null ? username.hashCode() : 0);
        result = 31 * result + (password != null ? password.hashCode() : 0);
        return result;
    }
}

生成的实体配置文件 UserEntity.hbm.xml

<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE hibernate-mapping PUBLIC
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping>

    <class name="com.springboot.demo.Models.UserEntity" table="users" schema="test">
        <id name="id">
            <column name="id" sql-type="int"/>
        </id>
        <property name="username">
            <column name="username" sql-type="varchar(50)" length="50"/>
        </property>
        <property name="password">
            <column name="password" sql-type="varchar(20)" length="20"/>
        </property>
    </class>
</hibernate-mapping>

DAO 接口

这里你可以选择编写一个基础接口,类似这样的,然后再去继承,要注意命名规范,这个IDEA有提示

@Repository
public interface IBaseDAO<T> extends JpaRepository<T,Integer>
{
    public T findById(int id);

    public List<T> findAll();
}

其实我觉得这样做的意义不是很大,所以我直接继承 JpaRepository

@Repository
public interface IUserDAO extends JpaRepository<UserEntity, Integer>
{
    //    @Query(value = "SELECT u FROM UserEntity u WHERE u.id=:id")
    @Query(value = "select * from users where id=?1", nativeQuery = true)
    public UserEntity findById(int id);

    @Query(value = "select * from users", nativeQuery = true)
    public List<UserEntity> findAll();

    @Query(value = "select * from users where username=?1 and password=?2", nativeQuery = true)
    public UserEntity findByUsernameAndPassword(String username, String password);

    @Query(value = "select * from users where username=?1", nativeQuery = true)
    public UserEntity findByUsername(String username);

    //增删改的sql语句,要使用@Modifying和@Transactional
    @Modifying
    @Transactional
    @Query(value = "delete from users where id=?1", nativeQuery = true)
    public void deleteById(int id);
}

Service

@Service
public class UserService
{
    @Autowired
    private IUserDAO _userDAO;

    public UserEntity GetUserById(int id)
    {
        return this._userDAO.findById(id);
    }

    public List<UserEntity> GetAllUser()
    {
        return this._userDAO.findAll();
    }

    public UserEntity GetUserByUsernameAndPassword(String username, String password)
    {
        return this._userDAO.findByUsernameAndPassword(username, password);
    }

    public UserEntity GetUserByUsername(String username)
    {
        return this._userDAO.findByUsername(username);
    }

    public void DeteleById(int id)
    {
        this._userDAO.deleteById(id);
    }

    //保存操作,用于增加和修改数据
    public void Save(UserEntity userEntity)
    {
        this._userDAO.save(userEntity);
    }

}

三个页面添加

添加到 Views/User目录下
Index.html 首页

<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <link href="http://localhost:8080/demo_war/css/MyStyleSheet.css" type="text/css"
          rel="stylesheet">
    <title>User Index</title>
</head>
<body>
<h1>This is User Index View</h1>
<form action="#" th:action="@{/UserController/Login/DoLogin}" th:object="${userEntity}" method="post">
    <label>用户名:
        <input type="text" th:field="*{username}"/>
    </label>
    <br>
    <label>密码:
        <input type="password" th:field="*{password}"/>
    </label>
    <br>
    <label style="color: red" th:text="${LoginMessage}" th:if="${not #strings.isEmpty(LoginMessage)}">

    </label>
    <br>
    <label>
        <button type="submit" name="btn" value="Login">登录</button>
    </label>
    <button type="submit" name="btn" value="Register">注册</button>
</form>
</body>
</html>

Register.html 注册页面

<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <link href="http://localhost:8080/demo_war/css/MyStyleSheet.css" type="text/css"
          rel="stylesheet">
    <title>Register Page</title>
</head>
<body>
<h1>This is Register Page</h1>
<form action="#" th:action="@{/UserController/Register/DoRegister}" method="post">
<label>用户名:
    <input type="text" name="username" th:value="${username}"/>
</label>
<br>
<label>密码:
    <input type="password" name="password" />
</label>
<br>
<label>重复密码:
    <input type="password" name="repeatPassword"/>
</label>
<br>
<label style="color: red" th:text="${RegisterMessage}" th:if="${not #strings.isEmpty(RegisterMessage)}">

</label>
<br>
<label>
    <input type="submit" value="注册"/>
</label>
</form>
</body>
</html>

Success.html 登录成功的页面

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <link href="http://localhost:8080/demo_war/css/MyStyleSheet.css" type="text/css"
          rel="stylesheet">
    <title>Success Page</title>
</head>
<body>
<h1>Login Success</h1>
</body>
</html>

控制器

这里的控制器,使用了两种获取表单数据的方式

@RestController
public class UserController
{
    @Autowired
    private UserService _userService;

    @RequestMapping("/User/")
    public ModelAndView Index(Model model)
    {
        ModelAndView mav = new ModelAndView();
        //初始化Index页面需要的变量
        model.addAttribute("userEntity", new UserEntity());
        model.addAttribute("LoginMessage", "");
        mav.setViewName("User/Index");
        return mav;
    }

    @RequestMapping(value = "/UserController/Login/DoLogin", method = RequestMethod.POST)
    public ModelAndView DoLogin(@ModelAttribute UserEntity userEntity, Model model, @RequestParam(name = "btn") String btn)
    {
        ModelAndView mav = new ModelAndView();
        //先确定点击的按钮
        if (true == btn.equals("Register"))
        {
            mav.setViewName("User/Register");
        }
        else
        {
            String username = userEntity.getUsername();
            String password = userEntity.getPassword();
            if (username.equals("") || password.equals(""))
            {
                model.addAttribute("LoginMessage", "用户名或密码不能为空");
                mav.setViewName("User/Index");
            }
            else
            {
                UserEntity user = this._userService.GetUserByUsernameAndPassword(username, password);
                if (user == null)
                {
                    model.addAttribute("LoginMessage", "用户名或密码错误");
                    mav.setViewName("User/Index");
                }
                else
                {
                    mav.setViewName("User/Success");
                }
            }
        }

        return mav;
    }

    //初始化注册页面
    @RequestMapping("/User/Register")
    public ModelAndView Register(Model model)
    {
        model.addAttribute("username", "");
        model.addAttribute("RegisterMessage", "");
        ModelAndView mav = new ModelAndView();
        mav.setViewName("User/Register");
        return mav;
    }

    //注册操作
    @RequestMapping(value = "/UserController/Register/DoRegister", method = RequestMethod.POST)
    public ModelAndView DoRegister(Model model, @RequestParam(name = "username") String username, @RequestParam(name = "password") String password, @RequestParam(name = "repeatPassword") String repeatPassword)
    {
        ModelAndView mav = new ModelAndView();
        if (username.equals("") || password.equals("") || repeatPassword.equals(""))
        {
            model.addAttribute("RegisterMessage", "用户名、密码或重复密码不能为空");
            mav.setViewName("User/Register");
        }
        else
        {
            if (null != this._userService.GetUserByUsername(username))
            {
                model.addAttribute("RegisterMessage", "用户已存在");
                mav.setViewName("User/Register");
            }
            else if (false == password.equals(repeatPassword))
            {
                model.addAttribute("RegisterMessage", "两次密码不一致");
                model.addAttribute("username", username);
                mav.setViewName("User/Register");
            }
            else
            {
                UserEntity user = new UserEntity();
                user.setUsername(username);
                user.setPassword(password);
                this._userService.Save(user);
                model.addAttribute("userEntity", new UserEntity());
                model.addAttribute("LoginMessage", "");
                mav.setViewName("User/Index");
            }
        }

        return mav;
    }
}

最终项目结构

Spring Boot + Hibernate 项目搭建和登录注册例子 结束

可以运行了,可能不太符合 Spring Boot 的编程规范,毕竟我更喜欢 ASP.NET 的规范

标签:username,Hibernate,return,mav,Spring,Boot,id,password,public
来源: https://www.cnblogs.com/zzy-tongzhi-cnblog/p/14402297.html