12月20, 2018

Spring Boot(六) JDBC操作数据库

Spring Boot JDBC操作数据库

前面几篇文章已经讲解了Spring Boot的一些基本概念和基本使用,接下来我们就要获得数据了,为了初学者掌握起来比较方便,这里就直接进入主题,不再讲述过多的原理了,首先还是创建工程,之前为了讲述spring Boot的一些原理使用的eclipse,那这里为了快速方便,直接使用Intellij IDEA开发工具

一.使用IntelliJ IDEA创建Spring Boot工程

IntelliJ IDEA其实还是通过https://start.spring.io直接创建一个工程,并直接导入到IDEA的项目环境中

1.选择初始化工程网站

-w844

2.工程的基础信息创建

-w844 3.选择POM.xml的包依赖 -w844 这里其实还需要加入其它的一些依赖,不过我们还是可以通过后面修改POM.xml文件直接进行添加

4.确定工程名称已经工程位置

-w844

这样一个在IntelliJ IDEA中一个基本的Spring Boot工程就创建好了.

二.创建数据库

要进行JDBC的测试,那肯定要现有数据库的一些内容了,在mysql中创建你自己的数据库和表,做一下简单的测试,我这里创建的数据库是crm,表名是t_user,你完全可以按照你的需要创建一个简单的数据库和表

DROP DATABASE IF EXISTS `crm`;

CREATE DATABASE `crm`;

use `crm`;

DROP TABLE IF EXISTS `t_user`;
CREATE TABLE `t_user` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `user_tel` varchar(11) COLLATE utf8mb4_unicode_ci NOT NULL,
  `username` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL,
  `password` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL,
  `registration_time` datetime DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB CHARSET=utf8;

INSERT INTO `t_user` VALUES ('1', '13880000001', '金庸', '0b4e7a0e5fe84ad35fb5f95b9ceeac79', '2018-12-15 06:54:16'), ('2', '13880000002', '张三丰', '875f26fdb1cecf20ceb4ca028263dec6', '2018-12-15 06:54:16'), ('3', '13880000003', '张无忌', 'c1f68ec06b490b3ecb4066b1b13a9ee9', '2018-12-15 06:54:16'), ('4', '13880000004', '黄蓉', '980ac217c6b51e7dc41040bec1edfec8', '2018-12-15 06:54:16'), ('5', '13880000005', '郭靖', 'cd87cd5ef753a06ee79fc75dc7cfe66c', '2018-12-15 06:54:16'), ('6', '13880000006', '周伯通', 'eed8cdc400dfd4ec85dff70a170066b7', '2018-12-15 06:54:16');

三.POM添加依赖

创建工程的时候,我们只是简单添加了之前对于Web和Thymeleaf的依赖,现在要连接数据库,所以,肯定需要添加对于数据库的相关依赖

POM.xml:

<!--数据库连接jdbc依赖-->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<!--mysql链接依赖-->
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
</dependency>
<!--阿里druid数据库连接池依赖-->
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>druid</artifactId>
    <version>1.0.5</version>
</dependency>

四.配置数据源信息

数据库的URL,用户名,密码这些肯定是要配置的,这些我们都可以再application.xml配置文件中完成配置,这里我使用的application.yml文件

spring:
  datasource:
    url: jdbc:mysql://127.0.0.1:3307/crm
    username: root
    password: 123456
    driver-class-name: com.mysql.jdbc.Driver
    type: com.alibaba.druid.pool.DruidDataSource
server:
  servlet-path: /
  port: 8081

注意,我这里的数据库由于直接使用的是Docker容器中的MySql数据库,所以端口映射出来后修改了一下端口号...如果不清楚Docker完全可以使用自己机器上的MySql数据库来做实验

五.工程基本架构

为了不至于练习太过于简单,这里还是搭建了基本的三层架构 -w299

六.在Dao层中使用JDBCTemplate

在Dao直接注入使用JDBCTemplate进行基本的CRUD操作

IUserDao.java

package com.yingside.demo.dao;

import com.yingside.demo.bean.User;

import java.util.List;

public interface IUserDao {
    public int add(String tel, String username, String password);
    public User get(int id);
    public List<User> list();
    public int delete(int id);
    public int update(User user);
}

UserDaoImpl.java

package com.yingside.demo.dao.impl;

import com.yingside.demo.bean.User;
import com.yingside.demo.dao.IUserDao;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.dao.DataAccessException;
import org.springframework.jdbc.core.*;
import org.springframework.stereotype.Repository;

import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.List;

@Repository
public class UserDaoImpl implements IUserDao {

    @Autowired
    JdbcTemplate jdbcTemplate;

    public int add(String tel, String username, String password) {
        return jdbcTemplate.update("INSERT INTO t_user(user_tel,username,password) VALUES (?,?,md5(?))",
                tel,username,password);
    }

    @Override
    public User get(int id) {
        String sql = "select * from t_user where id=?";
        return jdbcTemplate.query(sql, new PreparedStatementSetter() {
            @Override
            public void setValues(PreparedStatement preparedStatement) throws SQLException {
                preparedStatement.setInt(1,id);
            }
        }, new ResultSetExtractor<User>() {
            @Override
            public User extractData(ResultSet rs) throws SQLException, DataAccessException {
                User u = null;
                if(rs.next()){
                    u = new User();
                    u.setId(rs.getInt("id"));
                    u.setUserTel(rs.getString("user_tel"));
                    u.setUsername(rs.getString("username"));
                    u.setPassword(rs.getString("password"));
                    u.setRegistrationTime(rs.getString("registration_time"));

                }
                return u;
            }
        });
    }

