SpringBoot实战(二):数据库Mysql

一,建立spring-boot-sample-mysql工程

1、http://start.spring.io/

     A、Artifact中输入spring-boot-sample-mysql

     B、勾选Web下的web

     C、勾选SQL下的JPA MYSQL

2、Eclips中导入工程spring-boot-sample-mysql

     A、解压快捷工程spring-boot-sample-mysql到某文件夹

     B、eclips中file->import->Import Existing Maven Projects-->Select Maven projects-->finish导入工程

3、导入工程。pom.xml内容参考上一篇文章《SpringBoot实战(一):HelloWorld》


4、引入LOG机制,在src/main/resources文件夹下新建logback.xml,配置为

[html]  view plain  copy
  1. <configuration>    
  2.     <!-- %m输出的信息,%p日志级别,%t线程名,%d日期,%c类的全名,,,, -->    
  3.     <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">    
  4.         <encoder>    
  5.             <pattern>%d %p (%file:%line\)- %m%n</pattern>  
  6.             <charset>GBK</charset>   
  7.         </encoder>    
  8.     </appender>    
  9.     <appender name="baselog"    
  10.         class="ch.qos.logback.core.rolling.RollingFileAppender">    
  11.         <File>log/base.log</File>    
  12.         <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">    
  13.             <fileNamePattern>log/base.log.%d.%i</fileNamePattern>    
  14.             <timeBasedFileNamingAndTriggeringPolicy  class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">    
  15.                 <!-- or whenever the file size reaches 64 MB -->    
  16.                 <maxFileSize>64 MB</maxFileSize>    
  17.             </timeBasedFileNamingAndTriggeringPolicy>    
  18.         </rollingPolicy>    
  19.         <encoder>    
  20.             <pattern>    
  21.                 %d %p (%file:%line\)- %m%n  
  22.             </pattern>    
  23.             <charset>UTF-8</charset> <!-- 此处设置字符集 -->   
  24.         </encoder>    
  25.     </appender>    
  26.     <root level="info">    
  27.         <appender-ref ref="STDOUT" />    
  28.     </root>    
  29.     <logger name="com.example" level="DEBUG">    
  30.         <appender-ref ref="baselog" />    
  31.     </logger>    
  32. </configuration>  

在工程所在的根目录找到log文件夹,进去,再打开base.log,入下图


注:文件夹和日志文件的名称,都是在配置文件logback.xml中设置的


5、启动工程,通过浏览器查看正确性

http://localhost:8080/

二,使用JPA,构建业务对象及访问库

1、在包com.enn下建立entity包,新建UserInfo类。 entity类存储物理班的信息。
package com.enn.entity;

import javax.validation.constraints.Max;
import javax.validation.constraints.Min;
import java.io.Serializable;

/**
 * 实体类,可用于Controller中直接接受参数
 */
public class UserInfo implements Serializable{

    private static final long serialVersionUID = 1L;

    private String tel;

    private String nickName;

    @Max(value = 999999,message = "超过最大数值")
    @Min(value = 000000,message = "密码设定不正确")
    private String passWord;

    public UserInfo() {
    }

    @Override
    public String toString() {
        return "UserInfo{" +
                "tel='" + tel + '\'' +
                ", nickName='" + nickName + '\'' +
                ", passWord='" + passWord + '\'' +
                '}';
    }

    public UserInfo(String tel, String nickName, String passWord) {
        this.tel = tel;
        this.nickName = nickName;
        this.passWord = passWord;
    }

    public String getTel() {
        return tel;
    }

    public void setTel(String tel) {
        this.tel = tel;
    }

    public String getNickName() {
        return nickName;
    }

    public void setNickName(String nickName) {
        this.nickName = nickName;
    }

    public String getPassWord() {
        return passWord;
    }

    public void setPassWord(String passWord) {
        this.passWord = passWord;
    }
}

2、在包com.enn下建立dao包,新建UserInfoMapper抽象类和UserInfoImpl实现类。dao层负责与数据库交互。

package com.enn.dao;

import com.enn.entity.UserInfo;

/**
 * dao层负责与数据库交互,创建一个抽象接口来定义我们对user的CRUD操作
 * Mapper接口
 */
