首先看下目录结构,我把需要注意的用红色码标注了,没必要看的就用黄色的挡住了。这次主要操作的是work这个数据表
每一个文件都要注意下有没有注解。就是以@开头的东西。
这里需要注意的是,所有的目录,都是在启动项目录的下层的。这个是必须在它下层的(同级可能也可以,没试过)。
连接数据库前的配置
首先实在跟application.properties文件相同的位置新键一个application.yml文件(直接新键文件,然后改后缀就行,这个没必要讲,常识)。
8080是端口号,我是默认的,没有修改,改了的话就用自己的。
下面url地方有需要改的。
url里面有个yhy?,yhy是我的数据库名,这个改成自己的,问号要保留。
其他地方都不需要改,包括dirver-class-name。
```java
server:
port: 8080
servlet:
context-path:
spring:
datasource:
username: root
password: root
url: jdbc:mysql://localhost:3306/yhy?useUnicode=true&characterEncoding=utf-8&useSSL=true&serverTimezone=UTC
type: com.alibaba.druid.pool.DruidDataSource
driver-class-name: com.mysql.cj.jdbc.Driver
实体类代码
这里的代码没什么好说的,就是根据数据表里面的字段名,封装起来,然后写getter、setter方法。我把需要导的包页写上了,不合适的可以对照一下,写这个报错的话,一定别把包导错了。
必须要说的一点是,必须要写注解!!!实体里面我写了三个注解
package com.example.stu;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;
//work是我的表名,到时候替换成自己的就可以了
@Entity(name = "work")
@Table(name = "work")//这个貌似可以不写,到时候试试,不行就删了,
public class Work {
@Id @GeneratedValue(strategy = GenerationType.IDENTITY)//规定默认的id
private String id;//id
private String name;//姓名
private String cla;//班级
//这里我还省略了很多的字段名,下面代码碰到字段名我会指出
//写getter/setter方法
关键部分①DAO部分代码
因为大部分的方法都来自继承的对象,所以基本用不到sql语句了,用sql语句纯粹是无奈之举,实在不会了才用sql语句。而且在这里使用sql语句,就失去了springBoot的意义了。(个人理解,大佬指点批评,虚心接受)
package com.example.dao;
import org.springframework.data.domain.Pageable;
import java.util.List;
import java.util.Map;
import org.springframework.data.domain.Page;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.PagingAndSortingRepository;
import com.example.stu.Work;
public interface WorkDAO extends PagingAndSortingRepository<Work, String>,JpaSpecificationExecutor<Work>{
//查询所有数据的方法
@Query("from work w order by w.id asc")
List<Work> findAll();//findAll方法有内置的,这里写sql语句是刚开始学的时候用的。而且这里用的sql语句已经不是原生的sql语句了,原生的sql语句写法见表连接方法
//模糊查询 findBy**Like*(参数)是内置的方法,**代表字段名,详细的介绍我有一篇单独的博客,可以参考一下
List<Work> findByidLike(String id);
//通过tell字段名进行精确查询,效果跟下面的sql相同
//原生sql:select * from work where tell = ?
List<Work> findBytell(String tell);
//修改,因为要数据回显,所以要有一个单独的方法查询,返回值是Work,根据id查询
Work findByid(String id);
//表连接,实属无奈,不会,只能用sql语句了,还是用原生的。在最后加上那个,就是代表的原生sql cla是我的另一个表
@Query(value="select * from work w join cla c on w.cla = c.cid",nativeQuery = true)
List<Map> findAllData();//表连接返回值是list<map>!!!
//分页,这里的findAll参数跟上面的findAll参数不同,所以问题不大。返回值是page的findAll方法也是有内置的,但是没用过,当时时间不充足,没时间试,就写了sql语句
//@Query("from work w order by w.id asc")
Page<Work> findAll(Pageable page);
//分页表连接
@Query(value="select * from work w join cla c on w.cla = c.cid",nativeQuery = true)
Page<List<Map>> findAllMap(Pageable page);
}
继承DAO service部分代码
这里有两个注解,记得写上。
其他没什么要注意的了
package com.example.service;
import java.util.List;
import java.util.Map;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.stereotype.Service;
import com.example.dao.WorkDAO;
import com.example.stu.Work;
@Service
public class WorkService {
@Autowired
//查询全部
private WorkDAO workDAO;
public List<Work> findAll(){
return workDAO.findAll();
}
public List<Map> findAllData(){
return workDAO.findAllData();
}
//根据id查询
public Work findId(String id){
return workDAO.findByid(id);
}
//模糊查询
public List<Work> findByIdLike(String id){
return workDAO.findByidLike(id);
}
//添加
public void save(Work work) {
workDAO.save(work);
}
//验证手机号唯一
public List<Work> findBytell(String tell){
return workDAO.findBytell(tell);
}
//删除
public void del(Work work) {
workDAO.delete(work);
}
//分页
public Page<Work> findpage(Pageable page){
return workDAO.findAll(page);
}
//分页表连接
public Page<List<Map>> findAllMap(Pageable page){
return workDAO.findAllMap(page);
}
}
重点 controller代码
这里我把导入的包先单独放一块了,分页要导入的包自己注意下,别导错了
package com.example.controller;
import java.util.ArrayList;
import java.util.List;
import javax.servlet.http.HttpServletRequest;
import org.apache.commons.lang3.StringUtils;
import java.util.Map;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;//分页
import org.springframework.data.domain.PageRequest;//分页
import org.springframework.data.domain.Pageable;//分页
import org.springframework.data.domain.Sort;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import com.example.service.ClaService;
import com.example.service.WorkService;
import com.example.stu.Cla;
import com.example.stu.Work;
主体代码
@Controller
@RequestMapping("work")//应该可以解释为给以下内容起个名字
public class WorkController {
@Autowired
private WorkService workService;
@Autowired
private ClaService claService;
/**
* @param 首页模块
* @return 首页
*/
@RequestMapping(value = "index")//给当前的方法起名字,调用的时候是work/index
//这里是向html首页映射值的部分,还是映射了两个值,映射一个的话就省略一块就行
public String index(Model model) {
//model就是向模板映射的方法
//传work
List<Work> data = workService.findAll();
model.addAttribute("data", data);//向模板映射值
//传cla,这里是传的另一个表的数据,需要在同目录下新建entiy、dao、service什么的,我就不列出来了,下面的方法我没有写出来
List<Cla> list = claService.findAll();
model.addAttribute("list", list);
return "/workIndex";//返回值是返回到首页,workindex是首页文件名,没有后缀是我提前在其他地方改好了,你没有改的话就写workindex.html。在stringBoot中,貌似不能直接打开html/jsp文件,只能通过controller中的方法来调用html/jsp文件。所以说在这要打开html文件的话用localhost:8080/work/index就可以了。index是注解中的index
}
/**
* @param 表连接向模板映射值
*/
//这个跟上一个功能相同,都是向首页映射值,不过下面的是用表连接写,只能用其中一个,首页中我是接收的这个映射的值。(boss规定要用表连接,而且表连接方便后期修改)
@RequestMapping(value = "indexAll")
public String indexAll(Model model) {
List<Map> list = workService.findAllData();
model.addAttribute("data", list);
return "/workIndex";
}
/**
* @prarm 添加模块
* @return 重定向返回首页模块
*/
//添加主体
@RequestMapping("add")
public String add(Mode