Java:43-JDBC的具体作用

JDBC的具体作用

在以后的开发中我们会建立几个包

在这里插入图片描述

dao:称为数据访问层,存放数据库操作的代码
entity:根据数据表创建的类,即存放实体类的地方,如JavaBean类
JavaBean类只所以最好实现序列化,是因为对于数据传输的类,实现序列化可以有效的保证数据一致性
对于这个实体类,变量名不做要求(有些地方的默认会做要求,如web里的默认指定)
可以忽略大小写,但是最好还是要与表的字段对应,方便观察和维护
因为在查询出数据库的结果时,会根据类的set方法名字来进行操作,注意:基本上数据库与类的交替都是如此,其中在这个基础上,一般也会操作大小写的变化以及一些兜底操作
因为JavaBean类的变量通常都是私有的,不可在其他类里使用,要赋值的话,就需要公有的方法,若表的某个字段为ad
那么若有setAD,其中对于set后面的名字,只要第二个(一般是第一个)单词首字母大写,就可以调用,没有第二个单词的话,则单词大小写忽略,当然这些是特定情况下的,一般情况下,是全部大小写忽略
否则不会调用set方法,因为方法的内容不详,若表字段的名字与set对应名相关,那么就可以判断出,这是设置方法
通常对应变量名也是这个对应名,但单个单词的变量名通常不是,因为有大写
只所以变量名第二个单词要为大写,是为了保证规范,同样也是为了和set对应名一致(规范的一致,一般来说,总体是这样,因为包括set),当然可以不一致,只不过不好维护
若你在set方法里不设置值,那么就没有什么作用,即先判断set名字是否对应,最后执行方法里的内容
底层是这样操作的,操作setAD方法,如反射出所有set并根据set对应的名字来对应表名,若有多个类似的对应名,如AGE和AGe
则按照对应字符编码值大小进行排列,很明显AGE要大,那么就使用setAGE方法
在很多框架那里也是一样的,当然,框架之间由于有在这个基础上,一般也会操作大小写的变化以及一些兜底操作,但是他们基本都是没有抛弃原来的规范,所以这就是为什么我们主要利用java规范的原因,因为这样,就不用担心换个框架,或者改变版本造成的麻烦事情,而正是因为这样,所以关于这方面的细节就不多说了,可能以后会说明,必然之前的new BeanHandler就说明了"一般他们只会操作set,且忽略大小写"
对于两个类,若这两个类是由两个有关联的表组成的,如A表,B表
其中B表的外键是A表的主键,那么就有B表的变量有A表的相关变量,可以若有人要通过B表进行查询对应A表的数据
如通过订单查询订单人的姓名(两个类的情况下),很明显,只设置一个A表的变量是不行的
即B表里除了有A表的对应主键变量外,还要有A表类型的变量,即 A a,用来存放A表信息
对于方法,可以不用返回值,即可以直接调用,不用变量来获得值也可以
对于ID来说,不同的ID是非常有必要的
我们也可以通过时间戳来定义ID,也可以使用UUID来定义ID
/*
UUID是指在一台机器上生成的数字,它保证对在同一时空中的所有机器都是唯一的
UUID由以下几部分的组合:
1.当前日期和时间,UUID的第一个部分与时间有关,如果你在生成一个UUID之后,过几秒又生成一个UUID
则第一个部分不同,其余可能相同
2.时钟序列
3.全局唯一的IEEE机器识别号,如果有网卡,从网卡MAC地址获得,没有网卡以其他方式获得
*/
//获取唯一ID的 方法
    public static String getUUID() {

        return UUID.randomUUID().toString().replace("-", "");
    }
//其中UUID.randomUUID()获取ID,再转化成字符串,然后将其中的"-"替换成""(空)
//那么有个问题,如果一个高并发的本机一直访问UUID会出现得到相同的吗,在不考虑全部排列的情况下(如多个机子或者说本机),基本不会相同,因为内部一般会操作随机,并且可能操作了锁使得保证在没有全部排列的情况下,不会相同
//他之所以会相同,是因为限制,比如,一个数只能生成1到100,那么当你出现到100再次生成时,那么会循环到1,UUID自然也是这样,当然,可能内部会操作扩充上限,但一般不会

