最近开始在公司实习了,刚开始还没有跟项目,只是接到leader的指令看以往的代码,然后自己添加简单额增删改查功能。公司用的是springboot+hibernate的框架。
首先贴出数据库的代码,因为是测试,所以比较简单,只有三个字段:
CREATE TABLE `t_test` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
`gender` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
这个是代码目录,非常简单,因为只是很简单的例子,接下来直接贴出代码:
TestRepository:
public interface TestRepository extends JpaRepository, QuerydslPredicateExecutor {
@Query(value = "select * from t_test where id = ?1 ", nativeQuery = true)
Test findByIds(Integer id);
@Query(value = "select * from t_test where name like %?1%", nativeQuery = true)
List findVauge(String name);
@Query(value = "select * from t_test limit ?1,?2 ", nativeQuery = true)
List findTest(Integer start, Integer end);
@Modifying
@Query(value = "update t_test set name=?1 where id=?2 ", nativeQuery = true)
int updateTest(String name,Integer id);
@Modifying
@Query(value = "delete from t_test where id=? ", nativeQuery = true)
int deleteTest(Integer id);
@Modifying
@Query(value = "insert into t_test (name,gender) values(?1,?2) ", nativeQuery = true)
int insertTest(String name,String gender);
}
定义个继承JpaRepository和QuerydslPredicateExecutor的接口,这两个方法里面哟很多封装好的查询方法,可以直接调用,非常简单。
model层的Test类:
@Entity
@Table(name = "t_test")
public class Test {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Integer id;
private String name;
public Test() {
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
@Entity注解表示实体类
@Table(name = “t_test”)对应的是数据库中的表。
业务逻辑层的TestService接口:
public interface TestService {
Test findById(Integer id);
Test updateTest(String name,Integer id);
int deleteTest(Integer id);
int insertTest(String name,String gender);
List findTest(Integer start, Integer end);
List findVauge(String name);
}
然后是业务逻辑的具体实现:
@Component
class TestServiceImpl implements TestService {
private static final Logger LOGGER = LoggerFactory.getLogger(TestServiceImpl.class);
@Resource
private TestRepository testRepository;
@Override
public Test findById(Integer id) {
return testRepository.findByIds(id);
}
@Override
public Test updateTest(String name,Integer id) {
Test test=testRepository.findByIds(id);
if(test!=null) {
testRepository.updateTest(name, id);
return testRepository.findByIds(id);
}
else
throw new BusinessException("该用户不存在");
}
@Override
public int deleteTest(Integer id) {
Test test=testRepository.findByIds(id);
if(test!=null) {
int i= testRepository.deleteTest(id);
return i;
}
else
throw new BusinessException("用户不存在");
}
@Override
public int insertTest(String name, String gender) {
boolean flag=false;
/*
* correctGender为最终输入数据库的性别
* */
String correctGender=ClassGender.UNKNOWN.name();
/*
* 遍历枚举类型,检查用户输入的参数是否正确
* */
for (ClassGender classGender : ClassGender.values())
{
if(classGender.getLabel().equals(gender))
{
flag=true;
correctGender=classGender.name();
break;
}
}
if(flag)
return testRepository.insertTest(name,correctGender);
else
throw new BusinessException("性别格式不正确");
}
@Override
public List findTest(Integer start, Integer end) {
List testList= (List) testRepository.findTest(start,end);
return testList;
}
@Override
public List findVauge(String name) {
List list=testRepository.findVauge(name);
return list;
}
}
这里面有使用到枚举类型,以确保输入的性别都是正确的:
ClassGender:
public enum ClassGender {
MAN(1, "男"),
WOMAN(2, "女"),
UNKNOWN(0, "未知");
private Integer code;
private String label;
private ClassGender(Integer code, String label) {
this.code = code;
this.label = label;
}
public Integer getCode() {
return code;
}
public String getLabel() {
return label;
}
public static ClassGender getEnum(Integer code) {
if (code == null) {
return null;
}
for (ClassGender status : values()) {
if (status.getCode() == code) {
return status;
}
}
return null;
}
}
接着就是controller:
@RestController
@RequestMapping("/portalbasic/test")
@Api(tags = "门户 测试 ")
public class TestController extends AbstractController {
private static final Logger LOGGER = LoggerFactory.getLogger(TestController.class);
private JPAQueryFactory queryFactory;
@Resource
private TestService testService;
@RequestMapping(value = "/getInfo", method = RequestMethod.POST)
@ApiOperation(value = "获取用户信息", notes = "", response = Result.class)
public Result getInfo(@RequestParam(required = true) Integer id) {
Test test = testService.findById(id);
return super.success(test);
}
@RequestMapping(value = "/getTest", method = RequestMethod.POST)
@ApiOperation(value = "模糊查询", notes = "", response = Result.class)
public Result getVauge(@RequestParam(required = false,defaultValue = "")String name) {
List testList=testService.findVauge(name);
return super.success(testList);
}
@RequestMapping(value = "/getLimitInfo", method = RequestMethod.POST)
@ApiOperation(value = "获取用户信息集", notes = "", response = Result.class)
public Result getLimitInfo(@RequestParam( required = false, defaultValue = "0") Integer start,
@RequestParam( required = false, defaultValue = "1000")Integer end) {
List testList= (List) testService.findTest(start,end);
return super.success(testList);
}
@Transactional
@RequestMapping(value = "/updateInfo", method = RequestMethod.POST)
@ApiOperation(value = "更改用户信息", notes = "", response = Result.class)
public Result updateInfo(@RequestParam(required = true) String name,
@RequestParam(required = true)Integer id
) {
Test test= testService.updateTest(name,id);
return super.success(test);
}
@Transactional
@RequestMapping(value = "/deleteInfo", method = RequestMethod.POST)
@ApiOperation(value = "删除用户信息", notes = "", response = Result.class)
public Result deleteInfo(@RequestParam(required = true)Integer id)
{
int i=testService.deleteTest(id);
return super.success(i);
}
@Transactional
@RequestMapping(value = "/insertInfo", method = RequestMethod.POST)
@ApiOperation(value = "添加用户信息", notes = "", response = Result.class)
public Result insertTest(@RequestParam(required = true)String name,
@RequestParam(required = true)String gender)
{
int i=testService.insertTest(name,gender);
return super.success(i);
}
}
@Api(tags = "门户 测试 ")注解是因为使用的是swagger,相当于一个接口,这个是可以不用的,以下相应的@ApiOperation也是可以不用的。
这样子留完成了简单的demo,下面看看运行结果: