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
public static String getUUID() {
return UUID.randomUUID().toString().replace("-", "");
}
在JDBC里尽量不要多表查询,即要单表查询,有助于提高效率
只所以在对应表类中写对应外键变量,是因为可以通过这个外键变量来进行查询对应外键所对应的表
并可以保存,使得后续不用在查,当有新的来临时,是可以覆盖指向的,即更新
若没有这个外键的话,是不知道对应外键的主键ID的,即查不出来
对于对应关系,是对于表来说的,若只看从表,那么是可以出现一个外键对于多个数据(一对多),因为外键不是主键,可以相同
形成多条相同数据
一个数据对应不同外键(对于单表来说,这就是为什么表一定要有主键,防止相同数据)
但这对于单表来说,是可行的,所有单表也是一样
而对应关系是对多个表的描述,而由于主键的存在,主表是不可能有多个相同数据,那么就形成了主表的一个对应从表的多个
于是可以理解为对于主表,主表只有单数据,即只能是一,对于从表,可以有相同数据,所有是多
最终理解就是,主键唯一,外键不唯一,外键就是让主键不唯一(相同),从而形成一个对应多个
没有主键只有外键,或者有主键且其他基本都是外键(都变成一个表的外键),就一定是多对多了
需要的三个工具类-------------------------------------
package com.lagou.utils;
import java.text.SimpleDateFormat;
import java.util.Date;
public class DateUtils {
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 {
public static DataSource dataSource;
static{
try {
Properties p = new Properties();
InputStream inputStream =
DruidUtils.class.getClassLoader().getResourceAsStream("druid.properties");
p.load(inputStream);
dataSource = DruidDataSourceFactory.createDataSource(p);
} catch (Exception e) {
e.printStackTrace();
}
}
public static Connection getConnection(){
try {
return dataSource.getConnection();
} catch (SQLException e) {
e.printStackTrace();
return null;
}
}
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;
public class UUIDUtils {
public static String getUUID() {
return UUID.randomUUID().toString().replace("-", "");
}
public static void main(String[] args) {
}
}
实体类--------------------------------
package com.lagou.entity;
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;
public class OrderItem {
private String itemid;
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;
public class Orders {
private String oid;
private String ordertime;
private double total;
private String name;
private String telephone;
private String address;
private int state;
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;
public class Product {
private String pid;
private String pname;
private double price;
private String pdesc;
private int pflag;
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;
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 {
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;
}
public List<Product> findOrderById(String oid) throws SQLException {
QueryRunner qr = new QueryRunner(DruidUtils.getDataSource());
String sql = "SELECT pid FROM orderitem WHERE oid = ? ";
List<OrderItem> list = qr.query(sql, new BeanListHandler<OrderItem>(OrderItem.class), oid);
List<Product> productList = new ArrayList<>();
ProductDao productDao = new ProductDao();
for (OrderItem orderItem : list) {
String pid = orderItem.getPid();
Product product = productDao.findProductById(pid);
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 {
public Product findProductById(String pid) throws SQLException {
QueryRunner qr = new QueryRunner(DruidUtils.getDataSource());
String sql = "select * from product where pid = ?";
Product product = qr.query(sql, new BeanHandler<Product>(Product.class), pid);
String cid = product.getCid();
Category category = findCategoryById(cid);
product.setCategory(category);
return product;
}
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;
}
public int getCount(String cid) throws SQLException {
QueryRunner qr = new QueryRunner(DruidUtils.getDataSource());
String sql = "select count(*) from product where cid = ?";
Long count = qr.query(sql, new ScalarHandler<>(), cid);
return count.intValue();
}
public List<Product> findProductByCid(String cid) throws SQLException {
QueryRunner qr = new QueryRunner(DruidUtils.getDataSource());
String sql = "select * from product where cid = ?";
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 {
public int register(User user) throws SQLException {
QueryRunner qr = new QueryRunner(DruidUtils.dataSource);
String sql = "insert into user values(?,?,?,?,?,?)";
Object[] param = {user.getUid(),user.getUsername(),user.getPassword(),user.getTelephone()
,user.getBirthday(),user.getSex()};
int update = qr.update(sql, param);
return update;
}
public User login(String username,String password) throws SQLException {
QueryRunner qr = new QueryRunner(DruidUtils.dataSource);
String sql = "select * from user where username = ? and password = ?";
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);
}
}
@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();
@Test
public void testFindProductById() throws SQLException {
Product product = productDao.findProductById("1");
System.out.println(product.getPname() +" " + product.getPrice() + " " +
product.getCategory().getCname() );
}
@Test
public void testgetCount() throws SQLException {
int count = productDao.getCount("3");
System.out.println("分类ID为3的商品个数是: " + count);
}
@Test
public void testfindProductByCid() throws SQLException {
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 {
User user = new User();
user.setUid(UUIDUtils.getUUID());
user.setUsername("武松");
user.setPassword("123456");
user.setTelephone("13512341234");
user.setSex("男");
user.setBirthday(DateUtils.getDateFormart());
int register = userDao.register(user);
if(register > 0){
System.out.println("注册成功! 欢迎您: " + user.getUsername());
}else{
System.out.println("注册失败!!");
}
}
@Test
public void testLogin() throws SQLException {
User user = userDao.login("大郎", "123456");
if(user != null){
System.out.println("欢迎您! " + user.getUsername());
}else{
System.out.println("用户名或者密码错误!登录失败!");
}
}
}
以上就是JDBC的基本操作,与一些细节,以及外键变量在实体类中的作用,使得一个ID,可以查询两个表数据
若没有外键变量的话,就需要找到对应表的主键,而找是需要看表的,则会很麻烦,而有外键变量
不止可以获得对应表主键,而且可以通过这个主键,直接查询表,并可以放在当前实体类设置的表变量里
使得,一个ID查询两个表,即单独一个外键变量,虽然可以查询到表,但是用对应外键ID的实体类变量的话
可以只用一个方法就可以获得两个表信息了(该一个方法里也有一个方法,方法里的方法也可以直接使用)
否则需要两个方法(但方法里没有方法)
虽然没什么差别,但是在主程序里(主程序里尽量用少的代码,都方法里面)
会使得代码变少,好维护(因为方法就是为你工作的)
否则的话,主程序会有很多方法(不封装的话,主程序方法变多),虽然效果一样,但不好维护,即追求更好的一个方法
类与表的联系:相当于一个对应主键对应一个查询
对于类的类型变量,放在多的一方,就查询归属,一定是一条
放在一的一方,查询的是多少这样的归属,即通常是多条,且由集合保存
注意:对于数据库的包dao,实际上就是对语句的操作,当有非常麻烦的操作时,不妨先将语句写出来,再根据语句来写代码
最后在写代码时,先分析数据库(要有数据),再写对应的实体类,然后写功能
实际上在开发中,约束最好不要设置,你只要知道他要什么值就可,否则的话,会约束你的操作,复杂度会变高,效率会变
一对一要加的外键需要唯一约束才可,否则就变成多(相同的一方,主表在从表的外键)对一(不同的一方)了