在JDBC里尽量不要多表查询,即要单表查询,有助于提高效率
只所以在对应表类中写对应外键变量,是因为可以通过这个外键变量来进行查询对应外键所对应的表
并可以保存,使得后续不用在查,当有新的来临时,是可以覆盖指向的,即更新
若没有这个外键的话,是不知道对应外键的主键ID的,即查不出来

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

对于对应关系,是对于表来说的,若只看从表,那么是可以出现一个外键对于多个数据(一对多),因为外键不是主键,可以相同
形成多条相同数据
一个数据对应不同外键(对于单表来说,这就是为什么表一定要有主键,防止相同数据)
但这对于单表来说,是可行的,所有单表也是一样
而对应关系是对多个表的描述,而由于主键的存在,主表是不可能有多个相同数据,那么就形成了主表的一个对应从表的多个
于是可以理解为对于主表,主表只有单数据,即只能是一,对于从表,可以有相同数据,所有是多
最终理解就是,主键唯一,外键不唯一,外键就是让主键不唯一(相同),从而形成一个对应多个
没有主键只有外键,或者有主键且其他基本都是外键(都变成一个表的外键),就一定是多对多了
需要的三个工具类-------------------------------------
package com.lagou.utils;

import java.text.SimpleDateFormat;
import java.util.Date;

public class DateUtils {

    /**
     * 获取日期对象 格式化后的字符串
     * @return
     */
    public static String getDateFormart(){

        Date date = new Date();

        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

        String format = sdf.format(date);

        return format;
    }
}

package com.lagou.utils;

import com.alibaba.druid.pool.DruidDataSourceFactory;

import javax.sql.DataSource;
import java.io.IOException;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;

public class DruidUtils {

    //1.定义成员变量
    public static DataSource dataSource;

