这里关于MySQL的安装等配置就不再多说了,网上很多相关资料,或者后续我自己也会出一些博客介绍。
所以这里我们直接开整!
根据前面的构想,我们需要登录,需要发布文章,有评论,那我们的表结构就显而易见了。
判断是否为admin用户采用了一个单独的字段 is_admin,1表示是admin,其他则不是。
gmt_create表示创建的时间,gmt_modified表示修改的时间,gmt意思是格林尼治时间。
这样我们就有了两张表了,接下来进行项目的搭建!
IDE: Intellj IDEA 2019.2
Java版本: jdk1.8
系统:目前开发环境为widows10,部署服务器上时会放到linux
总之,最后的pom文件如下
4.0.0
org.springframework.boot
spring-boot-starter-parent
2.1.7.RELEASE
com.dionysun
mblog
0.0.1-SNAPSHOT
mblog
My Blog
1.8
org.springframework.boot
spring-boot-starter-data-jpa
org.springframework.boot
spring-boot-starter-thymeleaf
org.springframework.boot
spring-boot-starter-web
mysql
mysql-connector-java
runtime
org.springframework.boot
spring-boot-starter-test
test
org.springframework.boot
spring-boot-maven-plugin
这样我们就开始编写代码。
再进行数据操作之前我们需要先配置数据源
在resource目录下修改application.properities文件
spring.datasource.url=jdbc:mysql://localhost:3306/db_sunblog?serverTimeZone=GMT%2B8 spring.datasource.password=123456 spring.datasource.username=root spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver spring.jpa.database=mysql spring.jpa.generate-ddl=true
注意url后面一定加上时区,不然启动时会报错
参照官方指南https://spring.io/guides/gs/accessing-data-jpa/
我们知道首先要有一个与数据库的表对应的实体类,我们先创建实体类
在项目中创建entity包,在创建User类
package com.dionysun.mblog.entity;
import javax.persistence.*;
import java.sql.Timestamp;
import java.util.Date;
@Entity
@Table(name = "user")
public class User {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Integer id;
private String gender;
private String name;
private String password;
private Date birthday;
private String motto;
private String isAdmin;
private Timestamp gmtCreate;
private Timestamp gmtModified;
@Override
public String toString() {
return "User{" +
"id=" + id +
", gender='" + gender + '\'' +
", name='" + name + '\'' +
", password='" + password + '\'' +
", birthday=" + birthday +
", motto='" + motto + '\'' +
", isAdmin='" + isAdmin + '\'' +
", gmtCreate=" + gmtCreate +
", gmtModified=" + gmtModified +
'}';
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getGender() {
return gender;
}
public void setGender(String gender) {
this.gender = gender;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public Date getBirthday() {
return birthday;
}
public void setBirthday(Date birthday) {
this.birthday = birthday;
}
public String getMotto() {
return motto;
}
public void setMotto(String motto) {
this.motto = motto;
}
public String getIsAdmin() {
return isAdmin;
}
public void setIsAdmin(String isAdmin) {
this.isAdmin = isAdmin;
}
public Timestamp getGmtCreate() {
return gmtCreate;
}
public void setGmtCreate(Timestamp gmtCreate) {
this.gmtCreate = gmtCreate;
}
public Timestamp getGmtModified() {
return gmtModified;
}
public void setGmtModified(Timestamp gmtModified) {
this.gmtModified = gmtModified;
}
}
接下来的实体类是文章,类似将数据库表中的字段对应为相应的属性名即可,注意下划线命名转化为驼峰式。
使用alt+insert 生成getter setter方法。
接着新建dao包,编写UserDao和ArticleDao
package com.dionysun.mblog.dao;
import com.dionysun.mblog.entity.User;
import org.springframework.data.repository.CrudRepository;
public interface UserDao extends CrudRepository {
}
package com.dionysun.mblog.dao;
import org.springframework.data.repository.CrudRepository;
public interface ArticleDao extends CrudRepository {
}
我们只需要将这两个接口继承CrudRepositoy传入泛型参数即可,springboot自动帮我们实现该接口,帮我们完成简单的CRUD操作,是不是很方便?
接着我们测试一下是否可以工作
新建一个测试类
在类上加入注解
@RunWith(SpringRunner.class) @SpringBootTest
我们可以在测试类中进行Dao的注入。
@Autowired private UserDao userDao;
编写测试方法
package com.dionysun.mblog;
import com.dionysun.mblog.dao.UserDao;
import com.dionysun.mblog.entity.User;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
@RunWith(SpringRunner.class)
@SpringBootTest
public class DaoTest {
@Autowired
private UserDao userDao;
@Test
public void userDaoTest(){
User user = new User();
user.setName("tom");
user.setGender("男");
user.setIsAdmin("1"); // notnull
userDao.save(user);
}
}
运行测试,需要注意,表中的字段如果为 not null ,User对象必须设值,否则会出sql异常。// 自己设计的表把自己给坑了。。。
查看数据库,发现果然多了一条数据,证明添加数据成功。
记得把is_admin的not null约束去掉,因为判断是否为admin只需判断该字段有值且值为1.如果不是admin则没必要设置值。
接下来我们对dao层进行完善,因为jpa默认的crud中查询操作只能通过id来查询,我们希望通过name来查,那该怎么做呢?
也很简单,只需要在UserDao接口中声明一个方法,jpa会识别findBy...()方法自动实现,还可以有更复杂的findBy....And....()等操作,不过这里我们暂时只需要findByName()
在UserDao中声明方法
User finByName(String name);
即可,注意数据库表中的name字段必须加上unique的约束,不然返回的结果可能会有多个,显然会出异常。
下一步将进行登录的验证,包括cookies验证,考虑多加一张表专门保存token,顺便把登陆注册的界面搭起来。
to be continued->