spring boot + jpa + thymeleaf 增删改查示例

spring boot + jpa + thymeleaf 增删改查示例

配置文件

pom包配置

pom包里面添加jpa和thymeleaf的相关包引用

<!-- Web 依赖 -->
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-web</artifactId>
		</dependency>

		<!-- 单元测试依赖 -->
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-test</artifactId>
			<scope>test</scope>
		</dependency>

		<!-- Spring Data JPA 依赖 :: 数据持久层框架 -->
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-data-jpa</artifactId>
		</dependency>

		<!--  数据库连接驱动 -->
		<dependency>
			<groupId>mysql</groupId>
			<artifactId>mysql-connector-java</artifactId>
		</dependency>

		<!-- 模板引擎 Thymeleaf 依赖 -->
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-thymeleaf</artifactId>
		</dependency>

在application.properties中添加配置

spring.datasource.url=jdbc:mysql://127.0.0.1/test?useUnicode=true&characterEncoding=utf-8&serverTimezone=UTC&useSSL=true
spring.datasource.username=root
spring.datasource.password=root
spring.datasource.driver-class-name=com.mysql.jdbc.Driver

spring.jpa.hibernate.ddl-auto=update
spring.jpa.show-sql= true

spring.thymeleaf.cache=false

其中propertiesspring.thymeleaf.cache=false是关闭thymeleaf的缓存,不然在开发过程中修改页面不会立刻生效需要重启,生产可配置为true。

在项目resources目录下会有两个文件夹:static目录用于放置网站的静态内容如css、js、图片;templates目录用于放置项目使用的页面模板。

启动类

@SpringBootApplication
public class SpringbootbookApplication {

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

数据库层代码

实体类映射数据库表

@Entity
public class User  implements Serializable{



    /**
     *  编号
     */
    @Id
    @GeneratedValue
    private long id;

    /**
     * 名称
     */
    private String name;


    /**
     * 邮箱
     */
    private  String email;



    /**
     * 密码
     */
    private  String password;


    /**
     * 手机号码
     */
    private Long phone;


    public long getId() {
        return id;
    }

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

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public String getPassword() {
        return password;
    }

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

    public Long getPhone() {
        return phone;
    }

    public void setPhone(Long phone) {
        this.phone = phone;
    }

    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", email='" + email + '\'' +
                ", password='" + password + '\'' +
                ", phone=" + phone +
                '}';
    }
}

继承JpaRepository类会自动实现很多内置的方法,包括增删改查。也可以根据方法名来自动生成相关sql

/**
 *  用户持久层接口
 */
public interface UserRepository extends JpaRepository<User,Long> {
}

业务层处理

service调用jpa实现相关的增删改查,实际项目中service层处理具体的业务代码。

@Service
public class UserServiceImpl implements UserService {

    private static final Logger LOGGER = LoggerFactory.getLogger(UserServiceImpl.class);


    @Autowired
    UserRepository userRepository ;

    /**
     * 查询全部用户
     * @return
     */
    @Override
    public List<User> findAll(){

        return userRepository.findAll();
    }

    /**
     * 新增用户
     * @param user
     * @return
     */
    @Override
    public User insertByUser(User user){
       LOGGER.info("新增用户:" +user.toString());
       return userRepository.save(user);
    }

    /**
     * 更新用户
     * @param user
     * @return
     */
    @Override
    public User update(User user){
        LOGGER.info("更新用户:  " + user.toString());
        return userRepository.save(user);
    }

    /***
     * 删除 用户
     * @param id
     * @return
     */
    @Override
    public User delete(Long id) {
        User user = userRepository.findOne(id);
        userRepository.delete(user);

        LOGGER.info("删除用户:" + user.toString());
        return user;
    }

    /**
     * 获取用户 ID 查询
     * @param id
     * @return
     */
    @Override
    public User findOne(Long id) {
        LOGGER.info("获取用户 ID :" + id);
        return userRepository.findOne(id);
    }

}

Controller负责接收请求,处理完后将页面内容返回给前端。

/**
 *
 * 用户控制层
 *
 */
@Controller
@RequestMapping(value = "users")    // 通过这里配置使下面的映射都在 /users
public class UserController {

    @Autowired
    UserService userService;   // 用户服务层


