项目中的增删查改功能,都跟数据库连接着的,要不然你的增删查改的功能就算执行了,数据库中的数据依然不变。项目跟数据库连接着才能执行操作方法,操作方法还得依靠着SQL语句,SQL语句顾名思义:SQL为结构化查询语言,全称是:Structured Query Language,写给数据库的语句。首先说一下新增的SQL语句与整个执行操作方法。
执行单表新增,新增报名点数据:报名点ID(SignUpID)、报名点名称(SignUpName)、报名点号码(SignUpNumber)、报名点地址(SignUpSite)、报名点状态(SignUpState)。新增这四个字段的数据,ID是数据库中自增的不需要手动新增,若是你没有在数据库中设置ID自增,那就在参数类型(parameterType=”com.gx.po.SignUp”)后面加上是否有新增主键(useGeneratedKeys=”true”)和主键(keyProperty=”主键ID,如:SignUpID”)两串代码。trim标签中的Prefix=”(“ suffix= ”)”与suffixOverrides=”,”为固定语句。若是字段不能为空就去掉if标签,加上if标签就是表示该字段可为空。不用if标签的字段在新增的时候不能为空,否则会报错,个人推荐全部都加上if标签,判断是否为空可以在JS代码那里判断。if标签里面的test的字段是对应着实体类名称,if标签包裹的字段对应着数据库名称千万别写错了。第二个trim也一样,if标签里面的test的字段对应着实体类名称,if标签包裹的字段就是对应着参数名称,放在(#{ })里面。
<!-- 新增报名点 -->
<insert id="insertSignUp" parameterType="com.gx.po.SignUp">
insert into signup
<trim prefix="(" suffix= ")" suffixOverrides=",">
<if test="signUpName!=null">SignUpName,</if>
<if test="signUpNumber!=null">SignUpNumber,</if>
<if test="signUpSite!=null">SignUpSite,</if>
<if test="signUpState!=null">SignUpState,</if>
</trim>
<trim prefix="values(" suffix= ")" suffixOverrides=",">
<if test="signUpName!=null">#{signUpName},</if>
<if test="signUpNumber!=null">#{signUpNumber},</if>
<if test="signUpSite!=null">#{signUpSite},</if>
<if test="signUpState!=null">#{signUpState},</if>
</trim>
</insert>
SQL语句写完,接下来的是Dao层,参数是实体类。
int insertSignUp(SignUp signUp);// 新增报名点
Dao层写完,接下来的是ServiceImpl,执行Dao方法,返回参数是实体类。
// 新增报名点
public int insertSignUp(SignUp signUp){
return vehicleDao.insertSignUp(signUp);
}
最后的Service层,虽然跟Dao层相似,但是Service层是给控制器调用的,参数是实体类。
int insertSignUp(SignUp signUp);// 新增报名点
控制器的保存新增方法,参数是实体类,异常捕获内放输出,可以提示我们哪里的方法出错了,获取到Service层方法并执行,判断新增执行后是否成功,成功或者失败的返回值都会返回到html页面的方法。返回值可以返回中文、数字、英文。注意,新增后的提示框内容就是你返回值的内容。这个是比较简洁的,只是为了能执行SQL语句的代码,大家可以做更进一步的判断机制。
/**
* 新增保存
* @param signUp
* @return
* @throws UnsupportedEncodingException
*/
@RequestMapping("addSignUp")
@ResponseBody
public String addSignUp(SignUp signUp){
try {
// 执行新增
int sup = vehicleService.insertSignUp(signUp);
// 判断是否新增成功
if (sup > 0){
return "新增报名点成功";
}
else{
return "新增失败";
}
}catch (Exception e){
System.err.println("你好,新增报名点错误异常!");
System.out.println(e.getStackTrace());
return "报名点新增异常,请联系管理员!";
}
}
button保存的按钮,给个点击事件,让下面的保存的方法可获取到按钮。Button按钮是用bootstrap按钮。
<!-- 提交按钮 -->
<button type="button" class="btn btn-success" onclick="Preserve()">
保存
</button>
获取到保存按钮的点击事件,获取form表单的ID,serializeArray()方法通过序列化表单值来创建对象数组(名称和值),通过创建的对象数组来判断不可为空的内容框或选择框,第一个框从0开始,从左到右依次数。点击提交保存若是有判断的框为空就会有提示弹出。若是可以为空的框就不用给它做判断,省点代码。注意,多框就逐个判断,千万不要嵌套判断,不然会不利于后期的维护或者找错误!判断无误后进行post提交保存请求,post请求链接是控制器的保存新增的方法。判断控制器方法是否执行成功,就data==”控制器方法成功返回值”,就layer提示成功并刷新数据表格,刷新表格的链接是控制器查询数据的方法。简洁的刷新表格代码在下面。
// 新增保存
function Preserve(){
//serializeArray()方法通过序列化表单值来创建对象数组(名称和值)
let formid = $("#FormID").serializeArray();
// 判断必填数据是否为空(报名点名称)
if (formid[0].value=="" || formid[0].value==null){
layer.msg("请填写报名点名称,不得为空!");
return;
}
// 判断必填数据是否为空(报名点状态)
if (formid[2].value=="" || formid[2].value==null){
layer.msg("请选择报名点状态,不得为空!");
return;
}
// post提交
$.post("${pageContext.request.contextPath}/Vehicle/addSignUp", formid, function (data){
// 新增成功提示
layer.msg(data, {icon: 1});
if (data == "新增报名点成功"){
// 刷新表格
tableIns.reload({url:"${pageContext.request.contextPath}/Vehicle/JumpTwoPage"});
}
// 关闭模态框
$("#close").click();
});
}
若你已经写了模糊查询或者其他查询的操作,就可以直接调用模糊查询或其他查询的方法即可,若是你没写模糊查询或其他查询的方法,就用上面的刷新表格的方法。
// post提交
$.post("${pageContext.request.contextPath}/Vehicle/addSignUp", formid, function (data){
// 新增成功提示
layer.msg(data, {icon: 1});
if (data == "新增报名点成功"){
// 利用模糊查询的方法刷新表格
Search();
}
// 关闭模态框
$("#close").click();
});