今日特使用此结构进行demo开发
一、目录结构:
二、实现代码
1、首先创建dean:
import lombok.Data;
import org.springframework.stereotype.Component;
import javax.persistence.*;
import java.io.Serializable;
/**
* @program: springbootdemo
* @description:demo版本练习boot+hibernate的练习,这个是一个【实体类】
* @author: Feng_Lei
* @create: 2020-04-15 23:14
**/
//这个是为了lombok的注解实现getter、setter
@Data
//这个注解代表这个时一个对应数据库的实体类
@Entity
//这个注解映射数据库的表名称
@Table(name="WebData")
//将此实体类交予spring管理
@Component
public class WebData implements Serializable {
// @EmbeddedId 是一个嵌入式主键的注解,表示结合内部类等生成主键
//数据库的id属性
@Id
private Integer id;
@Column
private String userName ;
@Column
private String password ;
@Column
private String createTime ;
@Column
private String remarks ;
}
3、JPA的编写:
import com.uflinux.demo.bean.WebData;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Modifying;
import org.springframework.data.jpa.repository.Query;
import javax.persistence.Id;
import javax.transaction.Transactional;
import java.util.List;
/**
* @Description: 这个是WebData的jpa接口,继承于hibernate
* @Param:
* @return:
* @Author: Mr.Feng
* @Date: 2020/4/16
*/
public interface WebDataRepository extends JpaRepository<WebData, Id> {
//通过名字找到所有
List<WebData> findAllByUserName(String name );
//通过id得到一个用户
WebData findById(Integer id);
//查询到数据库中所有的对象
@Override
List<WebData> findAll();
//通过名字找到所有
WebData findTopByUserName(String name );
//查询ID最大一条数据
WebData findTopByOrderByIdDesc();
//查询ID最小一条数据
WebData findTopByOrderById();
//查询倒叙的前10条数据
List<WebData>findTop10ByOrderById();
/*
1、请注意以下的3个注解,第一个未知意思,但是不添加的话无法修改数据库的数据
2、第二个是jpa的update时需要使用
3、第3个,代表修改数据时使用,
*/
@Transactional//若缺少此注解可能不能提交到数据库
@Modifying // 声明这个是update类型语句
@Query(value = "update WebData set remarks=?3 where userName=?2 and id=?1 ", nativeQuery = true)
void saveOne(Integer id , String userName ,String remarks );
/*
插入数据
目前这个方法没有写,到了dao 层时采用的是原装的
*/
}
4、创建dao
import com.uflinux.demo.bean.WebData;
import java.util.List;
public interface WebDataDao {
//通过用户名得到对象的集合
List<WebData> findAllByUserName(String name );
//根据用户名得到一个账户
WebData findOneByUserName(String name);
//通过id得到一个用户
WebData findById(Integer id);
//查询到所有的用户
List<WebData> findAll();
//得到第一个用户desc
WebData findFirst();
//得到第一个用户 asc
WebData findFirstAsc();
//得到前十条的
List<WebData> findTOP10();
//根据3个参数进行update
void saveRemarkes(Integer id , String userName , String remarks);
//为了insert
void saveObject(WebData webData);
}
5、创建dao的实现类:
import com.uflinux.demo.bean.WebData;
import com.uflinux.demo.dao.jpa.WebDataRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.util.List;
/**
* @program: springbootdemo
* @description: JPA-dao的实现类,注入jpa对象,实现dao接口并重写方法
* @author: Feng_Lei
* @create: 2020-04-16 12:51
**/
//@Repository
@Component
public class WebDataDaoImplJPA implements WebDataDao{
//注入hrebriate的尸体对象
@Autowired
private WebDataRepository webDataRepository;
@Override
public List<WebData> findAllByUserName(String name) {
return webDataRepository.findAllByUserName(name);
}
@Override
public WebData findOneByUserName(String name) {
return webDataRepository.findTopByUserName(name);
}
@Override
public WebData findById(Integer id) {
return webDataRepository.findById(id);
}
@Override
public List<WebData> findAll() {
return webDataRepository.findAll();
}
@Override
public WebData findFirst() {
return webDataRepository.findTopByOrderByIdDesc();
}
@Override
public WebData findFirstAsc() {
return webDataRepository.findTopByOrderById();
}
@Override
public List<WebData> findTOP10() {
return webDataRepository.findTop10ByOrderById();
}
@Override
public void saveRemarkes(Integer id, String userName, String remarks) {
webDataRepository.saveOne(id,userName,remarks);
}
@Override
public void saveObject(WebData webData) {
webDataRepository.save(webData);
}
}
6、创建service
import java.util.List;
public interface WebDataService {
WebData getUnUserdAccount(String name) ;
void updateRemarksByWebData(WebData webData);
List<WebData> findAll();
WebData getUserById(Integer id);
WebData getFirst();
WebData getFirstAsc();
List<WebData>getTop10();
}
7、service的实现类
import com.uflinux.demo.bean.WebData;
import com.uflinux.demo.dao.WebDataDao;
import com.uflinux.demo.service.WebDataService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.util.List;
import static java.lang.Boolean.FALSE;
/**
* @program: springbootdemo
* @description: WebDataService的实现类,将重写接口的
* @author: Feng_Lei
* @create: 2020-04-15 23:17
**/
@Service
public class WebDataServiceImpl implements WebDataService {
private static final Boolean AA = FALSE;
@Resource
private WebDataDao webDataDao ;
@Override
public WebData getUnUserdAccount(String name) {
return webDataDao.findOneByUserName(name);
}
@Override
public void updateRemarksByWebData(WebData webData) {
// return AA;
}
@Override
public List<WebData> findAll() {
return webDataDao.findAll();
}
//通过id得到一个用户的信息
@Override
public WebData getUserById(Integer id) {
return webDataDao.findById(id);
}
@Override
public WebData getFirst() {
return webDataDao.findFirst();
}
@Override
public WebData getFirstAsc() {
return webDataDao.findFirstAsc();
}
@Override
public List<WebData> getTop10() {
return webDataDao.findTOP10();
}
}
8、controller(略)根据自己需求编写
9、junit-springboot测试类
@RunWith(SpringRunner.class)
@SpringBootTest
public class DemoApplicationTests {
private Logger logger = LoggerFactory.getLogger(DemoApplicationTests.class);
@Resource
private WebDataDao webDataDao;//注入dao
@Resource
private WebDataService webDataService;//注入service
@Test//默认的测试1
public void contextLoads() {
System.out.println("asdasdasd");
}
/**
* @Description: findAllUser这个方法主要是为了测试dao层的联通性
* @Param: []
* @return: void
* @Author: Mr.Feng
* @Date: 2020/4/17
*/
@Test
public void findAllUser() {
logger.info("查询到的数据=", webDataDao.findById(1));
System.out.println("----------------------------------------");
System.out.println("----------------------------------------");
System.out.println(webDataDao.findById(1));
System.out.println("----------------------------------------");
System.out.println("----------------------------------------");
}
//测试service层的到曾的而联通性
@Test
public void GetServcieDataSource() {
System.out.println("----------------------------------------");
System.out.println("----------------------------------------");
System.out.println(webDataService.getUserById(2));
System.out.println("----------------------------------------");
System.out.println("----------------------------------------");
}
@Test//测试得到的是一个集合,然后进行拆分得到对象若干
public void GetServcieDataAll() {
System.out.println("----------------------------------------");
//List<WebData> list1 = webDataService.findAll();//查序所有数据集合
List<WebData> list1 = webDataService.getTop10();//查询前10条数据
System.out.println(list1);
for (WebData map1 : list1) {
Integer id = map1.getId();
String userName = map1.getUserName();
String password = map1.getPassword();
String createTime = map1.getCreateTime();
String remarks = map1.getRemarks();
System.out.println(id);
System.out.println(userName);
System.out.println(password);
System.out.println(createTime);
System.out.println(remarks);
}
}
@Test
public void getFirst() {
WebData map1 = webDataDao.findFirstAsc();// webDataDao.findFirst();
String userName = map1.getUserName();
String password = map1.getPassword();
String createTime = map1.getCreateTime();
String remarks = map1.getRemarks();
System.out.println("用户名:" + userName);
System.out.println("密码:" + password);
System.out.println("创建时间:" + createTime);
System.out.println("备注:" + remarks);
}
//这个是测试修改方法的
@Autowired
WebData webData;
@Test
public void saveRemars() {
webData = webDataDao.findById(2);
if (webData != null) {
System.out.println(webData);
Integer id = webData.getId();
System.out.println(id);
String remarks = "台湾岛";
String userName = "李四";
webDataDao.saveRemarkes(id, userName, remarks);
} else {
System.out.println("WebData这个对象是空的");
}
System.out.println( webDataDao.findById(2));
}
//这个测试的是利用自带jpa制造insert
@Test
public void saveObject(){
webData.setId(15);
webData.setUserName("风斯托洛夫斯基");
webData.setPassword("13800138000");
webDataDao.saveObject(webData);
}
}
10、application.yml 配置文件
spring:
mvc:
static-path-pattern: /static/**
view:
suffix: .ftl
#prefix: /
freemarker:
thymeleaf:
cache: false
settings:
template_update_delay: 0
#template-loader-path:classpath: templates
charset: UTF-8
check-template-location: true
content-type: text/html
expose-request-attributes: true
expose-session-attributes: true
request-context-attribute: request
suffix: .ftl
datasource:
# MySQL
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql://127.0.0.1:3306/databaseName?useSSL=false
username: root
password: root
type: com.alibaba.druid.pool.DruidDataSource
initialSize: 50
minIdle: 10
maxActive: 300
maxWait: 60000
timeBetweenEvictionRunsMillis: 60000
minEvictableIdleTimeMillis: 300000
validationQuery: SELECT 1
testWhileIdle: true
testOnBorrow: false
testOnReturn: false
poolPreparedStatements: true
maxPoolPreparedStatementPerConnectionSize: 20
filters: stat,wall,log4j
connectionProperties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000
jpa:
database: mysql
show-sql: true
hibernate:
naming:
physical-strategy: org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl
properties:
hibernate:
dialect: org.hibernate.dialect.MySQL5Dialect
devtools:
restart:
additional-paths: src/main/java
enabled: true
exclude: test/**
11、pom.xml
<!--Springbootde parent 依赖-->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<!-- <version>2.2.6.RELEASE</version> -->
<version>2.0.5.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.uflinux</groupId>
<artifactId>demo</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>demo</name>
<description>Demo project for Spring Boot</description>
<!--jdk 1.8-->
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<!--单元测试 -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
<!--MySQL驱动 -->
<dependency>
<groupId>MySQL</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.6</version>
</dependency>
<!--线程池驱动 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.10</version>
</dependency>
<!-- 服务于@ConfigurationProperties注解的-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<version>2.0.5.RELEASE</version>
<optional>true</optional>
</dependency>
<!--Freemarker-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-freemarker</artifactId>
</dependency>
<!--lombok插件-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.16.20</version>
</dependency>
<!--添加热部署-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<optional>true</optional>
<scope>true</scope>
</dependency>
<!--视图引擎-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
<!--前台视图插件 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- SpringBootText注解依赖 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<!-- hibernate注解-->
<!-- https://mvnrepository.com/artifact/org.springframework.data/spring-data-jpa -->
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-jpa</artifactId>
<version>2.0.10.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<!--热部署配置与上面的devtools一起存在,并最后在idea进行配置即可-->
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<!--fork:如果没有该项配置,整个devtools不会起作用-->
<fork>true</fork>
</configuration>
</plugin>
<!--<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>-->
</plugins>
</build>
</project>
三、总结及问题汇总
1、yml配置文件需要注意yml文件格式
(
1、注意MySQL驱动,在导入包错误或者没有此包时,会标红;
2、注意层级缩进关系
)
2、注意maven仓库地址配置是否正确,尽量要避免造成脱机查询,而无法正常导入包依赖或者导入的zip时有错误的
3、注解
注解 | 分析 |
---|---|
1、实体类 | |
@data | 这个是lombok的体现,使用后免去编写get/set 方法,也比较号内存 |
@Entity | 映射数据库的实体类 |
@Table | 也是告诉数据库这个是实体类 |
@Component | spring的一版注解,若bean五此可能造成无法注入 |
@Id | 主键字段 |
@Column | 在bean的属性字段添加,当作数据库的额类 |
2、dao层 | |
dao的接口 | 不需要注解 |
dao的实现类 | @Component于类,重写接口方法,注入jpa对象 |
@Repository | @Repository用于标注数据访问组件,即DAO组件 |
@Autowired /@Resource | 自动注入对象,若实体类无@Component注解,可能会导致注入失败【例如:Could not autowire. No beans of ‘xxxx’ type found的错误提示】 |
3、Service层 | |
service接口 | 不需要注解,编写因为实现方法即可 |
serviceImpl实现类 | @Service注解于类,代表是service层 |
属性声明 | @Autowired注解于dao层接口对象 |
然后重写接口的方法,dao.方法,调用dao的方法来实现业务 | |
4、Controller | |
@Controller注解 | 此注解可返回视图页面ftl可以直接获取返回的key得到值 |
@RestController | 此注解仅返回字符串格式无法返回一个页面 |
@GetMapping | 等同于@RequestMapping(get方法) |
@GetMapping | ({"/", “/list”, “datasheet.ftl”})此种标记表示任何一个都可以调用这个方法 |
@PostMapping | 等同于@RequestMapping(post)方法 |
5、JPA | |
JPA接口 | 继承于JpaRepository享有其所有方法 |
若新接口没有写任何方法则全部使用JpaRepository的反之则使用新编写的 | |
@Transactional | 开启事务参见于 注解描述详解 |
@Modifying | 于@Query一起使用,进行编写sql语句 |
@Query | 中编写sql语句,注意占位 |
上述就是项目当前使用的注解了
4、本文涉及的 hibernate 的hsql语法
语法 | 描述 |
---|---|
List findAllByUserName(String name ) | 通过用户名得到对象集合 |
WebData findById(Integer id); | 通过主键id得到一个用户对象 |
List findAll(); | 直接查询到所有用户这个是来自继承的方法 |
WebData findTopByUserName(String name ); | 自带语法支持找到仅一条数据 |
WebData findTopByOrderByIdDesc(); | 自带语法支持倒序找到仅一条数据 |
WebData findTopByOrderById(); | 自带语法支持正序找到仅一条数据 |
ListfindTop10ByOrderById(); | 自带语法支持找到正序10条数据 |
5、整体开发流程
除建项目外
1、bean
2、JPA > dao >daoImpl (进行junit单元测试,若没有问题在下一百)
3、service > serviceImpl (进行junit单元测试,若没有问题在下一百)
4、controller