第十二章 增删改查
这章我们来做用户的增删改查
查询
先来查,在上面另一个查询条件,用来查询用户姓名及用户名的查询
在查询按钮前添加个文本框,并使用col来进行布局,先不管好不好看。
<el-input v-model="s_user" placeholder="用户名或姓名"></el-input>
因为添加了v-model=s_user了,所以我们需要在data()里添加s_user:””来绑定,并在queryList方法中的参数添加username:this.s_user。我们打开浏览器f12来查看看一下查询时的参数,发现已经发送到后台了。
1 <el-row > 2 <el-col :span="6"> 3 <el-input v-model="s_user" placeholder="用户名或姓名"></el-input> 4 </el-col> 5 <el-col :span="6"> 6 <el-button type="primary" size="small" id="search" @click="search">查询</el-button> 7 </el-col> 8 </el-row>
1 return { 2 loading: true, 3 tableData: [], 4 s_user:"", 5 pagination: { 6 pageSizes: [1, 10, 20, 50], 7 currentPage: 1, 8 total: 0, 9 pageSize: 10, 10 }, 11 }
let para = {
pageNum: this.pagination.currentPage,
pageSize: this.pagination.pageSize,
username: this.s_user,
};
接下来我们改造一下后台
UserController中找到方法queryUser。我们当初已经预留查询参数的对象QueryUser了。现在我们需要添加两个username及realname,这样前台传来的参数自动就会加载到username,然后我们在controller中再处理一下将username的值赋值给realname;然后我们需要打开xml文件了,添加相关的查询,使用if来判断,使用bind来防止注入攻击
QueryUser.java
1 private String username; 2 3 public String getUsername() { 4 return username; 5 } 6 7 public void setUsername(String username) { 8 this.username = username; 9 }
UserMapper.xml
1 <select id="select" resultMap="UserResultMap"> 2 select 3 <include refid="columns"/> 4 from ts_user 5 where 1 = 1 6 <if test="username != null and username != ''"> 7 <bind name="bName" value="'%'+username+'%'"/> 8 and (username like #{bName} 9 or realname like #{bName}) 10 </if> 11 </select>
好了。我们成功完成了查询。如果需要查询其它的,重复我们这个过程就可以了。
新增
下面是新增我们打开element-ui的网站,找到组件,我们使用Dialog对话框来实现弹窗实现新增功能。我们实现网站demo中的自定义里第二个打开嵌套表彰的dialog来做最初的代码。
我们只把重要的,有我们有关的代码,贴进来并且不做任选修改。效果如下,点击打开嵌套表单的Dialog即可实现的弹窗效果。
然后我们在这基本上,进行修改,可以参加form表单,及你用到的控件等。我们完成,界面绘制,及必填验证
首先,form上添加ref用来验证时调用。
必填是使用:rules=”rules”来完成的。并且在需要验证的控件添加prop=”username”,然后在data中,添加相应的代码
1 rules: { 2 username: [ 3 { required: true, message: '请输入用户名', trigger: 'blur' }, 4 { min: 5, max: 20, message: '长度在 5 到 20 个字符', trigger: 'blur' } 5 ], 6 realname: [ 7 { required: true, message: '请输入姓名', trigger: 'blur' }, 8 { min: 1, max: 20, message: '长度在 1 到 20 个字符', trigger: 'blur' } 9 ], 10 },
添加一个saveAdd的方法,当我们什么也不写时,提示我们必填,当我们填写上了,提示我们submit。
1 saveAdd:function(){ 2 var _this = this; 3 this.$refs["formAdd"].validate(valid => { 4 if(valid){ 5 alert("submit!") }else{ 6 return false; 7 } 8 }); 9 },
然后我们调用后台的代码补充完整,添加btnLoading用于提交时,将按钮设置成loading状态,防止重复提交。代码见最后
然后我们完善后台代码。需要注意的是,表中的不能为null的字段,在insert时都要有值。哪怕是个空格也不能是null。
然后就是,username是有唯一键的,所以在insert前,我们需要查询一下,是否存在,如果存在也要将结果返回到前端。如果唯一键不处理前台接到的错误就是500,所以我们还不能偷懒,只能自己写个查询。然后我们之前用于查询的username需要修改为user,专门用来查询,将username空出来用于用户名查询。中间需要进行改造。我们还添加了RecordExistenceException用于专门对记录存在的扔出异常来。
然后,密码和盐这块这次没写,留到下次。
相关,修改是最简单的,用户名不能修改。
删除也是逻辑删除,将状态变更为停用即可。
后台代码会在本章最后一次放出。
我们再回到前端,按钮必为新增。然后,进行一下操作。完美,新增完,自动刷新。再次打开新增时,就发现问题,上次输入的记录没清。那就再添加一下清空的方法。
_this.$refs["formAdd"].resetFields();
修改和删除
新增到现在就完成了。下面是修改和删除
先在列表中添加操作列
1 <el-table-column label="操作" width="100"> 2 <template slot-scope="scope"> 3 <span> 4 <el-button type="text" size="small" v-on:click="edit(scope.row)" icon="edit">编 辑</el-button> 5 <el-button type="text" size="small" v-on:click="del(scope.row)" icon="delete">删 除</el-button> 6 </span> 7 </template> 8 </el-table-column>
添加编辑和删除的方法,测试一下。好用
del:function(row){
alert("del"+row.id);
},
edit:function(row){
alert("edit"+row.id);
},
删除
删除简单,我们先写删除,需要一个确认框,进行删除的二次确认,再调用后台即可。
1 let _this = this; 2 this.$confirm('将删除用名['+row.username+'], 是否继续?', '提示', { 3 confirmButtonText: '确定', 4 cancelButtonText: '取消', 5 type: 'warning' 6 }).then(() => { 7 let delUrl = "/api/user/del"; 8 let param ={ 9 id:row.id, 10 }; 11 Vue.axios.post(delUrl,param) 12 .then(function (res) { 13 _this.btnLoading = false; 14 if (res.status === 200) { 15 let result = res.data; 16 if (result.success) { 17 _this.$message({ 18 type: 'success', 19 message: '删除成功!' 20 }); 21 _this.queryList(); 22 } else { 23 _this.$message({ 24 message: result.message, 25 type: "error", 26 }) 27 } 28 } else { 29 _this.$message({ 30 message: res.message, 31 type: "error", 32 }) 33 } 34 }); 35 .catch(function (error) { 36 _this.btnLoading = false; 37 _this.$message({ 38 message: "发生错误" + error, 39 type: "error", 40 }); 41 }); 42 });
完美。
在列表中我们看到状态是3的记录了,表示已经被删除了。但是前的按钮不好看。我们在按钮里添加代码
v-show="scope.row.status!='3'"
然后,我们再看。好了没有了
修改
我们先将修改的form,复制一份,formAdd变为formEdit,同时,将data里的也添加formEdit,还有dialogFormEditVisible,添加一个
然后,在edit的方法里,添加 this.dialogFormEditVisible = true; 就能看到效果了。Username是不能修改的,所以设为不可修改,添加id只读。更新时以id为主
下一步就是把数据添加上了,再有个保存,就完成了。为了保证每次修改都是最新的,所以点修改时,都要去后台实时获取新数据,而不是使用list中的数据,以用来保证数据的准确性。
添加查询的语句
1 let _this = this; 2 let editUrl = "/api/user/get"; 3 let param = { 4 id: row.id, 5 } 6 Vue.axios.post(editUrl, param) 7 .then(function (res) { 8 _this.loading = false; 9 if (res.status === 200) { 10 let result = res.data; 11 if (result.success) { 12 _this.dialogFormEditVisible = true; 13 _this.formEdit.id = result.data.id; 14 _this.formEdit.username = result.data.username; 15 _this.formEdit.realname = result.data.realname; 16 _this.formEdit.mail = result.data.mail; 17 _this.formEdit.sex = result.data.sex; 18 _this.formEdit.phone = result.data.phone; 19 _this.formEdit.remarks = result.data.remarks; 20 } else { 21 _this.$message({ 22 message: result.message, 23 type: "error", 24 }); 25 } 26 } else { 27 _this.$message({ 28 message: res.message, 29 type: "error", 30 }); 31 } 32 }) 33 .catch(function (error) { 34 _this.$message({ 35 message: "发生错误" + error, 36 type: "error", 37 }) 38 });
添加保存方法。
1 var _this = this; 2 this.$refs["formEdit"].validate(valid => { 3 if (valid) { 4 let param = { 5 id: this.formEdit.id, 6 username: this.formEdit.username, 7 realname: this.formEdit.realname, 8 phone: this.formEdit.phone, 9 sex: this.formEdit.sex, 10 mail: this.formEdit.mail, 11 remarks: this.formEdit.remarks, 12 } 13 _this.btnLoading = true; 14 var addUrl = "/api/user/edit"; 15 Vue.axios.post(addUrl, param) 16 .then(function (res) { 17 _this.btnLoading = false; 18 if (res.status === 200) { 19 let result = res.data; 20 if (result.success) { 21 _this.$message({ 22 message: "保存成功", 23 type: "success", 24 }); 25 _this.dialogFormEditVisible = false; 26 _this.queryList(); 27 } else { 28 _this.$message({ 29 message: result.message, 30 type: "error", 31 }) 32 } 33 } else { 34 _this.$message({ 35 message: res.message, 36 type: "error", 37 }) 38 } 39 }) 40 .catch(function (error) { 41 _this.btnLoading = false; 42 _this.$message({ 43 message: "发生错误" + error, 44 type: "error", 45 }); 46 }); 47 } else { 48 return false; 49 } 50 });
完成。我们现在可以整体,再测试一下。发现个问题,新增、修改的弹出,我们再点遮罩层和按esc时都会关闭。我们并不希望这样。看了看官方文档,设两个属性为false即可。close-on-click-modal,close-on-press-escape。翻页也挺好用。本章完成。以下是相关页面代码
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 <template> 2 <div> 3 <el-row> 4 <el-col :span="6"> 5 <el-input v-model="s_user" placeholder="用户名或姓名"></el-input> 6 </el-col> 7 <el-col :span="6"> 8 <el-button type="primary" id="search" @click="search">查询</el-button> 9 <el-button @click="dialogFormVisible = true">新增</el-button> 10 11 </el-col> 12 </el-row> 13 <el-table :data="tableData" v-loading="loading" stripe style="width: 100%"> 14 <el-table-column label="操作" width="100"> 15 <template slot-scope="scope"> 16 <span> 17 <el-button type="text" size="small" v-show="scope.row.status!='3'" 18 v-on:click="edit(scope.row)" icon="edit">编 辑</el-button> 19 <el-button type="text" size="small" v-show="scope.row.status!='3'" 20 v-on:click="del(scope.row)" icon="delete">删 除</el-button> 21 </span> 22 </template> 23 </el-table-column> 24 <el-table-column prop="username" label="用户名" width="180"/> 25 <el-table-column prop="realname" label="姓名" width="180"/> 26 <el-table-column prop="sex" label="性别" width="100"/> 27 <el-table-column prop="mail" label="邮箱" width="180"/> 28 <el-table-column prop="phone" label="电话" width="180"/> 29 <el-table-column prop="remark" label="备注" width="180"/> 30 <el-table-column prop="status" label="状态" width="180"/> 31 <el-table-column prop="editorName" label="修改人" width="180"/> 32 <el-table-column prop="editTime" label="修改时间" width="180"/> 33 </el-table> 34 <el-row style="text-align: right"> 35 <el-pagination class="pagination" 36 background 37 @size-change="handleSizeChange" 38 @current-change="handleCurrentChange" 39 :current-page="pagination.currentPage" 40 :page-sizes="pagination.pageSizes" 41 :page-size="pagination.pageSize" 42 layout="total, sizes, prev, pager, next, jumper" 43 :total="pagination.total"> 44 </el-pagination> 45 </el-row> 46 <!--新增--> 47 <el-dialog title="新增用户" :visible.sync="dialogFormVisible" :close-on-click-modal="false" :close-on-press-escape="false"> 48 <el-form :model="formAdd" :rules="rules" ref="formAdd" :label-width="formLabelWidth"> 49 <el-form-item label="用户名" prop="username"> 50 <el-input v-model="formAdd.username" autocomplete="off"></el-input> 51 </el-form-item> 52 <el-form-item label="姓名" prop="realname"> 53 <el-input v-model="formAdd.realname" autocomplete="off"></el-input> 54 </el-form-item> 55 <el-form-item label="性别"> 56 <el-radio-group v-model="formAdd.sex"> 57 <el-radio :label="1">男</el-radio> 58 <el-radio :label="2">女</el-radio> 59 </el-radio-group> 60 </el-form-item> 61 <el-form-item label="邮箱"> 62 <el-input v-model="formAdd.mail" autocomplete="off"></el-input> 63 </el-form-item> 64 <el-form-item label="电话"> 65 <el-input v-model="formAdd.phone" autocomplete="off"></el-input> 66 </el-form-item> 67 <el-form-item label="备注"> 68 <el-input type="textarea" v-model="formAdd.remarks"></el-input> 69 </el-form-item> 70 </el-form> 71 <div slot="footer" class="dialog-footer"> 72 <el-button @click="dialogFormVisible = false">取 消</el-button> 73 <el-button type="primary" @click="saveAdd" :loading="btnLoading">保 存</el-button> 74 </div> 75 </el-dialog> 76 <!--修改--> 77 <el-dialog title="修改用户" :visible.sync="dialogFormEditVisible" :close-on-click-modal="false" :close-on-press-escape="false"> 78 <el-form :model="formEdit" :rules="rules" ref="formEdit" :label-width="formLabelWidth"> 79 <el-input v-model="formEdit.id" type="hidden"></el-input> 80 <el-form-item label="用户名"> 81 <el-input v-model="formEdit.username" autocomplete="off" :disabled="true"></el-input> 82 </el-form-item> 83 <el-form-item label="姓名" prop="realname"> 84 <el-input v-model="formEdit.realname" autocomplete="off"></el-input> 85 </el-form-item> 86 <el-form-item label="性别"> 87 <el-radio-group v-model="formEdit.sex"> 88 <el-radio :label="1">男</el-radio> 89 <el-radio :label="2">女</el-radio> 90 </el-radio-group> 91 </el-form-item> 92 <el-form-item label="邮箱"> 93 <el-input v-model="formEdit.mail" autocomplete="off"></el-input> 94 </el-form-item> 95 <el-form-item label="电话"> 96 <el-input v-model="formEdit.phone" autocomplete="off"></el-input> 97 </el-form-item> 98 <el-form-item label="备注"> 99 <el-input type="textarea" v-model="formEdit.remarks"></el-input> 100 </el-form-item> 101 </el-form> 102 <div slot="footer" class="dialog-footer"> 103 <el-button @click="dialogFormEditVisible = false">取 消</el-button> 104 <el-button type="primary" @click="saveEdit" :loading="btnLoading">保 存</el-button> 105 </div> 106 </el-dialog> 107 108 </div> 109 </template> 110 111 <script> 112 import Vue from 'vue'; 113 114 export default { 115 name: "userManage", 116 data() { 117 return { 118 btnLoading: false, 119 loading: true, 120 tableData: [], 121 s_user: "", 122 pagination: { 123 pageSizes: [1, 10, 20, 50], 124 currentPage: 1, 125 total: 0, 126 pageSize: 10, 127 }, 128 129 dialogFormVisible: false, 130 dialogFormEditVisible: false, 131 formAdd: { 132 username: '', 133 realname: '', 134 sex: '', 135 mail: '', 136 phone: '', 137 remarks: '', 138 }, 139 formEdit: { 140 id: '', 141 realname: '', 142 sex: '', 143 mail: '', 144 phone: '', 145 remarks: '', 146 }, 147 formLabelWidth: '120px', 148 rules: { 149 username: [ 150 {required: true, message: '请输入用户名', trigger: 'blur'}, 151 {min: 5, max: 20, message: '长度在 5 到 20 个字符', trigger: 'blur'} 152 ], 153 realname: [ 154 {required: true, message: '请输入姓名', trigger: 'blur'}, 155 {min: 1, max: 20, message: '长度在 1 到 20 个字符', trigger: 'blur'} 156 ], 157 }, 158 } 159 }, 160 mounted: function () { 161 this.queryList(); 162 }, 163 methods: { 164 queryList: function () { 165 var _this = this; 166 var queryUrl = "/api/user/query"; 167 let para = { 168 pageNum: this.pagination.currentPage, 169 pageSize: this.pagination.pageSize, 170 username: this.s_user, 171 }; 172 this.loading = true; 173 Vue.axios.post(queryUrl, para) 174 .then(function (res) { 175 _this.loading = false; 176 if (res.status === 200) { 177 let result = res.data; 178 if (result.success) { 179 _this.tableData = result.data; 180 _this.pagination.total = result.page.total; 181 } else { 182 _this.$message({ 183 message: result.message, 184 type: "error", 185 }); 186 } 187 } else { 188 _this.$message({ 189 message: res.message, 190 type: "error", 191 }); 192 } 193 }) 194 .catch(function (error) { 195 _this.$message({ 196 message: "发生错误" + error, 197 type: "error", 198 }) 199 }); 200 }, 201 saveAdd: function () { 202 var _this = this; 203 this.$refs["formAdd"].validate(valid => { 204 if (valid) { 205 let param = { 206 username: this.formAdd.username, 207 realname: this.formAdd.realname, 208 phone: this.formAdd.phone, 209 sex: this.formAdd.sex, 210 mail: this.formAdd.mail, 211 remarks: this.formAdd.remarks, 212 } 213 _this.btnLoading = true; 214 var addUrl = "/api/user/add"; 215 Vue.axios.post(addUrl, param) 216 .then(function (res) { 217 _this.btnLoading = false; 218 if (res.status === 200) { 219 let result = res.data; 220 if (result.success) { 221 _this.$message({ 222 message: "保存成功", 223 type: "success", 224 }); 225 _this.$refs["formAdd"].resetFields(); 226 _this.dialogFormVisible = false; 227 _this.queryList(); 228 } else { 229 _this.$message({ 230 message: result.message, 231 type: "error", 232 }) 233 } 234 } else { 235 _this.$message({ 236 message: res.message, 237 type: "error", 238 }) 239 } 240 }) 241 .catch(function (error) { 242 _this.btnLoading = false; 243 _this.$message({ 244 message: "发生错误" + error, 245 type: "error", 246 }); 247 }); 248 } else { 249 return false; 250 } 251 }); 252 }, 253 del: function (row) { 254 let _this = this; 255 this.$confirm('将删除用名[' + row.username + '], 是否继续?', '提示', { 256 confirmButtonText: '确定', 257 cancelButtonText: '取消', 258 type: 'warning' 259 }).then(() => { 260 let delUrl = "/api/user/del"; 261 let param = { 262 id: row.id, 263 }; 264 Vue.axios.post(delUrl, param) 265 .then(function (res) { 266 _this.btnLoading = false; 267 if (res.status === 200) { 268 let result = res.data; 269 if (result.success) { 270 _this.$message({ 271 type: 'success', 272 message: '删除成功!' 273 }); 274 _this.queryList(); 275 } else { 276 _this.$message({ 277 message: result.message, 278 type: "error", 279 }) 280 } 281 } else { 282 _this.$message({ 283 message: res.message, 284 type: "error", 285 }) 286 } 287 }) 288 .catch(function (error) { 289 _this.btnLoading = false; 290 _this.$message({ 291 message: "发生错误" + error, 292 type: "error", 293 }); 294 }); 295 }); 296 }, 297 edit: function (row) { 298 let _this = this; 299 let editUrl = "/api/user/get"; 300 let param = { 301 id: row.id, 302 } 303 Vue.axios.post(editUrl, param) 304 .then(function (res) { 305 _this.loading = false; 306 if (res.status === 200) { 307 let result = res.data; 308 if (result.success) { 309 _this.dialogFormEditVisible = true; 310 _this.formEdit.id = result.data.id; 311 _this.formEdit.username = result.data.username; 312 _this.formEdit.realname = result.data.realname; 313 _this.formEdit.mail = result.data.mail; 314 _this.formEdit.sex = result.data.sex; 315 _this.formEdit.phone = result.data.phone; 316 _this.formEdit.remarks = result.data.remarks; 317 } else { 318 _this.$message({ 319 message: result.message, 320 type: "error", 321 }); 322 } 323 } else { 324 _this.$message({ 325 message: res.message, 326 type: "error", 327 }); 328 } 329 }) 330 .catch(function (error) { 331 _this.$message({ 332 message: "发生错误" + error, 333 type: "error", 334 }) 335 }); 336 }, 337 saveEdit: function () { 338 var _this = this; 339 this.$refs["formEdit"].validate(valid => { 340 if (valid) { 341 let param = { 342 id: this.formEdit.id, 343 username: this.formEdit.username, 344 realname: this.formEdit.realname, 345 phone: this.formEdit.phone, 346 sex: this.formEdit.sex, 347 mail: this.formEdit.mail, 348 remarks: this.formEdit.remarks, 349 } 350 _this.btnLoading = true; 351 var addUrl = "/api/user/edit"; 352 Vue.axios.post(addUrl, param) 353 .then(function (res) { 354 _this.btnLoading = false; 355 if (res.status === 200) { 356 let result = res.data; 357 if (result.success) { 358 _this.$message({ 359 message: "保存成功", 360 type: "success", 361 }); 362 _this.dialogFormEditVisible = false; 363 _this.queryList(); 364 } else { 365 _this.$message({ 366 message: result.message, 367 type: "error", 368 }) 369 } 370 } else { 371 _this.$message({ 372 message: res.message, 373 type: "error", 374 }) 375 } 376 }) 377 .catch(function (error) { 378 _this.btnLoading = false; 379 _this.$message({ 380 message: "发生错误" + error, 381 type: "error", 382 }); 383 }); 384 } else { 385 return false; 386 } 387 }); 388 }, 389 //改变时 390 handleSizeChange(val) { 391 this.pagination.pageSize = val; 392 this.queryList(); 393 }, 394 //条目改变时 395 handleCurrentChange(val) { 396 this.pagination.currentPage = val; 397 this.queryList(); 398 }, 399 search() { 400 this.pagination.currentPage = 1; 401 this.queryList(); 402 } 403 } 404 } 405 </script> 406 407 <style scoped> 408 409 </style>
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 @Api(value = "用户管理", description = "用户管理") 2 @RestController 3 @RequestMapping("user") 4 public class UserController extends BaseController { 5 6 @Autowired 7 private UserService userService; 8 9 @ApiOperation(value = "用户信息查询", notes = "获取用户信息") 10 @PostMapping("query") 11 public Object queryUser(QueryUser vo, PageVo pageVo) { 12 PageResult users = userService.query(vo, pageVo); 13 return getResultMessage(users); 14 } 15 16 17 @ApiOperation(value = "用户信息查询", notes = "保存新增用户") 18 @PostMapping("add") 19 public Object add(User user) { 20 int i = 0; 21 try { 22 i = userService.add(user); 23 } catch (RecordExistenceException ee) { 24 return getResultMessage(false, null, CODE_ERROR, "用户已存在"); 25 } 26 if (i > 0) { 27 return getSuccess(); 28 } else { 29 return getFail(); 30 } 31 } 32 33 @ApiOperation(value = "用户信息查询", notes = "通过id获取用户记录") 34 @PostMapping("get") 35 public Object get(QueryUser queryUser){ 36 User user = userService.get(queryUser); 37 return getResultMessage(user); 38 } 39 40 @ApiOperation(value = "用户信息查询", notes = "保存修改用户") 41 @PostMapping("edit") 42 public Object edit(User user) { 43 int i = userService.edit(user); 44 if (i > 0) { 45 return getSuccess(); 46 } else { 47 return getFail(); 48 } 49 } 50 51 @ApiOperation(value = "用户信息查询", notes = "删除用户") 52 @PostMapping("del") 53 public Object del(User user) { 54 int i = userService.del(user); 55 if (i > 0) { 56 return getSuccess(); 57 } else { 58 return getFail(); 59 } 60 } 61 62 }
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 public interface UserService { 2 3 PageResult<User> query(QueryUser vo, PageVo pageVo); 4 5 int add(User user); 6 7 int edit(User user); 8 9 int del(User user); 10 11 User get(QueryUser vo); 12 }
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 @Service 2 public class UserServiceImpl implements UserService { 3 4 @Autowired 5 private UserMapper userMapper; 6 7 @Override 8 public PageResult<User> query(QueryUser vo, PageVo pageVo) { 9 PageHelper.startPage(pageVo); 10 List<User> users = userMapper.select(vo); 11 PageInfo<User> pageInfo = new PageInfo<User>(users); 12 return new PageResult<>(pageInfo); 13 } 14 15 @Override 16 public int add(User user) { 17 //查询username是否存在 18 QueryUser queryUser = new QueryUser(); 19 queryUser.setUsername(user.getUsername()); 20 List<User> users = userMapper.select(queryUser); 21 if(users.size()>0){ 22 throw new RecordExistenceException(); 23 } 24 //不存在时,新增 25 user.setStatus(User.NORMAL); 26 user.setCreateTime(new Date()); 27 user.setEditTime(new Date()); 28 user.setEditor(1); 29 user.setEditorName("admin"); 30 return userMapper.add(user); 31 } 32 33 @Override 34 public int edit(User user) { 35 user.setEditTime(new Date()); 36 user.setEditor(1); 37 user.setEditorName("admin"); 38 return userMapper.edit(user); 39 } 40 41 @Override 42 public int del(User user) { 43 User d = new User(); 44 d.setId(user.getId()); 45 d.setStatus(User.DELETE); 46 d.setEditTime(new Date()); 47 d.setEditor(1); 48 d.setEditorName("admin"); 49 return userMapper.edit(d); 50 51 52 } 53 54 @Override 55 public User get(QueryUser vo) { 56 return userMapper.get(vo); 57 } 58 }
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 @Mapper 2 public interface UserMapper { 3 List<User> select(QueryUser vo); 4 5 int add(User user); 6 7 int edit(User user); 8 9 User get(QueryUser vo); 10 }
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 <?xml version="1.0" encoding="UTF-8" ?> 2 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" > 3 <mapper namespace="xyz.txfan.tqms.mng.mapper.UserMapper"> 4 <resultMap type="xyz.txfan.tqms.mng.entity.model.User" id="UserResultMap"> 5 <id column="id" property="id"/> 6 <result column="username" property="username"/> 7 <result column="password" property="password"/> 8 <result column="salt" property="salt"/> 9 <result column="realname" property="realname"/> 10 <result column="sex" property="sex"/> 11 <result column="mail" property="mail"/> 12 <result column="phone" property="phone"/> 13 <result column="avatar" property="avatar"/> 14 <result column="remarks" property="remarks"/> 15 <result column="status" property="status"/> 16 <result column="create_time" property="createTime"/> 17 <result column="edit_time" property="editTime"/> 18 <result column="editor" property="editor"/> 19 <result column="editor_name" property="editorName"/> 20 <result column="last_login_time" property="lastLoginTime"/> 21 <result column="last_login_ip" property="lastLoginIp"/> 22 </resultMap> 23 <sql id="columns"> 24 id, username, password, salt, realname , sex, mail, phaone, avatar ,remarks, status, create_time, 25 edit_time, editor, editor_name, last_login_time, last_login_ip 26 </sql> 27 <select id="select" resultMap="UserResultMap"> 28 select 29 <include refid="columns"/> 30 from ts_user 31 where 1 = 1 32 <if test="username != null and username != ''"> 33 and username = #{username} 34 </if> 35 <if test="user != null and user != ''"> 36 <bind name="bName" value="'%'+user+'%'"/> 37 and (username like #{bName} 38 or realname like #{bName}) 39 </if> 40 </select> 41 <select id="get" resultMap="UserResultMap" parameterType="xyz.txfan.tqms.mng.entity.model.User"> 42 select 43 <include refid="columns"/> 44 from ts_user 45 where id = #{id} 46 </select> 47 <insert id="add" parameterType="xyz.txfan.tqms.mng.entity.model.User"> 48 insert into ts_user(username, realname, password, salt, sex, mail, phone, avatar, remarks, status, create_time, edit_time, editor, editor_name) 49 values(#{username}, #{realname}, #{password}, #{salt}, #{sex}, #{mail}, #{phone}, #{avatar}, #{remarks}, #{status}, #{createTime}, #{editTime}, #{editor}, #{editorName}) 50 </insert> 51 <update id="edit" parameterType="xyz.txfan.tqms.mng.entity.model.User"> 52 update ts_user 53 <set> 54 <if test="realname!=null and realname!=''"> 55 realname = #{realname}, 56 </if> 57 <if test="sex!=null and sex!=''"> 58 sex = #{sex}, 59 </if> 60 <if test="mail!=null and mail!=''"> 61 mail = #{mail}, 62 </if> 63 <if test="phone!=null and phone!=''"> 64 phone = #{phone}, 65 </if> 66 <if test="remarks!=null and remarks!=''"> 67 remarks = #{remarks}, 68 </if> 69 <if test="status!=null and status!=''"> 70 status = #{status}, 71 </if> 72 edit_time = #{editTime}, 73 editor = #{editor}, 74 editor_name = #{editorName}, 75 </set> 76 where id = #{id} 77 </update> 78 </mapper>
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 public class QueryUser { 2 private Integer id; 3 private String username; 4 private String user; 5 6 public Integer getId() { 7 return id; 8 } 9 10 public void setId(Integer id) { 11 this.id = id; 12 } 13 14 public String getUsername() { 15 return username; 16 } 17 18 public void setUsername(String username) { 19 this.username = username; 20 } 21 22 public String getUser() { 23 return user; 24 } 25 26 public void setUser(String user) { 27 this.user = user; 28 } 29 }