您的位置:首页 > 编程语言 > Java开发

SpringDateJpa实现多条件分页动态sql语句查询(小型项目)

2020-03-01 07:16 645 查看

SpringDateJpa实现多条件分页动态sql语句

1创建SpringBoot项目

2导入依赖

在pom.xml复制如下代码

<!-- Spring Boot JPA 依赖 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>

3创建各包

controller 转发请求与响应
dao 接口方法存放
entity 实体类存放
service 业务方法
service.Imp方法实现

4.创建实体类

我这里创建的是Student(学生实体类)

//小辣椒创建get/set,toString()方法,没有的请加上get/set,toString()方法
@Data
//jpa自动创建数据库
@Entity
public class Student {
//主键标识
@Id
//自动递增
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer sId;//学生id
private String sName;//学生Name
private Integer sAge;//学生年龄
private Date sSex;//学生性别
}

5.在dao包创建接口

接口名StudentDao

/**
* 里面内置了许多实用的方法
* JpaRepository<Student, Integer>
* Student是实体类,Integer是实体类中主键的数据类型
*
* 生成动态sql的接口
* JpaSpecificationExecutor<Student>
*
*/
public interface StudentDao extends JpaRepository<Student, Integer>,JpaSpecificationExecutor<Student>{

6.创建业务接口

接口名StudentService
我们要完成的业务是多条件分页查询所以要创建一个自定义方法

public interface StudentService {
/**
* 分页多条件查询
*/
Map<String, Object> findAll(PageRequest pageable,Student student);
}

7.实现业务接口

我们创建一个业务接口实现类
类名StudentServiceImp

@Service
public class StudentServiceImp implements StudentService{
@Autowired
private StudentDao studentdao;
@Override
public Map<String, Object> findAll(PageRequest pageable, Student student) {
Page<Student> findAll = studentdao.findAll(selectquanpage(student),pageable);
Map<String, Object> map = new HashMap<String, Object>();
map.put("rows", findAll.getContent());
map.put("total", findAll.getTotalElements());
return map;
}
private Specification<Student> selectquanpage(Student student){
return new Specification<Student>() {
private static final long serialVersionUID = 1L;
@Override
public Predicate toPredicate(Root<Student> root, CriteriaQuery<?> query, CriteriaBuilder cb) {
// TODO Auto-generated method stub
Predicate conjunction = cb.conjunction();
List<Expression<Boolean>> expressions = conjunction.getExpressions();
//模糊查询学生姓名
/**
* 首先if判断传进的学生姓名不能为空
* <String>表示查询的字段的数据类型
* get("sName")需要查询的字段,引号里需要与实体类中的一模一样区分大小写
*/
if (student.getsName()!=null&&student.getsName()!="") {
expressions.add(cb.like(root.<String>get("sName"), "%"+student.getsName()+"%"));
}
//查询学生性别
/**
* 首先if判断传进的学生姓名不能为空可以为0
* 0为女,1为男
*
*/
if (student.getsSex()!=null) {
expressions.add(cb.equal(root.<Integer>get("sSex"), student.getsSex()));
}

return conjunction;
}
};
}
}

8.配置配置文件

配置src/main/resources下的application.properties

spring.datasource.url=jdbc:mysql://localhost:3306/数据库名?useUnicode=true&characterEncoding=utf8
spring.datasource.username=数据库用户名
spring.datasource.password=密码
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.jpa.database-platform=org.hibernate.dialect.MySQLDialect
##显示sql语句
spring.jpa.show-sql=true
##修改
spring.jpa.hibernate.ddl-auto=update

9.编辑前台页面

我这里用的是Html前后台分离
框架用的EasyUi
注意!每个框架不同分页参数也可能不同
js部分

<script type="text/javascript">
$(function(){
init();
} )
//初始化
function init() {
var nameset=$('#nameset').val();
var sexset=$('#sexset').combobox('getValue');
if(sexset=="--请选择--"){
sexset=null;
}
//加载表格
$("#dg").datagrid({
url: 'http://127.0.0.1:8080/select',
method:"post",
pagination:true,
toolbar:"#ss",
queryParams:{
sName:nameset,
sSex:sexset
}
});
$("#ss").form("reset");
}
//显示类型
function xingbie(value, row, index) {
return  value==1?"男":"女";
}
</script>

html部分代码,如果用Easyui别忘了导入

<!--查找条件栏 -->
<form id="ss">
<label>学生姓名:</label>
<input class="easyui-textbox" type="text"  id="nameset" ></input>
<label>学生性别:</label>
<select id="sexset" class="easyui-combobox"  style="width: 200px;">
<option value="--请选择--">--请选择--</option>
<option value="1">男</option>
<option value="0">女</option>
</select>
<a href="javascript:void(0)" class="easyui-linkbutton" onclick="init()">查找</a>
</form>
<!--显示数据表格 -->
<table id="dg"   class="easyui-datagrid" title="商品信息" data-options="singleSelect:true,collapsible:true,pagination:true">
<thead>
<tr>
<th data-options="field:'sId'">编号</th>
<th data-options="field:'sName'">商品名称</th>
<th data-options="field:'sAge'">上次价格</th>
<th data-options="field:'sSex',formatter:xingbie">类别</th>
</tr>
</thead>
</table>

10运行访问


前台这里我用的是HB,国产软件挺好用的
运行
成功页面

以上功能就全部能用啦
最后附带数据库

-- Table structure for student
-- ----------------------------
DROP TABLE IF EXISTS `student`;
CREATE TABLE `student` (
`s_id` int(11) NOT NULL AUTO_INCREMENT,
`s_age` int(11) DEFAULT NULL,
`s_name` varchar(255) DEFAULT NULL,
`s_sex` int(11) DEFAULT NULL,
PRIMARY KEY (`s_id`)
) ENGINE=InnoDB AUTO_INCREMENT=17 DEFAULT CHARSET=utf8;
-- ----------------------------
-- Records of student
-- ----------------------------
INSERT INTO `student` VALUES ('1', '16', '赵一', '1');
INSERT INTO `student` VALUES ('2', '16', '钱二', '1');
INSERT INTO `student` VALUES ('3', '16', '孙一', '1');
INSERT INTO `student` VALUES ('4', '16', '李吴', '1');
INSERT INTO `student` VALUES ('5', '16', '周三', '0');
INSERT INTO `student` VALUES ('6', '16', '吴五', '0');
INSERT INTO `student` VALUES ('7', '15', '郑二', '0');
INSERT INTO `student` VALUES ('8', '15', '王五', '0');
INSERT INTO `student` VALUES ('9', '15', '马三', '0');
INSERT INTO `student` VALUES ('10', '15', '刘四', '0');
INSERT INTO `student` VALUES ('11', '16', '关赵', '0');
INSERT INTO `student` VALUES ('12', '16', '张三', '0');
INSERT INTO `student` VALUES ('13', '16', '曹二', '0');
INSERT INTO `student` VALUES ('14', '14', '尼八', '1');
INSERT INTO `student` VALUES ('15', '14', '徐李', '1');
INSERT INTO `student` VALUES ('16', '14', '郭一', '1');
  • 点赞
  • 收藏
  • 分享
  • 文章举报
霾^O^葬 发布了2 篇原创文章 · 获赞 0 · 访问量 106 私信 关注
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: