SpringBoot实战(二):数据库Mysql

本文介绍如何使用Spring Boot搭建MySQL数据库应用,包括工程创建、日志配置、实体类定义、DAO层实现、Service层处理及Controller层交互等内容,并提供常见错误解决办法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一,建立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中的表即可。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值