1、配置多对一
教师表中的zc、zjz对应的是字典表中的id。
所以外键要放在教师表中,关联外键约束
要关联的主键之间的类型要一致,如教师表中的:zjz、zc,字典表中的id应是一个类型的,否则就会报错,zjz,zc里只能放字典表中id字段里的值,更改类型。zjz、zc要做关联用
pojo类中的Teacher.java中的类型也要做出更改,并修改他的get、set方法
修改好后多对一的准备工作也就完成了
很多个老师对应一个职称,一个专兼职(多对一)在pojo下:
因为是多对一所以需要添加这两个属性
//多对一 ---->Teacher.hbm.xml 并给这两添加get、set方法
private Dict zcDict;//职称
private Dict zjzDict;
添加完之后需要在hbm.xml中配置他两的映射方法
//因为zcDict的类型是Dict所以需要一个class
//column是用来指定外键的id值的 也就是Teacher中用来做外键的字段
//hibernate有懒加载的功能,只有的去调用了它才会去执行
//insert="false" update="false" 在查询表的瞬间就进行锁定不然会报错
<property name="zc" column="zc"></property>
<property name="zjz" column="zjz"></property>
<many-to-one name="zcDict" class="com.hxci.pojo.Dict" column="zc" insert="false" update="false"></many-to-one>
<many-to-one name="zjzDict" class="com.hxci.pojo.Dict" column="zjz" insert="false" update="false"></many-to-one>
修改显示页面中职称,和专兼职改为新定义的两个属性
<td>'+v.zcDict.value+'</td> <td>'+v.zjzDict.value+'</td>
2、带多对一关系、下拉列表的修改
我们做的修改和显示不是同一页面的,在点击修改的时候跳转到添加的页面,把添加页面的标题改为修改页面,并要求显示默认值。
我们可以通过传递id的值找到要修改信息, 需要传递一个id到添加页面
//在显示页面添加跳转修改的链接
<a href="teacherAdd.html?'+v.id+'">修改</a> // 需要传递一个id到添加页面,
到添加页面中
$(function(){
//通过判断当前的请求地址中是否有id
var id =(window.location.href).split("?")[1]
//alert(id)
if(id != null){
$.ajax({ //通过一个ajax 向后台传递i,获取一条数据,并且显示在对应的位置上
type: "POST",
url: "/ssh_sign0506/tea!queryOne",
//不想定义新的变量来进行查询直接使用TeacherController中的 tea
data: {"tea.id":id}, //-->String index =null;
dataType:"json",
async: false,
success: function (res) {//res json对象
},
});
}
在TeacherController中写查询一条的方法
public class TeacherController {
TeacherService tservice =new TeacherServiceImpl();
String flag = "0";
List<Teacher> list = null;
Teacher tea = new Teacher(); //因为之前起到查询全部的作用有get、set方法,所以这里不需要进行创建
public String queryOne(){
tea = tservice.queryOne(tea);
return "queryOne";//result标签
}
配置result标签
<action name="tea!*"
class="com.hxci.controller.TeacherController"
method="{1}" >
<result name="showAll" type="json">
<param name="root">list</param>
</result>
<result name="update" type="json">
<param name="root">flag</param>
</result>
<result name="queryOne" type="json"> //配置的标签
<param name="root">tea</param>
</result>
</action>
在接口中创建
Teacher queryOne(Teacher tea);
在实现类中创建
public Teacher queryOne(Teacher tea) {
// TODO Auto-generated method stub
return tdao.queryOne(tea);
}
在Dao层创建方法
public Teacher queryOne(Teacher tea) {
//传递过去id并加强制类型转换
return (Teacher) hibernateSession.get(Teacher.class, tea.getId());
}
在ajax的回调函数中
要给每一个input中的id都重新定义 input中的name属性和id属性是一样的
$(function(){
//通过判断当前的请求地址中是否有id
var id =(window.location.href).split("?")[1]
//alert(id)
if(id != null){
$.ajax({ //通过一个ajax 向后台传递i,获取一条数据,并且显示在对应的位置上
type: "POST",
url: "/ssh_sign0506/tea!queryOne",
//不想定义新的变量来进行查询直接使用TeacherController中的 tea
data: {"tea.id":id}, //-->String index =null;
dataType:"json",
async: false, //必须是同步查询,不然这个查询完而下拉列表的值却没查询完
success: function (res) {//res json对象
//因为是input所以是val,其他类型用text
$("#id").val(res.id);
$("#jj").val(res.jj);
$("#tel").val(res.tel);
$("#name").val(res.name);
$("#zcop").val(res.zc); //给下拉列表加默认值
$("#loginName").val(res.loginName);
$("#password").val(res.password);
},
});
}
在添加页面添加一个隐藏域 在<form></form>中添加一个input
<form class="form-x" id="form" >
<input id="id" type="hidden" name="tea.id"> //添加的隐藏域
<div class="form-group">
<div class="label">
<label>登录账号:</label>
</div>
<div class="field">
<input id="loginName" type="text" class="input w50" value="" name="tea.loginName" data-validate="required:请输入教师名称" />
<div class="tips"></div>
</div>
</div>
点击修改的页面要显示出下拉列表的默认值
把显示下拉条的ajax方到修改ajax的下方,让他先查询一条,再查询下拉列表
给下拉列表的input添加id
<div class="field">
<input id="zcop" type="hidden" > //添加的id隐藏域
<select id="zc" name="tea.zc" class="input w50">
<option value="">请选择</option>
<option value="1">教授</option>
$.ajax({
type: "POST",
url: "/ssh_sign0506/dict!showTea",
dataType:"json",
success: function (res) {
console.log(res);
//先显示职称的下拉列表
var zopt='';
$("#zc").empty();
$.each(res.zc,function(i,v){
//查询下拉框 是否有默认值
var ck ="";
if(v.id==$("#zcop").val() ){
ck ="selected"
}
//alert(ck)
zopt = zopt + '<option '+ck+' value="'+v.id+'">'+v.value+'</option>'
});
$("#zc").append(zopt);
//再显示专兼职的下拉列表
var jzopt='';
$("#zjz").empty();
$.each(res.jz,function(i,v){
jzopt = jzopt + '<option value="'+v.id+'">'+v.value+'</option>'
});
$("#zjz").append(jzopt);
},
error: function(data) {
alert("系统出现异常")
}
});
3、删除
多对一的删除
删除多的那一方对没有任何影响,删除一的那一方需要先删除多的那一方
如:班级和学生表,直接删除学生表中的信息是不会有影响的,但要是想要删除班级表中的班级值时,需要先删除学生表后才可以删除班级表中的值
在显示页面做信息的删除
//在显示页面的拼接字段中添加删除方法的超链接
//需要往后台中传递的是一个id,用id来进行删除
<a href="javascript:del('+v.id+')">删除</a>
书写删除方法的ajax
function del(a){
//alert(a);
$.ajax({ //通过一个ajax 向后台传递i,获取一条数据,并且显示在对应的位置上
type: "POST",
url: "/ssh_sign0506/tea!del",
data: {"tea.id":id}, //-->String index =null;
dataType:"json",
success: function (res) {//res json对象
if(res == '1'){
alert("删除成功");
//重新查询
window.location.href="teacher.html";
}
},
error: function(data) {
alert("系统出现异常")
}
},
});
}
在TeacherController书写删除的方法,我们
public String del(){
//在这个tea中只有id是有值的因为在ajax中我们只传递了id的值
tservice.del(tea);
flag = "1";
return "update";
}
接口中创建方法
void del(Teacher tea);
实现类中创建方法
public void del(Teacher tea) {
// TODO Auto-generated method stub
tdao.del(tea);
}
在Dao层中创建方法
public void del(Teacher tea) {
// TODO Auto-generated method stub
hibernateSession.delete(tea);
hibernateSession.beginTransaction().commit();
}
4、查询
根据教师名称进行模糊查询
1.点击搜索按钮的时候触发一个事件
2.在事件当中获取到输入框的值,
3.用ajax作为参数,把值传递到后台
4.后台根据传递过来的值进行一个条件查询的Dao层方法
5.把查询到的值返回到前台
以上就是做查询一条的思路(条件查询)
在页面中找到搜索的按钮
<a href="javascript:void(0)" class="button border-main icon-search" onclick="namesearch()" > 搜索</a></li>
有定义οnclick="namesearch()",所以直接在下面定义方法名就可以
<input id="iname" type="text" placeholder="请输入教师名称" name="keywords" class="input" style="width:250px; line-height:17px;display:inline-block" />
<a href="javascript:void(0)" class="button border-main icon-search" onclick="namesearch()" > 搜索</a></li>
需要给显示方法添加一个隐藏域
$(function(){
show();
});
function show(){
//查询的ajax
$.ajax({
type: "POST",
url: "/ssh_sign0506/tea!showAll",
dataType:"json",
success: function (res) {
if(res != null && res.length>0 ){
var _tr ='';
$("#tb").empty();//先清空列表
$.each(res,function(i,v){//每循环一次数组的时候 拼接一条html代码
_tr = _tr +'<tr><td width="100" style="text-align:left; padding-left:20px;">'+v.name+'</td><td>'+v.tel+'</td> <td>'+v.zcDict.value+'</td> <td>'+v.zjzDict.value+'</td> <td width="10%">'+v.jj+'</td> <td width="310"><a href="teacherAdd.html?'+v.id+'">修改</a>|<a href="javascript:del('+v.id+')">删除</a></td> </tr>';
});
$("#tb").append(_tr); //在循环结束之后将拼接后的html追加到根节点(列表)
}
},
error: function(data) {
alert("系统出现异常")
}
});
}
搜索框的条件查询
function namesearch(){
show();
}
写到function show()方法中
//val要获取输入框的值 iname是输入框的id
var name=$("#iname").val(); //获取隐藏域的值进行判断
无论你是否传递了值,都要进行查询
//在显示的ajax中写入
data:{'tea.name':name}, //把搜索框中的name传递过去
在TeacherController中有查询的方法,如果想要在这个查询的方法里接收变量,需要通过get、set方法来进行接传值,所以可以把tea作为参数来进行传递
TeacherService tservice =new TeacherServiceImpl();
String flag = "0";
List<Teacher> list = null;
Teacher tea = new Teacher();
public String showAll(){
list = tservice.showAll(tea); //添加的tea进行传递
return "showAll";
}
因为之前没有给show添加参数,需要在接口中给这个方法添加参数
//添加前
List<Teacher> showAll();
//添加后
List<Teacher> showAll(Teacher tea);
在他的接口的实现类中也会报错给这个方法添加参数
//添加前
public List<Teacher> showAll() {
// TODO Auto-generated method stub
return tdao.showAll();
}
//添加后
public List<Teacher> showAll(Teacher tea) { //定义一个方法需要指定一个类型
// TODO Auto-generated method stub
return tdao.showAll(tea); //掉方法是传参数,需要把变量放入
}
在Dao层中需要改变这个方法
//改变前
public List<Teacher> showAll() {
// TODO Auto-generated method stub
return hibernateSession.createQuery("from Teacher").list();
}
//改变后
public List<Teacher> showAll(Teacher tea) {
// TODO Auto-generated method stub
return hibernateSession.createQuery("from Teacher").list();
}
用hibernate的模糊查询
// 类名 属性名
from Teacher where name
ajax中的tea要和Controller里的tea一致
showAll中的查询方法
public List<Teacher> showAll(Teacher tea) {
String hql = "from Teacher where name like :nam";
//调用session获取数据库类表的方法,传递hql查询语句
Query query = hibernateSession.createQuery(hql);
query.setString("nam","%"+tea.getName()+"%");
List<Teacher>list = query.list(); //
// TODO Auto-generated method stub
return query.list();
}
5、下拉框查询
直接把添加页面的下拉列表ajax复制过来,进行修改写入显示页面的隐藏域中
//页面加载的时候进行查询
$(function(){
show();
$.ajax({
type: "POST",
url: "/ssh_sign0506/dict!showTea",
dataType:"json",
success: function (res) {
//先显示职称的下拉列表
$("#zc").empty(); //先清空类表
var zopt='<option value="">请选择</option>';
$.each(res.zc,function(i,v){
zopt = zopt + '<option value="'+v.id+'">'+v.value+'</option>'
});
$("#zc").append(zopt);
},
error: function(data) {
alert("系统出现异常")
}
});
});
在下拉列表选择完后,点击查询
获取下拉列表的值,传递过去的不是副教授这三个字,是字典表中副教授的id,也就是value的值。
定义变量sa,ajax中要传递的值需要添加一个zc
function show(){
//val要获取输入框的值 iname是输入框的id
var na=$("#iname").val(); //在页面加载时就开始进行模糊查询
//val要获取下拉列表的值 zc是下拉列表的id
var zc=$("#zc").val();
$.ajax({
type: "POST",
url: "/ssh_sign0506/tea!showAll",
data:{'tea.name':na,'tea.zc':zc}, //把搜索框中的name传递过去
dataType:"json",
success: function (res) {
$("#tb").empty();//先清空列表
if(res != null && res.length>0 ){
var _tr ='';
$.each(res,function(i,v){//每循环一次数组的时候 拼接一条html代码
_tr = _tr +'<tr><td width="100" style="text-align:left; padding-left:20px;">'+v.name+'</td><td>'+v.tel+'</td> <td>'+v.zcDict.value+'</td> <td>'+v.zjzDict.value+'</td> <td width="10%">'+v.jj+'</td> <td width="310"><a href="teacherAdd.html?'+v.id+'">修改</a>|<a href="javascript:del('+v.id+')">删除</a></td> </tr>';
});
$("#tb").append(_tr); //在循环结束之后将拼接后的html追加到根节点(列表)
}
},
error: function(data) {
alert("系统出现异常")
}
});
}
在Dao层中showAll方法中需要再做一次的修改,也就是需要再递一个值到数据库中好进行查询
修改好后的showAll方法
public List<Teacher> showAll(Teacher tea) {
String hql = "from Teacher where name like :nam ";
StringBuffer buffer = new StringBuffer(hql);
//判断zc是否有值传递过来如果不为null 不为空字符串就需要对数据库进行查询
if(tea.getZc()!=null && !tea.getZc().equals("")){
//这是个字符串拼接的语句,需要有空格才能在数据库中进行查询
buffer.append(" and zc=:zc");
}
//调用session获取数据库类表的方法,传递hql查询语句
Query query = hibernateSession.createQuery(buffer.toString());
query.setString("nam","%"+tea.getName()+"%");
if(tea.getZc()!=null && !tea.getZc().equals("")){
query.setInteger("zc",tea.getZc());
}
List<Teacher> list = query.list();
return query.list();
}