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中的表即可。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章