多对多关系 需要建立一张新表存放它们的对应数据

sql语句

 create table teacher(
id int primary key,
name varchar(100),
money float(8,2)
);
create table student(
id int primary key,
name varchar(100),
grade varchar(10)
);
create table teacher_student(
t_id int,
s_id int,
primary key(t_id,s_id),
constraint t_id_fk foreign key(t_id) references teacher(id),
constraint s_id_fk foreign key(s_id) references student(id)
);

domain

Teacher.java

 package cn.itcast.domain;

 import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
/**
create table teacher(
id int primary key,
name varchar(100),
money float(8,2)
);
create table student(
id int primary key,
name varchar(100),
grade varchar(10)
);
create table teacher_student(
t_id int,
s_id int,
primary key(t_id,s_id),
constraint t_id_fk foreign key(t_id) references teacher(id),
constraint s_id_fk foreign key(s_id) references student(id)
);
* @author wzhting
*
*/
public class Teacher implements Serializable {
private Integer id;
private String name;
private float money;
private List<Student> stus = new ArrayList<Student>();
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;
}
public float getMoney() {
return money;
}
public void setMoney(float money) {
this.money = money;
}
public List<Student> getStus() {
return stus;
}
public void setStus(List<Student> stus) {
this.stus = stus;
} }

Student.java

 package cn.itcast.domain;

 import java.io.Serializable;
import java.util.ArrayList;
import java.util.List; public class Student implements Serializable {
private Integer id;
private String name;
private String grade;
private List<Teacher> ts = new ArrayList<Teacher>();
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;
}
public String getGrade() {
return grade;
}
public void setGrade(String grade) {
this.grade = grade;
}
public List<Teacher> getTs() {
return ts;
}
public void setTs(List<Teacher> ts) {
this.ts = ts;
} }

daoImpl.java

 package cn.itcast.dao.impl;

 import java.sql.SQLException;
import java.util.List; import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.BeanHandler;
import org.apache.commons.dbutils.handlers.BeanListHandler;
import org.apache.commons.dbutils.handlers.ScalarHandler; import cn.itcast.domain.Student;
import cn.itcast.domain.Teacher;
import cn.itcast.util.DBCPUtil; public class TeacherDaoImpl {
private QueryRunner qr = new QueryRunner(DBCPUtil.getDataSource());
public void addTeacher(Teacher t) throws SQLException{
//保存老师的基本信息
qr.update("insert into teacher(id,name,money) values(?,?,?)", t.getId(),t.getName(),t.getMoney());
//判断t中是否有学生
List<Student> stus = t.getStus();
//有学生:判断该学生是否在student表中;在,不添加了;不在,添加进去
if(stus!=null&&stus.size()>0){
for(Student s:stus){
Object num = qr.query("select 1 from student where id=?", new ScalarHandler(1), s.getId());//判断学生是否已在数据库中
if(num==null){
//学生信息不存在
qr.update("insert into student (id,name,grade) values(?,?,?)", s.getId(),s.getName(),s.getGrade());
}
//在第三方表中建立老师和学生的关系
qr.update("insert into teacher_student (t_id,s_id) values(?,?)", t.getId(),s.getId());
}
} } public Teacher findTeacher(Integer id) throws SQLException{
//查询老师的基本信息
Teacher t = qr.query("select * from teacher where id=?", new BeanHandler<Teacher>(Teacher.class), id);
if(t!=null){
//根据老师的id查学生的基本信息:方式三种
// String sql = "select * from student where id in (select s_id from teacher_student where t_id=?)";//子查询
// String sql = "select s.* from student s,teacher_student ts where s.id=ts.s_id and ts.t_id=?";//隐式内连接
String sql = "select s.* from student s inner join teacher_student ts on s.id=ts.s_id where ts.t_id=?";;//显式内连接
List<Student> stus = qr.query(sql, new BeanListHandler<Student>(Student.class), id);
t.setStus(stus);
}
return t;
}
}

test

测试

 package cn.itcast.test;

 import java.sql.SQLException;
import java.util.List; import org.junit.Test; import cn.itcast.dao.impl.TeacherDaoImpl;
import cn.itcast.domain.Student;
import cn.itcast.domain.Teacher; public class TeacherDaoImplTest {
private TeacherDaoImpl dao = new TeacherDaoImpl();
@Test
public void testAddTeacher() throws SQLException {
Teacher t1 = new Teacher();
t1.setId(1);
t1.setName("bxd");
t1.setMoney(20000); Teacher t2 = new Teacher();
t2.setId(2);
t2.setName("wzt");
t2.setMoney(15000); Student s1 = new Student();
s1.setId(1);
s1.setName("gfy");
s1.setGrade("A"); Student s2 = new Student();
s2.setId(2);
s2.setName("wxy");
s2.setGrade("A"); t1.getStus().add(s1);
t1.getStus().add(s2); t2.getStus().add(s1);
t2.getStus().add(s2); dao.addTeacher(t1);
dao.addTeacher(t2); } @Test
public void testFindTeacher() throws SQLException {
Teacher t = dao.findTeacher(2);
System.out.println(t.getName());
List<Student> stus = t.getStus();
for(Student s:stus)
System.out.println(s.getName());
} }