public interface UserInfoMapper {

    void createUser(String tel,String pwd);

    UserInfo getUser(String id);
    String getUser();

    void updateUser(String user_id, String nickName);

    void deleteUserByUserId(String id);
}
package com.enn.dao;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.BeanPropertyRowMapper;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Repository;

import com.enn.entity.UserInfo;

import java.util.List;

/**
 * 实现类中直接通过@Autowired注解来加载JdbcTemplate,通过@Repository注解来让spring自动加载
 * JDBC连接数据库
 * 使用JdbcTemplate,需要自己完成SQL
 */
@Repository
public class UserInfoImpl implements UserInfoMapper {

    @Autowired
    private JdbcTemplate jdbcTemplate;

    @Override
    public void createUser(String tel,String pwd) {
        jdbcTemplate.update("INSERT INTO tp_user(tel,password,nickname,secret) VALUES (?,md5(?),?,'')",tel,pwd,tel);
    }

    @Override
    public UserInfo getUser(String id) {
        List<UserInfo> userList = jdbcTemplate.query("select tel,nickname,password FROM tp_user WHERE user_id = ?",new Object[]{id},new BeanPropertyRowMapper(UserInfo.class));
        if(userList != null && userList.size() > 0){
            UserInfo user = userList.get(0);
            return user;
        }else {
            return null;
        }
    }

    @Override
    public String getUser() {
        List<UserInfo> userList = jdbcTemplate.query("select tel,nickname,password FROM tp_user ",new Object[]{},new BeanPropertyRowMapper(UserInfo.class));
        if(userList != null && userList.size() > 0){
        	StringBuffer userInfo = new StringBuffer();
        	for(int i=0;i<userList.size()&&i<10;i++){
        		UserInfo user = userList.get(i);
        		userInfo.append(user).append("\n");
        	}
            return userInfo.toString();
        }else {
            return null;
        }
    }

    @Override
    public void updateUser(String user_id, String nickName) {
        jdbcTemplate.update("UPDATE tp_user SET nickname = ? WHERE user_id = ?",nickName,user_id);
    }

    @Override
    public void deleteUserByUserId(String id) {
        jdbcTemplate.update("DELETE FROM tp_user WHERE user_id = ?",id);
    }
}
3、 在包com.enn下建立service包,新建UserService类。service层进行业务逻辑处理。
package com.enn.service;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import com.enn.dao.UserInfoMapper;
import com.enn.entity.UserInfo;

/**
 * 将参数传入service层进行业务逻辑处理
 */
@Service
public class UserService {

    @Autowired
    UserInfoMapper userInfoMapper;

    public void createUser(String tel,String pwd) {
        userInfoMapper.createUser(tel,pwd);
    }

    public UserInfo getUser(String id) {
        return userInfoMapper.getUser(id);
    }
    public String getUser() {
        return userInfoMapper.getUser();
    }
    
    public void updateUser(String user_id, String nickName) {
        userInfoMapper.updateUser(user_id,nickName);
    }

    public void deleteUserByUserId(String id) {
        userInfoMapper.deleteUserByUserId(id);
    }
}

4、在包com.enn下建立controller包,新建UserController类。controller类来获取前端传来的参数信息

package com.enn.controller;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import com.enn.entity.UserInfo;
import com.enn.service.UserService;

/**
 * Usercontroller类来获取前端传来的参数信息
 */
@RequestMapping("/user")
@RestController
public class UserController {

    @Autowired
    private UserService userService;
    
    @RequestMapping("/save")
    public String save(String tel, String pwd){
    	userService.createUser(tel,pwd);
    	return userService.getUser();
    }
    @RequestMapping("/update")
    public UserInfo update(String id, String nickName){
    	userService.updateUser(id,nickName);
    	return userService.getUser(id);
    }
    @RequestMapping("/select")
    public UserInfo select(String id){
    	return userService.getUser(id);
    }
    @RequestMapping("/delete")
    public String delete(String id){
    	userService.deleteUserByUserId(id);
    	return("delete id="+id+" success!");
    }
    @RequestMapping("/selectall")
    public String select(){
    	return userService.getUser();
    }
}