    //2.静态代码块
    static{
        try {
            //3.创建属性集对象
            Properties p = new Properties();

            //4.加载配置文件 Druid 连接池不能够主动加载配置文件 ,需要指定文件
            InputStream inputStream = 
                DruidUtils.class.getClassLoader().getResourceAsStream("druid.properties");

            //5. 使用Properties对象的 load方法 从字节流中读取配置信息
            p.load(inputStream);

            //6. 通过工厂类获取连接池对象
            dataSource = DruidDataSourceFactory.createDataSource(p);

        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    //获取连接的方法
    public static Connection getConnection(){

        try {

            return dataSource.getConnection();

        } catch (SQLException e) {
            e.printStackTrace();
            return null;
        }
    }

    //获取Druid连接池对象的方法
    public static DataSource getDataSource(){
        return dataSource;
    }


    //释放资源
    public static void close(Connection con, Statement statement){

        if(con != null && statement != null){
            try {
                statement.close();
                //归还连接
                con.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }

    }

    public static void close(Connection con, Statement statement, ResultSet resultSet){

        if(con != null && statement != null && resultSet != null){
            try {
                resultSet.close();
                statement.close();
                //归还连接
                con.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }

    }

}

package com.lagou.utils;

import java.util.UUID;

/**
 * UUID是指在一台机器上生成的数字,它保证对在同一时空中的所有机器都是唯一的。
 *
 * UUID由以下几部分的组合:
 *  1.当前日期和时间,UUID的第一个部分与时间有关,如果你在生成一个UUID之后,过几秒又生成一个UUID
 则第一个部分不同,其余相同。
 *  2.时钟序列。
 *  3.全局唯一的IEEE机器识别号,如果有网卡,从网卡MAC地址获得,没有网卡以其他方式获得。
 *
 */
public class UUIDUtils {

    //获取唯一ID的 方法
    public static String getUUID() {

        return UUID.randomUUID().toString().replace("-", "");
    }

    public static void main(String[] args) {

    }

}

实体类--------------------------------
package com.lagou.entity;

/**
 * 分类表对应的 Java类
 *
 * */
public class Category {

    private String cid;

    private String cname;

    public String getCid() {
        return cid;
    }

    public void setCid(String cid) {
        this.cid = cid;
    }

    public String getCname() {
        return cname;
    }

    public void setCname(String cname) {
        this.cname = cname;
    }

    @Override
    public String toString() {
        return "Category{" +
                "cid='" + cid + '\'' +
                ", cname='" + cname + '\'' +
                '}';
    }
}

package com.lagou.entity;

/**
 *  `itemid` VARCHAR(32) NOT NULL,
 *   `pid` VARCHAR(32) DEFAULT NULL,
 *   `oid` VARCHAR(32) DEFAULT NULL,
 *   订单项表 表示的是 一个订单中所有的商品的信息的
 * */
public class OrderItem {

    private String itemid; //订单项ID

    private String pid; //外键 指向了商品表的主键

    private String oid; //外键 指向了订单表的主键

    private Product product; //订单项中商品的详细信息

    private Orders orders; //订单项所属的 订单的详细信息

    public String getItemid() {
        return itemid;
    }

    public void setItemid(String itemid) {
        this.itemid = itemid;
    }

    public String getPid() {
        return pid;
    }

    public void setPid(String pid) {
        this.pid = pid;
    }

    public String getOid() {
        return oid;
    }

    public void setOid(String oid) {
        this.oid = oid;
    }

    public Product getProduct() {
        return product;
    }

    public void setProduct(Product product) {
        this.product = product;
    }

    public Orders getOrders() {
        return orders;
    }

    public void setOrders(Orders orders) {
        this.orders = orders;
    }

    @Override
    public String toString() {
        return "OrderItem{" +
                "itemid='" + itemid + '\'' +
                ", pid='" + pid + '\'' +
                ", oid='" + oid + '\'' +
                '}';
    }
}

package com.lagou.entity;

import java.util.ArrayList;
import java.util.List;

/**
 *  orders表
 *   `oid` VARCHAR(32) NOT NULL,
 *   `ordertime` DATETIME DEFAULT NULL,
 *   `total` DOUBLE DEFAULT NULL,
 *   `name` VARCHAR(20) DEFAULT NULL,
 *   `telephone` VARCHAR(20) DEFAULT NULL,
 *   `address` VARCHAR(30) DEFAULT NULL,
 *   `state` INT(11) DEFAULT NULL,
 *   `uid` VARCHAR(32) DEFAULT NULL,
 *
 * */
public class Orders {

    private String oid; //订单ID

    private String ordertime; //下单的时间

    private double total; //订单的总金额

    private String name; //收货人的姓名

    private String telephone; //收货人电话

    private String address; //收货人的地址

    private int state; //订单状态 1 代表已支付, 0 代表未支付

    //外键 uid
    private String uid;

    //保存订单对应的 用户的详细信息
    private User user;

    //描述 多对一关系 一个订单中 包含了多个订单项信息
    List<OrderItem> list = new ArrayList<>();

    public String getOid() {
        return oid;
    }

    public void setOid(String oid) {
        this.oid = oid;
    }

    public String getOrdertime() {
        return ordertime;
    }

    public void setOrdertime(String ordertime) {
        this.ordertime = ordertime;
    }

    public double getTotal() {
        return total;
    }

    public void setTotal(double total) {
        this.total = total;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getTelephone() {
        return telephone;
    }

    public void setTelephone(String telephone) {
        this.telephone = telephone;
    }

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }

    public int getState() {
        return state;
    }

    public void setState(int state) {
        this.state = state;
    }

    public String getUid() {
        return uid;
    }

    public void setUid(String uid) {
        this.uid = uid;
    }

    public User getUser() {
        return user;
    }

    public void setUser(User user) {
        this.user = user;
    }

    @Override
    public String toString() {
        return "Orders{" +
                "oid='" + oid + '\'' +
                ", ordertime='" + ordertime + '\'' +
                ", total=" + total +
                ", name='" + name + '\'' +
                ", telephone='" + telephone + '\'' +
                ", address='" + address + '\'' +
                ", state=" + state +
                ", uid='" + uid + '\'' +
                '}';
    }
}

package com.lagou.entity;

/**
 *   product表
 *   `pid` VARCHAR(32) NOT NULL,
 *   `pname` VARCHAR(50) DEFAULT NULL,
 *   `price` DOUBLE DEFAULT NULL,
 *   `pdesc` VARCHAR(255) DEFAULT NULL,
 *   `pflag` INT(11) DEFAULT NULL,
 *   `cid` VARCHAR(32) DEFAULT NULL,
 *
 * */
public class Product {

    private String pid;

    private String pname;

    private double price;

    private String pdesc;

    private int pflag; //是否上架 1 上架, 0 下架

    //外键
    private String cid;

    private Category category; //保存分类的详细信息

    public Category getCategory() {
        return category;
    }

    public void setCategory(Category category) {
        this.category = category;
    }

    public String getPid() {
        return pid;
    }

    public void setPid(String pid) {
        this.pid = pid;
    }

    public String getPname() {
        return pname;
    }

    public void setPname(String pname) {
        this.pname = pname;
    }

    public double getPrice() {
        return price;
    }

    public void setPrice(double price) {
        this.price = price;
    }

    public String getPdesc() {
        return pdesc;
    }

    public void setPdesc(String pdesc) {
        this.pdesc = pdesc;
    }

    public int getPflag() {
        return pflag;
    }

    public void setPflag(int pflag) {
        this.pflag = pflag;
    }

    public String getCid() {
        return cid;
    }

    public void setCid(String cid) {
        this.cid = cid;
    }

    @Override
    public String toString() {
        return "Product{" +
                "pid='" + pid + '\'' +
                ", pname='" + pname + '\'' +
                ", price=" + price +
                ", pdesc='" + pdesc + '\'' +
                ", pflag=" + pflag +
                ", cid='" + cid + '\'' +
                '}';
    }
}

package com.lagou.entity;

/**
 *   User 表
 *   `uid` VARCHAR(32) NOT NULL,
 *   `username` VARCHAR(20) DEFAULT NULL,
 *   `password` VARCHAR(20) DEFAULT NULL,
 *   `telephone` VARCHAR(20) DEFAULT NULL,
 *   `birthday` DATE DEFAULT NULL,
 *   `sex` VARCHAR(10) DEFAULT NULL,
 * */
public class User{

    private String uid;

    private String username;

    private String password;

    private String telephone;

    private String birthday;

    private String sex;

    public String getUid() {
        return uid;
    }

    public void setUid(String uid) {
        this.uid = uid;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public String getTelephone() {
        return telephone;
    }

    public void setTelephone(String telephone) {
        this.telephone = telephone;
    }

    public String getBirthday() {
        return birthday;
    }

    public void setBirthday(String birthday) {
        this.birthday = birthday;
    }

    public String getSex() {
        return sex;
    }

    public void setSex(String sex) {
        this.sex = sex;
    }

    @Override
    public String toString() {
        return "User{" +
                "uid='" + uid + '\'' +
                ", username='" + username + '\'' +
                ", password='" + password + '\'' +
                ", telephone='" + telephone + '\'' +
                ", birthday='" + birthday + '\'' +
                ", sex='" + sex + '\'' +
                '}';
    }
}

数据库操作的类-----------------------
package com.lagou.dao;

import com.lagou.entity.OrderItem;
import com.lagou.entity.Orders;
import com.lagou.entity.Product;
import com.lagou.utils.DruidUtils;
import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.BeanListHandler;
import org.junit.Test;

import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

public class OrdersDao {

    //需求1: 获取 uid为 001 的用户的所有订单信息
    public List<Orders>  findAllOrders(String uid) throws SQLException {

        QueryRunner qr = new QueryRunner(DruidUtils.getDataSource());

        String sql = "select * from orders where uid = ?";

        //一个用户所有的订单信息
        List<Orders> ordersList = qr.query(sql, new BeanListHandler<Orders>(Orders.class), uid);

        return ordersList;
    }

    //需求2: 获取订单编号为 order001的订单中的所有商品信息
    public List<Product> findOrderById(String oid) throws SQLException {

        QueryRunner qr = new QueryRunner(DruidUtils.getDataSource());

        //1.查询订单项表 获取订单项表中 订单ID为order001的数据
        String sql = "SELECT pid FROM orderitem WHERE oid = ? ";

        //2.查询的结果是 多条订单项数据
        List<OrderItem> list = qr.query(sql, new BeanListHandler<OrderItem>(OrderItem.class), oid);

        //3.创建集合保存商品信息
        List<Product> productList = new ArrayList<>();

        ProductDao productDao = new ProductDao();

        //4.遍历订单项集合 获取Pid
        for (OrderItem orderItem : list) {

            //4.1从orderitem中获取 pid
            String pid = orderItem.getPid();

            //4.2 调用productDao
            Product product = productDao.findProductById(pid);

            //4.3 保存到集合
            productList.add(product);
        }

        //返回 订单中对应的商品信息
        return productList;
    }


}


package com.lagou.dao;

import com.lagou.entity.Category;
import com.lagou.entity.Product;
import com.lagou.utils.DruidUtils;
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 javax.management.Query;
import java.sql.SQLException;
import java.util.List;

public class ProductDao {

    //需求1: 根据商品ID 获取商品名称 ,商品价格 以及商品所属分类的名称
    public Product findProductById(String pid) throws SQLException {

        //1.创建QueryRunner
        QueryRunner qr = new QueryRunner(DruidUtils.getDataSource());

        //2.编写SQL
        String sql = "select * from product where pid = ?";

        //3.执行查询
        Product product = qr.query(sql, new BeanHandler<Product>(Product.class), pid);

        //4.获取外键的值 对应分类的ID
        String cid = product.getCid();

        //商品对应的 分类信息
        Category category = findCategoryById(cid);
        product.setCategory(category);

        return product;
        //有分类的信息了,一个查询所有信息都有,而不用分开查询了
    }

    //根据分类ID 查询分类的详细信息
    public Category findCategoryById(String cid) throws SQLException {

        QueryRunner qr = new QueryRunner(DruidUtils.getDataSource());

        String sql = "select * from category where cid = ?";

        Category category = qr.query(sql, new BeanHandler<Category>(Category.class), cid);

        return category;
    }


    //需求3: 查询指定分类ID 下的商品个数
    public int getCount(String cid) throws SQLException {

        QueryRunner qr = new QueryRunner(DruidUtils.getDataSource());

        String sql = "select count(*) from product where cid = ?";

        //获取单列数据 使用 ScalarHandler 来封装
        Long count = qr.query(sql, new ScalarHandler<>(), cid);

        //将Long类型包装类 转换为int类型 并返回
        return count.intValue();
    }

    //需求4: 查询指定分类ID 下的所有商品信息
    public List<Product> findProductByCid(String cid) throws SQLException {

        QueryRunner qr = new QueryRunner(DruidUtils.getDataSource());

        String sql = "select * from product where cid = ?";

        // 查询结果是一个 list集合, 使用 BeanListHandler来封装
        List<Product> list = qr.query(sql, new BeanListHandler<Product>(Product.class), cid);

        return list;
    }

}

package com.lagou.dao;

import com.lagou.entity.User;
import com.lagou.utils.DruidUtils;
import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.BeanHandler;

import java.sql.SQLException;

public class UserDao {

    //需求一: 编写一个注册用户的方法,接收的参数是一个User对象
    public int register(User user) throws SQLException {

        //1.获取QueryRunner对象
        QueryRunner qr = new QueryRunner(DruidUtils.dataSource);

        //2.编写SQL
        String sql = "insert into user values(?,?,?,?,?,?)";

        Object[] param = {user.getUid(),user.getUsername(),user.getPassword(),user.getTelephone()
        ,user.getBirthday(),user.getSex()};

        //3.执行插入操作
        int update = qr.update(sql, param);

        return update;
    }

    //需求二: 编写一个 用户登录的方法,接收的参数是 用户名 和密码, 返回值是User对象
    public User login(String username,String password) throws SQLException {

        //1.获取QueryRunner对象
        QueryRunner qr = new QueryRunner(DruidUtils.dataSource);

        //2.编写SQL
        String sql = "select * from user where username = ? and password = ?";

        //3.执行查询 使用BeanHandler来封装结果集, 获取结果集中的第一条数据
        User user = qr.query(sql, new BeanHandler<User>(User.class), username, password);


        return user;
    }

}

测试类--------------------------
package com.lagou.app;

import com.lagou.dao.OrdersDao;
import com.lagou.entity.Orders;
import com.lagou.entity.Product;
import org.junit.Test;

import java.sql.SQLException;
import java.util.List;

public class TestOrdersDao {

    OrdersDao ordersDao = new OrdersDao();

    @Test
    public void testFindAllOrders() throws SQLException {

        List<Orders> allOrders = ordersDao.findAllOrders("001");

        for (Orders orders : allOrders) {
            System.out.println(orders);
        }

    }

    //测试 获取订单编号为 order001的订单中的所有商品信息
    @Test
    public void testFindOrderById() throws SQLException {

        List<Product> order001 = ordersDao.findOrderById("order001");

        for (Product product : order001) {
            System.out.println(product);
        }
    }



}

package com.lagou.app;

import com.lagou.dao.ProductDao;
import com.lagou.entity.Product;
import org.junit.Test;

import java.sql.SQLException;
import java.util.List;

public class TestProductDao {

    ProductDao productDao = new ProductDao();

    //测试 根据商品ID 获取商品名称 ,商品价格 以及商品所属分类的名称
    @Test
    public void testFindProductById() throws SQLException {

        //1.调用方法获取 商品对象
        Product product = productDao.findProductById("1");

        //2.打印信息
        System.out.println(product.getPname() +"  " + product.getPrice() + "  " +
               product.getCategory().getCname() );
    }

    //测试 查询指定分类ID 下的商品个数
    @Test
    public void testgetCount() throws SQLException {

        //查询分类ID为 3的分类小 有几个商品
        int count = productDao.getCount("3");


        System.out.println("分类ID为3的商品个数是: " + count);
    }

    //测试 查询指定分类ID 下的所有商品信息
    @Test
    public void testfindProductByCid() throws SQLException {

        //查询 类ID为 2 的所有商品信息
        List<Product> list = productDao.findProductByCid("2");

        for (Product product : list) {
            System.out.println(product);
        }
    }


}

package com.lagou.app;

import com.lagou.dao.UserDao;
import com.lagou.entity.User;
import com.lagou.utils.DateUtils;
import com.lagou.utils.UUIDUtils;
import org.junit.Test;

import java.sql.SQLException;

public class TestUserDao {

    UserDao userDao = new UserDao();

    //测试 注册用户
    @Test
    public void testRegister() throws SQLException {

        //1.创建User
        User user = new User();
        user.setUid(UUIDUtils.getUUID());
        user.setUsername("武松");
        user.setPassword("123456");
        user.setTelephone("13512341234");
        user.setSex("男");
        user.setBirthday(DateUtils.getDateFormart());

        //2.执行注册
        int register = userDao.register(user);

        if(register > 0){

            System.out.println("注册成功! 欢迎您: " + user.getUsername());
        }else{

            System.out.println("注册失败!!");
        }
    }

    //2.测试 用户登录
    @Test
    public void testLogin() throws SQLException {

        //1.调用UserDao的login方法 传入用户名和密码
        User user = userDao.login("大郎", "123456");

        //2.判断user是否为空
        if(user != null){

            System.out.println("欢迎您! " + user.getUsername());
        }else{

            System.out.println("用户名或者密码错误!登录失败!");
        }

    }


}

以上就是JDBC的基本操作,与一些细节,以及外键变量在实体类中的作用,使得一个ID,可以查询两个表数据
若没有外键变量的话,就需要找到对应表的主键,而找是需要看表的,则会很麻烦,而有外键变量
不止可以获得对应表主键,而且可以通过这个主键,直接查询表,并可以放在当前实体类设置的表变量里
使得,一个ID查询两个表,即单独一个外键变量,虽然可以查询到表,但是用对应外键ID的实体类变量的话
可以只用一个方法就可以获得两个表信息了(该一个方法里也有一个方法,方法里的方法也可以直接使用)
否则需要两个方法(但方法里没有方法)
虽然没什么差别,但是在主程序里(主程序里尽量用少的代码,都方法里面)
会使得代码变少,好维护(因为方法就是为你工作的)
否则的话,主程序会有很多方法(不封装的话,主程序方法变多),虽然效果一样,但不好维护,即追求更好的一个方法
类与表的联系:相当于一个对应主键对应一个查询
对于类的类型变量,放在多的一方,就查询归属,一定是一条
放在一的一方,查询的是多少这样的归属,即通常是多条,且由集合保存
注意:对于数据库的包dao,实际上就是对语句的操作,当有非常麻烦的操作时,不妨先将语句写出来,再根据语句来写代码
最后在写代码时,先分析数据库(要有数据),再写对应的实体类,然后写功能
实际上在开发中,约束最好不要设置,你只要知道他要什么值就可,否则的话,会约束你的操作,复杂度会变高,效率会变
一对一要加的外键需要唯一约束才可,否则就变成多(相同的一方,主表在从表的外键)对一(不同的一方)了
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值