多对多关系数据库表 java描述的更多相关文章

  1. 多对一关系表 java类描述

    少的一方把它查询出来,多的一方看需求把它查出来 涉及java对象涉及到多个对象相互引用,要尽量避免使用一对多,或多对多关系,而应使用多对一描述对象之间的关系(或使用延迟加载的方式). 下个例子empl ...

  2. 一对一关系数据库表 java类描述

    一对一关系中 从表的主键是 主表的外键 sql语句 create table person( id int primary key, name varchar(100) ); create table ...

  3. hibernate建表多对多建表

    Student.java package cn.itcast.hiberate.sh.domain; import java.util.Set; public class Student { priv ...

  4. Atitit. 数据库-----catalog与schema的设计区别以及在实际中使用 获取数据库所有库表 java jdbc php  c#.Net

    Atitit. 数据库-----catalog与schema的设计区别以及在实际中使用 获取数据库所有库表 java jdbc php  c#.Net 1. -catalog与schema的设计区别1 ...

  5. MySQL快速生产表的描述

    # mysql快速生成表的描述 SELECT column_name AS `列名`, CONCAT_WS(' (', data_type, character_maximum_length) AS ...

  6. 用SQLAlchemy创建一对多,多对多关系表

    多对多关系表的创建: 如果建立好多对多关系后,我们就可以通过关系名进行循环查找,比如laowang = Teacher.query.filter(Teacher.name=='laowang').fi ...

  7. Django-website 程序案例系列-7 创建多对多关系表

    创建多对多关系表: 方式一:一共三张表其中有一张中间表需要手工建立(建议使用第一种方式自定制程度高) class Host(models.Model): hostname = models.CharF ...

  8. sql server 语句获取表的描述,主键等等

    sql语句添加表,字段的描述 --添加表的描述 --格式如右:execute sp_addextendedproperty 'MS_Description','字段备注信息','user','dbo' ...

  9. Java描述表达式求值的两种解法:双栈结构和二叉树

    Java描述表达式求值的两种解法:双栈结构和二叉树 原题大意:表达式求值 求一个非负整数四则混合运算且含嵌套括号表达式的值.如: # 输入: 1+2*(6/2)-4 # 输出: 3.0 数据保证: 保 ...

随机推荐

  1. ext:grid分页,列宽度自动填满grid宽度

    var cm = new Ext.grid.ColumnModel([{      header : '编号',      dataIndex : 'id'     }, {      header ...

  2. 关于spring-mvc.xml的mvc:resources元素浅析。

    配置如下: <!-- 配置静态资源 --><mvc:resources location="/static/" mapping="/static/**& ...

  3. Wix使用整理(二)

    1)         安装卸载时进行日志记录 Wix 制作的 Installer 的调试很麻烦,没有直接的 Bug 工具,可以通过记录安装日志的方式进行间接调试.命令为 msiexec /i pack ...

  4. Gulp插件autoprefixer的使用

    1.创建:gulpfile.js //引入插件 var gulp = require('gulp'); var autoprefixer = require('gulp-autoprefixer'); ...

  5. Alert Messager

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  6. Android中各级目录的作用

    Android中各级目录的作用 一.目录结构  src目录---存放源代码文件   gen目录---ADT插件生成的文件,(自动生成) R.java文件  drawable类---给图片生产的ID  ...

  7. Apache+Tomcat负载均衡问题集锦

    之前在windows 环境下搭建了下apache+tomcat负载均衡(不会的能够參考之前的文档,文档对于linux和windows都适用),一帆风顺.没有出现不论什么问题.今天尝试着在linux下搭 ...

  8. hello--GAN

    GAN系列学习(1)——前生今世 DCGAN.WGAN.WGAN-GP.LSGAN.BEGAN原理总结及对比 [Learning Notes]变分自编码器(Variational Auto-Encod ...

  9. SWFUpload 已上传成功数量控制 插件(用于解决队列满问题)

    当我们在使用 SWFUpload 做文件上传时,我们需要把已经上传的文件列表做一个删除, 但在我们把已上传列表删除后,再重新上传时,会发现提示 上传队列满 的问题,原因就是有一个状态对象中的一个 成功 ...

  10. 自用封装javascript函数

    (function(){ var JHRZ_IMG_Arr = JHRZ_IMG_Arr || {}; JHRZ_IMG_Arr.loading = ["/static/images/loa ...