一对一
步骤: 导mysql 的 jar包,及工具类
自己创建连接数据库的工具类 DBTools
通过面向接口设计程序的方式来编程
SQL创建表
- 创建学生表
create table student(
sid int primary key auto_increment,
stuName varchar(22),
address varchar(22)); - 创建信息表
create table info(
id int primary key auto_increment,
code
varcahr(22),
address varchar(22),
sid int,
foreign key(sid) references student(sid));
表之间的关系是 一对一。
创建实体并映射
- 并非通过在实体中添加不属于本实体的属性来映射的 只是为了方便通过本实体通过 访问器的方式去访问主表。 创建实体是直接代码表示,且从表中有外键。
- toString()只是打印本类的属性和方法 不能添加 非本类的属性 及使用toString要在映射之前。
- 每次映射后 ,及 Info表中添加private Student student;属性和改访问器 这是通过从表查询主表的时候用的 若不考虑逻辑;通过学生查询他的身份证,则需要返回的类型是Student 在通过访问器的方式返回 info实体。
- 映射在从表和主表都可以,取决于
通过主表找从表 映射在主表
通过从表找主表 映射在从表 - 面向接口编程的思想
一. 实体表
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.setCode