    /**
     *  获取用户列表
     *    处理 "/users" 的 GET 请求,用来获取用户列表
     *    通过 @RequestParam 传递参数,进一步实现条件查询或者分页查询
     */
    @RequestMapping(method = RequestMethod.GET)
    public String getUserList(ModelMap map){
        map.addAttribute("userList",userService.findAll());
        return "userList";

    }
    /**
     * 显示创建用户表单
     *
     */
    @RequestMapping(value = "/create", method = RequestMethod.GET)
    public String createUserForm(ModelMap map) {
        map.addAttribute("user", new User());
        map.addAttribute("action", "create");
        return "userForm";
    }

    /**
     *  创建用户
     *    处理 "/users" 的 POST 请求,用来获取用户列表
     *    通过 @ModelAttribute 绑定参数,也通过 @RequestParam 从页面中传递参数
     */
    @RequestMapping(value = "/create", method = RequestMethod.POST)
    public String postUser(@ModelAttribute User user) {
        userService.insertByUser(user);
        return "redirect:/users/";
    }

    /**
     * 显示需要更新用户表单
     *    处理 "/users/{id}" 的 GET 请求,通过 URL 中的 id 值获取 User 信息
     *    URL 中的 id ,通过 @PathVariable 绑定参数
     */
    @RequestMapping(value = "/update/{id}", method = RequestMethod.GET)
    public String getUser(@PathVariable Long id, ModelMap map) {
        map.addAttribute("user", userService.findOne(id));
        map.addAttribute("action", "update");
        return "userForm";
    }
    /**
     * 显示需要更新用户表单
     *    处理 "/users/{id}" 的 GET 请求,通过 URL 中的 id 值获取 User 信息
     *    URL 中的 id ,通过 @PathVariable 绑定参数
     */
    @RequestMapping(value = "/show/{id}", method = RequestMethod.GET)
    public String getShow(@PathVariable Long id, ModelMap map) {
        map.addAttribute("user", userService.findOne(id));
        map.addAttribute("action", "update");
        return "show";
    }

    /**
     * 处理 "/users/{id}" 的 PUT 请求,用来更新 User 信息
     *
     */
    @RequestMapping(value = "/update", method = RequestMethod.POST)
    public String putUser(@ModelAttribute User user) {
        userService.update(user);
        return "redirect:/users/";
    }

    /**
     * 处理 "/users/{id}" 的 GET 请求,用来删除 User 信息
     */
    @RequestMapping(value = "/delete/{id}", method = RequestMethod.GET)
    public String deleteUser(@PathVariable Long id) {
        userService.delete(id);
        return "redirect:/users/";
    }

}
  • return "userForm"; 代表会直接去resources目录下找相关的文件。
  • return "redirect:/users/"; 代表转发到对应的controller,这个示例就相当于删除内容之后自动调整到users请求,然后再输出到页面。

页面内容

userList

<!DOCTYPE html>
<html lang="zh-CN">
    <head>
        <script type="text/javascript" th:src="@{https://cdn.bootcss.com/jquery/3.2.1/jquery.min.js}"></script>
        <link th:href="@{https://cdn.bootcss.com/bootstrap/3.3.7/css/bootstrap.min.css}" rel="stylesheet"/>
        <link th:href="@{/css/default.css}" rel="stylesheet"/>
        <link rel="icon" th:href="@{/images/favicon.ico}" type="image/x-icon"/>
        <meta charset="UTF-8"/>
        <title>用户列表</title>
    </head>

    <body>
        <div class="container">
        <div class="contentDiv">


            <table class="table table-hover table-condensed">
                <legend>
                    <strong>用户列表</strong>
                </legend>
                <thead>
                    <tr>
                        <th>用户编号</th>
                        <th>名称</th>
                        <th>管理</th>
                    </tr>
                </thead>
                <tbody>
                    <tr th:each="user : ${userList}">
                        <th scope="row" th:text="${user.id}"></th>
                        <td><a th:href="@{/users/show/{userId}(userId=${user.id})}" th:text="${user.name}"></a></td>
                        <td><a class="btn btn-danger" th:href="@{/users/update/{userId}(userId=${user.id})}">编辑</a></td>
                        <td><a class="btn btn-danger" th:href="@{/users/delete/{userId}(userId=${user.id})}">删除</a></td>
                    </tr>
                </tbody>
        L    </table>

            <div><a class="btn btn-primary" href="/users/create" role="button">创建用户</a></div>
        </div>
        </div>
    </body>
</html>

 

效果图:

<tr th:each="user : ${users}"> 这里会从controler层model set的对象去获取相关的内容,th:each表示会循环遍历对象内容。

github 

转载于:https://my.oschina.net/bilzat/blog/1559177

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值