    @Override
    public List<User> list() {
        String sql = "select * from t_user";
        BeanPropertyRowMapper<User> rowMapper = new BeanPropertyRowMapper<User>(User.class);
        return jdbcTemplate.query(sql,rowMapper);
    }

    @Override
    public int delete(int id) {
        String sql = "delete from t_user where id=?";
        return jdbcTemplate.update(sql,id);
    }

    @Override
    public int update(User user) {
        String sql = "update t_user set user_tel=?,username=?,password=md5(?) where id=?";
        int n = jdbcTemplate.update(sql,user.getUserTel(),user.getUsername(),user.getPassword(),user.getId());
        return n;
    }
}

这里只需要注意三点:

  1. Dao层需要使用@Repository进行声明
  2. 使用@Autowired注入JdbcTemplate对象
  3. JdbcTemplate基本的增删改查方法的使用

前两点都很简单,没有使用过JdbcTemplate的,查询一下相关文档就可以了,简单来说,常常会使用的就是几个方法update,query,queryForList,queryForObject,当然每个方法里面都有相当多的重载

我这里在使用查询的时候,用了2中比较典型的不同的方法

public <T> T query(String sql, PreparedStatementSetter pss, ResultSetExtractor<T> rse) throws DataAccessException

public <T> List<T> query(String sql, RowMapper<T> rowMapper) throws DataAccessException

第一种方法相当于需要创建两个内部类,在内部类中就可以直接使用PreparedStatementResultSet对象了,和写传统的JDBC其实没多少差别

第二种方式直接使用BeanPropertyRowMapper类,它是RowMapper的一个子类,简单来说,这个类会自动的把你写的javaBean和数据库中的字段做映射,相当的方便,当然方便的前提便是约定,约定是你的javaBean必须和数据库字段要一一对应,当然,涉及到多个单词的,他会自动的把驼峰规则转换为下划线

七.Service层

这里的业务非常简单,所以,Service层就不需要干什么事情了,仅仅是做一次数据的中转而已 IUserService.java

package com.yingside.demo.service;

import com.yingside.demo.bean.User;

import java.util.List;

public interface IUserService {
    public boolean addUser(String tel, String username, String password);
    public User getUserById(int id);
    public List<User> getAllUsers();
    public boolean updateUser(User user);
    public boolean deleteUser(int id);
}

UserServiceImpl.java

package com.yingside.demo.service.impl;

import com.yingside.demo.bean.User;
import com.yingside.demo.dao.IUserDao;
import com.yingside.demo.service.IUserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;

@Service
public class UserServiceImpl implements IUserService {

    @Autowired
    private IUserDao userDao;

    public boolean addUser(String tel, String username, String password) {
        return userDao.add(tel,username,password) >= 1 ? true : false;
    }

    @Override
    public User getUserById(int id) {
        return userDao.get(id);
    }

    @Override
    public List<User> getAllUsers() {
        return userDao.list();
    }

    @Override
    public boolean updateUser(User user) {
        return userDao.update(user) >= 1?true:false;
    }

    @Override
    public boolean deleteUser(int id) {
        return userDao.delete(id) >= 1? true : false;
    }
}

这里也需要注意两点:

  1. Service层需要使用@Service进行声明
  2. 使用@Autowired注解注入IUserDao对象

八.Controller

package com.yingside.demo.controller;

import com.yingside.demo.bean.User;
import com.yingside.demo.service.IUserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.List;

@RestController
public class UserController {

    @Autowired
    private IUserService userService;

    @PostMapping("/addUser")
    public String add(@RequestParam("tel")String tel,@RequestParam("username")String username, @RequestParam("password")String password){
        boolean flag = userService.addUser(tel,username,password);
        if(flag){
            return "成功!";
        }
        else{
            return "失败";
        }
    }

    @GetMapping("/getUser/{id}")
    public User getUser(@PathVariable("id") Integer id){
        return userService.getUserById(id);
    }

    @GetMapping("/allUser")
    public List<User> getAll(){
        return userService.getAllUsers();
    }

    @PutMapping("/update/{id}")
    public String update(@PathVariable("id")Integer id,@RequestParam("tel")String tel,String username,String password){
        User user = new User();
        user.setId(id);
        user.setUserTel(tel);
        user.setUsername(username);
        user.setPassword(password);
        boolean flag = userService.updateUser(user);
        if(flag){
            return "更新成功!";
        }else{
            return "更新失败!";
        }
    }

    @DeleteMapping("/delete/{id}")
    public String delete(@PathVariable("id")Integer id){
        boolean flag = userService.deleteUser(id);
        if(flag){
            return "删除成功!";
        }
        else{
            return "删除失败!";
        }
    }
}

在这一层,当然也需要注意下面的几个问题

  1. @RestController放在类上修饰,表示整个类都支持Restful方式
  2. 需要注入IUserService对象
  3. 需要对SpringMVC的相关注解有一定了解

写完这些之后,至少我们后台相关的都已经写完了,没有界面,可以先使用工具POSTMAN来进行测试 -w954 -w955

本文链接:http://www.yanhongzhi.com/post/springboot-JDBC.html

-- EOF --

Comments