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

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. Internationalization composition diagram

    watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdHJvdWJsZXNob290ZXI=/font/5a6L5L2T/fontsize/400/fill/I0 ...

  2. Using TXMLDocument, Working with XML Nodes

    Using TXMLDocument The starting point for working with an XML document is the Xml.XMLDoc.TXMLDocumen ...

  3. Delphi XE 4,Rad Studio XE 4 官方下载,更新Update 1(附破解)

    http://blog.csdn.net/maxwoods/article/details/8842889 XE4 Update1 下载: http://altd.embarcadero.com/do ...

  4. 【转】2012年6月26 – 盛大PHP工程师最新面试题

    无笔试. 口试:(前半部分平淡无奇,没什么太难的问题,都是求职岗位基本要会的东西,局限于php.下面是真正进入状态的题.) 谈谈观察者模式是什么?主要应用. 答:类似会有一些server对象时刻侦听某 ...

  5. Valera and Fruits

    B. Valera and Fruits time limit per test 1 second memory limit per test 256 megabytes input standard ...

  6. SpringMVC整合fastjson、easyui 乱码问题

    一.框架版本 SpringMVC:3.1.1.RELEASE fastjson:1.2.7 easyui :1.4.5 二.乱码现象    Action中使用@ResponseBody返回Json数据 ...

  7. Mysql 会导致锁表的语法

    最近再找一些Mysql锁表原因,整理出来一部分sql语句会锁表的,方便查阅,整理的不是很全,都是工作中碰到的,会持续更新 笔者能力有限,如果有不正确的,或者不到位的地方,还请大家指出来,方便你我,方便 ...

  8. maven编译错误,警告: BASE64Decoder是内部专用 API, 可能会在未来发行版中删除

    修改红色部分版本号为2.3.2              <plugin>                 <groupId>org.apache.maven.plugins& ...

  9. myeclipse8.6首次运行maven项目的问题解决

    myeclipse8.6导入maven项目后识别为普通java项目,即项目图标上没有小M的标识.这时是无法直接运行的. 解决方法:1,打开Window --> perferences,找到mye ...

  10. mac 查看cpu个数

    mac 查看cpu个数   同是unix系统的mac,如何查看cpu个数及其相关信息呢?