一,建立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,配置爲
-
<configuration>
-
-
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
-
<encoder>
-
<pattern>%d %p (%file:%line\)- %m%n</pattern>
-
<charset>GBK</charset>
-
</encoder>
-
</appender>
-
<appender name="baselog"
-
class="ch.qos.logback.core.rolling.RollingFileAppender">
-
<File>log/base.log</File>
-
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
-
<fileNamePattern>log/base.log.%d.%i</fileNamePattern>
-
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
-
-
<maxFileSize>64 MB</maxFileSize>
-
</timeBasedFileNamingAndTriggeringPolicy>
-
</rollingPolicy>
-
<encoder>
-
<pattern>
-
%d %p (%file:%line\)- %m%n
-
</pattern>
-
<charset>UTF-8</charset>
-
</encoder>
-
</appender>
-
<root level="info">
-
<appender-ref ref="STDOUT" />
-
</root>
-
<logger name="com.example" level="DEBUG">
-
<appender-ref ref="baselog" />
-
</logger>
-
</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中的表即可。