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