以上4层就是springboot调用方法的基本步骤了。首先启动SpringApplication, controller类来获取前端传来的参数信息,这部分我们之前已经说过,这里不再赘述。然后将参数传入service层进行业务逻辑处理,之后由dao层负责与数据库交互。是的,这套路就是我们平时在是集开发工作中会用到的。
5、配置数据库连接,在application.properties(src/main/resources下)

spring.datasource.url=jdbc:mysql://192.168.56.201:3306/bootsample?useUnicode=true&characterEncoding=UTF-8
spring.datasource.username=root
spring.datasource.password=123456
spring.datasource.driver-class-name=com.mysql.jdbc.Driver

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

6、运行测试

A、先保存数据

http://localhost:8080/save?id=aa&&address=北京
http://localhost:8080/save?name=ab&&address=北京&&age=2
http://localhost:8080/save?name=cq1&&address=重庆&&age=50
http://localhost:8080/save?name=cq2&&address=重庆&&age=51

B、查询q1

http://localhost:8080/select?address=北京

C、查询q2

http://localhost:8080/q2?address=北京&&name=aa

D、查询q3

http://localhost:8080/q3?address=北京&&name=aa

E、排序

http://localhost:8080/sort

F、分页

http://localhost:8080/page


运用hibernate访问mysql,基本也是老技术,只是用JPA简化了dao层代码,对于业务对象基本没有变化。

三,常见错误

1、expected at least 1 bean which qualifies as autowire candidate for this dependency.

我报错是因为pom.xml引用不对造成的,通过官网下载示例构建的工程,报错消失。


2、Verify the connector's configuration, identify and stop any process that's listening on port 8080, or configure this application to listen on another port.

由于8080端口被占用造成的报错。

1)在windows命令行窗口下执行:运行--cmd
C:\>netstat -aon|findstr "8080" 
TCP     127.0.0.1:80       0.0.0.0:0             LISTENING    2448
2)端口被进程号为2448的进程占用,继续执行下面命令:
C:\>tasklist|findstr "2448" 
javaw.exe                   2016 Console                 0     16,064 K
很清楚,javaw占用了你的端口,Kill it
3)命令:taskkill -F -PID 2448
如果第二步查不到,那就开任务管理器,进程---查看---选择列---pid(进程位标识符)打个勾就可以了
看哪个进程是2448,然后杀之即可。


3、1063 Incorrect column specifier for column 'id'

插入数据要求自增序列,修改mysql中的表即可。

课程的实战源码是我在 GitHub 上开源项目 spring-boot-projects 中的其中一个项目代码,目前已有 2300 多个 star,项目截图如下: 由于项目比较受大家欢迎,因此心中就出现了将它做成教学视频的想法,也就是你现在了解的这个课程《SpringBoot入门及前后端分离项目开发》,本课程是一个 Spring Boot 技术栈的实战类课程,课程共分为 3 大部分,前面两个部分为基础环境准备和相关概念介绍,第三个部分是 Spring Boot 项目实践开发。Spring Boot 介绍、前后端分离、API 规范等内容旨在让读者更加熟悉 SpringBoot 及企业开发中需要注意的事项并具有使用 SpringBoot 技术进行基本功能开发的能力;这最后的项目实战为课程的主要部分,我会带着大家实际的开发一个前后端分离的 Spring Boot 实践项目,让大家实际操作并从无到有开发一个线上项目,并学习到一定的开发经验以及其中的开发技巧,旨在让读者具有将 Spring Boot 真正应用于项目开发的能力; 以下为实践项目的页面和功能展示,分别为:登录页面 列表页面(分页功能) 图片上传功能 富文本编辑器整合使用 实践项目的主要功能和页面就是这些,通过项目展示大家也能够感受到,在实际应用开发中的高频次功能都已经实现,稍加修改就可以运用到企业开发中,整个项目的开发模式为前后端分离的模式,即 Spring Boot 提供后端接口,前端页面通过 Ajax 异步调用接口的方式与后端服务器进行交互并将数据填充至页面中,这也是目前企业开发中比较重用的开发模式,希望大家能够了解并且能够实际的上手开发。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值