级联查询

一对一

步骤: 导mysql 的 jar包,及工具类
自己创建连接数据库的工具类 DBTools
通过面向接口设计程序的方式来编程

SQL创建表

  1. 创建学生表
    create table student(
    sid int primary key auto_increment,
    stuName varchar(22),
    address varchar(22));
  2. 创建信息表
    create table info(
    id int primary key auto_increment,
    code varcahr(22),
    address varchar(22),
    sid int,
    foreign key(sid) references student(sid));
    表之间的关系是 一对一。
    在这里插入图片描述

创建实体并映射

  1. 并非通过在实体中添加不属于本实体的属性来映射的 只是为了方便通过本实体通过 访问器的方式去访问主表。 创建实体是直接代码表示,且从表中有外键。
  2. toString()只是打印本类的属性和方法 不能添加 非本类的属性 及使用toString要在映射之前。
  3. 每次映射后 ,及 Info表中添加private Student student;属性和改访问器 这是通过从表查询主表的时候用的 若不考虑逻辑;通过学生查询他的身份证,则需要返回的类型是Student 在通过访问器的方式返回 info实体。
  4. 映射在从表和主表都可以,取决于
    通过主表找从表 映射在主表
    通过从表找主表 映射在从表
  5. 面向接口编程的思想
    一. 实体表
 package www.oracle.vo;

public class Student {
   
	private Integer sid;
	private String stuName;
	private String password;
	private Info info;
	
	public Info getInfo() {
   
		return info;
	}
	public void setInfo(Info info) {
   
		this.info = info;
	}
	public Integer getSid() {
   
		return sid;
	}
	public void setSid(Integer sid) {
   
		this.sid = sid;
	}
	public String getStuName() {
   
		return stuName;
	}
	public void setStuName(String stuName) {
   
		this.stuName = stuName;
	}
	public String getPassword() {
   
		return password;
	}
	public void setPassword(String password) {
   
		this.password = password;
	}
	@Override
	public String toString() {
   
		return "Student [sid=" + sid + ", stuName=" + stuName + ", password=" + password + "]";
	}
	
	

}

package www.oracle.vo;

public class Info {
   
	private Integer id;
	private String code;
	private String address;
	private Integer sid;
	private Student studnet;
	
	public Student getStudnet() {
   
		return studnet;
	}
	public void setStudnet(Student studnet) {
   
		this.studnet = studnet;
	}
	public Integer getId() {
   
		return id;
	}
	public void setId(Integer id) {
   
		this.id = id;
	}
	public String getCode() {
   
		return code;
	}
	public void setCode(String code) {
   
		this.code = code;
	}
	public String getAddress() {
   
		return address;
	}
	public void setAddress(String address) {
   
		this.address = address;
	}
	public Integer getSid() {
   
		return sid;
	}
	public void setSid(Integer sid) {
   
		this.sid = sid;
	}
	@Override
	public String toString() {
   
		return "Info [id=" + id + ", code=" + code + ", address=" + address + ", sid=" + sid + "]";
	}
	
	

}

二.接口

package www.util.dao;

import www.oracle.vo.Info;

public interface InfoDao {
   
	public Info getStudentByInfoCode(String code) throws Exception;

}

三.接口的实现类

package www.util.daoImpl;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import www.oracle.util.DBTools;
import www.oracle.vo.Info;
import www.oracle.vo.Student;
import www.util.dao.InfoDao;
// 建立级联查询 一对一  是通过一个类中包含一个私有类, 通过从表(或主表)查询主表(从表),返回值类型是从表(主表)的类型;从表的类型在创建对象获得他的属性 主表 及  info.getStudent() 来获取主表的对象
									//  通过 主表查询从表,返回的类型是主表的类型;在通过返回的对象来获得从表的属
        //-----重要:级联查询是通过 俩实体表中互相映射来模拟外键的
      /*1. 通过 Info 查询  Student    返回一个Info实体;在 Info a=new Info();  a.getStudent()  获取Stduent实体
       *2. 通过 Student 查询 Info    返回一个 Student实体  在 Student a=new Student();    a.getInfo();的方式获取 Info实体
       * 
       * */
public class InfoDaoImpl implements InfoDao  {
   

	@Override
	public Info getStudentByInfoCode(String code) throws Exception {
   
		// TODO Auto-generated method stub
		String sql="select * from info i inner join student s on i.sid=s.sid where i.`code` = ?";
		
		Connection conn= DBTools.getConnection();
		
		PreparedStatement ps= conn.prepareStatement(sql);
		
		ps.setString(1, code);
		ResultSet  rs=ps.executeQuery();
		Info info=null;
		Student student=null;
		while(rs.next()) {
   
			info =new Info();
			student= new Student();
			info.setAddress(rs.getString("address"));
			info.
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值