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

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. python输出字符串,UnicodeEncodeError: 'ascii' codec can't encode characters in position问题

    2017-06-28更新:换到python3.x中,编码问题减少了很多.这篇博文不适用于python3.x http://blog.sina.com.cn/s/blog_64a3795a01018vy ...

  2. hihocoder1489 Legendary Items (微软2017年预科生计划在线编程笔试)

    http://hihocoder.com/problemset/problem/1489 笔试题第一道,虽然说第一道都很水,但是我感觉这题不算特别水把..这道题我就卡住了我记得,tle,最后只有30分 ...

  3. windows server 2008 r2, 每隔一段时间自动关机

      前段时间在做Exchange 2010测试的时候,由于windows server 2008  r2试用过期,开机后二个小时就会自动关机,可是我又不想重装系统,加为那样我可能需要重装好多东西,包括 ...

  4. C#如何用OpenFileDialog控件打开图片显示到PictureBox这个控件

    openFileDialog1.Filter = "图片文件|*.jpg|BMP图片|*.bmp|Gif图片|*.gif"; OpenFileDialog ofd = new Op ...

  5. Linux下路由表调试工具traceroute

    在做静态路由表或者路由表分配时,比较直接的调试工具是traceroute,可以跟踪访问一个IP所到达的路由层级,从而知道经过哪些链路. 参考: http://man.linuxde.net/trace ...

  6. Extjs window组件 拖动统制

    Extjs window组件 拖动控制有时候一拖就拖出了浏览器,在想拖回来就不好办了: 解决办法:参考以下代码,在加载Ext核心库以后执行: Ext.override(Ext.Window, {    ...

  7. 下载Ubuntn 17.04 内核源代码

    zengkefu@server1:/usr/src$ uname -aLinux server1 4.10.0-19-generic #21-Ubuntu SMP Thu Apr 6 17:04:57 ...

  8. jdk8十大特性并代码demo(转)

    一.十大特性 1.Lambda表达式 2.Stream函数式操作流元素集合 3.接口新增:默认方法与静态方法 4.方法引用,与Lambda表达式联合使用 5.引入重复注解 6.类型注解 7.最新的Da ...

  9. Java隐藏手机号中间四位,隐藏身份证中间数字

    原文:https://blog.csdn.net/yuanquanl/article/details/53519577 public static void main(String[] args) { ...

  10. MySql_SQLyog+SQL Assistant实现智能提示

    相信用过sqlserver+SQL Assistant的同学都知道其智能提示多么方便,但是转到mysql后,无论是使用navicat还是webbench都无法实现较好的智能提示效果, 最终在网上找到使 ...