周三Wednesday
JDBC(Java DataBase Connectivity,java数据库连接)是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,它由一组用Java语言编写的类和接口组成。JDBC提供了一种基准,据此可以构建更高级的工具和接口,使数据库开发人员能够编写数据库应用程序。(JDBC是什么?)
API,全称Application Programming Interface,即应用程序编程接口。
API是一些预先定义函数,目的是用来提供应用程序与开发人员基于某软件或者某硬件得以访问一组例程的能力,并且无需访问源码或无需理解内部工作机制细节。
API就是操作系统给应用程序的调用接口,应用程序通过调用操作系统的 API而使操作系统去执行应用程序的命令(动作)。在 Windows 中,系统API是以函数调用的方式提供的。
SDA和API:可以认为API是包含在SDK中的:SDK是一系列文件的组合,包括lib、dll、.h、文档、示例等;API是对程序而言的,提供用户编程时的接口,即一系列模块化的类和函数。
API与GUI:两者都属于直接用户接口,不同的是API接口属于一种操作系统或程序接口,但是GUI接口属于一种图形操作系统。
JDBC_Chapter03_20191009课堂内容
笔记 - - - - - -- - -- -- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
1.JDBC: Java连接数据库的一门技术;
2.使用JDBC连接数据库的步骤
一 、加载驱动(Driver:数据库厂商提供,作用区分管理不同的数据库标识)
二 、使用DriverManager连接数据库(DriverManager:管理连接不同的数据库驱动)
三 、创建PreparedStatement对象,建立数据库连接通道,传输执行sql语句
四、获取数据库返回的ResultSet结果集
五、释放资源
PS: lib:专门存放jar包
1.DAO模式组成部分:
程序 ----> 数据库
实体类 数据库中的表
工具类:公共的数据库连接、关闭、公共的增删改、查询
接口 : 程序提倡的是面向接口编程,从而降低程序的耦合性
实现类 : 通过不同的需求实现不同的接口
2.传统的Web应用组成分层( MVC 模式)
M : 模型 【 持久化对象(实体类) + DAO(数据访问层) + Service(业务访问层) 】
V : 视图 【客户端显示的页面(html,jsp,asp,php...)】
C : 控制层 【Servlet,前后台数据交互中转站】
进销存需求 - - - - - -- - -- -- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
1 用户登录
2 退出登录 (JavaWeb的jsp数据交互)
3 销售
4 对销售记录进行分页查询并根据销售日期排序(降序)
5 根据商品名称查询该商品的库存数量
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
文件 sale.sql
##用户表
CREATE TABLE `test`.`users`(
`id` INT(10) NOT NULL AUTO_INCREMENT COMMENT '用户id',
`username` VARCHAR(20) NOT NULL COMMENT '用户名',
`password` VARCHAR(20) NOT NULL COMMENT '密码',
`realnam` VARCHAR(20) NOT NULL COMMENT '真实姓名',
PRIMARY KEY (`id`)
);
##商品表
CREATE TABLE `test`.`product`(
`id` INT(10) NOT NULL AUTO_INCREMENT COMMENT '商品 id',
`productname` VARCHAR(30) NOT NULL COMMENT '商品名称',
`quantity` INT(10) NOT NULL COMMENT '库存量',
PRIMARY KEY (`id`)
);
##销售记录表 从表
CREATE TABLE `test`.`sale`(
`id` INT(10) NOT NULL AUTO_INCREMENT COMMENT '记录 id',
`price` DOUBLE(11,2) NOT NULL COMMENT '销售单价',
`quantity` INT(10) NOT NULL COMMENT '数量',
`totalprice` DOUBLE(10,2) NOT NULL COMMENT '总价',
`saledate` DATE NOT NULL COMMENT '销售日期',
`userid` INT(10) NOT NULL COMMENT '销售员 id,对应 users 表的主键',
`productid` INT(10) NOT NULL COMMENT '商品 id,对应 product 表的主键',
PRIMARY KEY (`id`),
CONSTRAINT `fk_uid` FOREIGN KEY (`userid`) REFERENCES `test`.`users`(`id`),
CONSTRAINT `fk_pid` FOREIGN KEY (`productid`) REFERENCES `test`.`product`(`id`)
);
##添加测试数据 ,先加主表再加从表
INSERT INTO users(username,PASSWORD,realnam) VALUES('小飞','123','刁志飞') ;
INSERT INTO users(username,PASSWORD,realnam) VALUES('小刘','223','刘鑫') ;
INSERT INTO users(username,PASSWORD,realnam) VALUES('大刘','323','刘正') ;
INSERT INTO product(productname,quantity) VALUES('可口可乐',200) ;
INSERT INTO product(productname,quantity) VALUES('冰红茶',500) ;
INSERT INTO product(productname,quantity) VALUES('咖啡',10000) ;
INSERT INTO sale(price,quantity,totalprice,saledate,userid,productid) VALUES(2,50,100,NOW(),1,1) ;
INSERT INTO sale(price,quantity,totalprice,saledate,userid,productid) VALUES(5,50,250,NOW(),2,2) ;
INSERT INTO sale(price,quantity,totalprice,saledate,userid,productid) VALUES(2,50,100,NOW(),3,1) ;
INSERT INTO sale(price,quantity,totalprice,saledate,userid,productid) VALUES(10,50,500,NOW(),3,3) ;
INSERT INTO sale(price,quantity,totalprice,saledate,userid,productid) VALUES(3,50,150,NOW(),2,1) ;
INSERT INTO sale(price,quantity,totalprice,saledate,userid,productid) VALUES(6,50,300,NOW(),3,2) ;
## 三表连接查询
SELECT s.id,price,s.quantity,totalprice,saledate,userid,productid,u.`realnam`,p.`productname` FROM sale s
LEFT JOIN users u ON u.`id` = s.`userid`
LEFT JOIN product p ON p.`id` = s.`productid`
ORDER BY s.`saledate` DESC
Utils 安装包中 - - - - - -- - -- -- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
BaseUtils.java文件夹
package com.kgc.kh76.utils;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
public class BaseUtils {
// 定义连接数据库信息
protected static final String DRIVER = "com.mysql.jdbc.Driver";
protected static final String URL = "jdbc:mysql://127.0.0.1/test";
protected static final String USER = "root";
protected static final String PASSWORD = "ok";
// 定义数据库连接对象、预编译sql语句传输通道、rs结果集
protected Connection conn = null;
protected PreparedStatement pstmt = null;
protected ResultSet rs = null;
// 加载驱动
static {
try {
Class.forName(DRIVER);
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
// 创建数据库连接对象
public Connection getConn() {
try {
return DriverManager.getConnection(URL, USER, PASSWORD);
} catch (SQLException e) {
e.printStackTrace();
}
return null;
}
// 关闭所有数据库连接对象
public void closeAll() {
try {
if (rs != null) {
rs.close();
}
if (pstmt != null) {
pstmt.close();
}
if (conn != null) {
conn.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
}
/**
* 公共的查询方法
*
* @param sql 传输的sql语句
* @param params 预编译占位符参数
* @return 查询的rs结果集
*/
public ResultSet executeQuery(String sql, Object... params) {
// 连接数据库
conn = getConn();
try {
// 创建数据库传输通道
pstmt = conn.prepareStatement(sql);
// 循环遍历占位符参数
for (int i = 0; i < params.length; i++) {
// 设置占位符参数
pstmt.setObject(i + 1, params[i]);
}
// 触发执行查询sql语句
rs = pstmt.executeQuery();
} catch (SQLException e) {
e.printStackTrace();
}
return rs;
}
/**
* 公共的增删改操作
* @param sql 传输的sql语句
* @param params 预编译占位符参数
* @return 执行增删改操作受影响的行数
*/
public int executeUpdate(String sql, Object... params) {
// 连接数据库
conn = getConn();
// 执行增删改操作受影响的行数
int result = 0;
try {
// 创建数据库传输通道
pstmt = conn.prepareStatement(sql);
// 循环遍历占位符参数
for (int i = 0; i < params.length; i++) {
// 设置占位符参数
pstmt.setObject(i + 1, params[i]);
}
// 触发执行增删改sql语句
result = pstmt.executeUpdate();
} catch (SQLException e) {
e.printStackTrace();
} finally {
// 调用关闭所有数据库连接对象
closeAll();
}
return result;
}
}
entity 安装包中 - - - - - -- - -- -- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
文件1:Users.java
package com.kgc.kh76.entity;
public class Users {
private int id; //INT(10) NOT NULL AUTO_INCREMENT COMMENT '用户id',
private String username; //VARCHAR(20) NOT NULL COMMENT '用户名',
private String password; //VARCHAR(20) NOT NULL COMMENT '密码',
private String realnam; //VARCHAR(20) NOT NULL COMMENT '真实姓名',
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
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 getRealnam() {
return realnam;
}
public void setRealnam(String realnam) {
this.realnam = realnam;
}
public Users() {
}
public Users(int id, String username, String password, String realnam) {
this.id = id;
this.username = username;
this.password = password;
this.realnam = realnam;
}
@Override
public String toString() {
return "Users [id=" + id + ", username=" + username + ", password=" + password + ", realnam=" + realnam + "]";
}
}
文件2:Sale.java
package com.kgc.kh76.entity;
public class Sale {
private int id; // INT(10) NOT NULL AUTO_INCREMENT COMMENT '记录 id',
private double price; // DOUBLE(11,2) NOT NULL COMMENT '销售单价',
private int quantity; // INT(10) NOT NULL COMMENT '数量',
private double totalprice; // DOUBLE(10,2) NOT NULL COMMENT '总价',
private String saledate; // DATE NOT NULL COMMENT '销售日期',
private Users user; // INT(10) NOT NULL COMMENT '销售员 id,对应 users 表的主键',
private Product product; // INT(10) NOT NULL COMMENT '商品 id,对应 product 表的主键',
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public double getPrice() {
return price;
}
public void setPrice(double price) {
this.price = price;
}
public int getQuantity() {
return quantity;
}
public void setQuantity(int quantity) {
this.quantity = quantity;
}
public double getTotalprice() {
return totalprice;
}
public void setTotalprice(double totalprice) {
this.totalprice = totalprice;
}
public String getSaledate() {
return saledate;
}
public void setSaledate(String saledate) {
this.saledate = saledate;
}
public Users getUser() {
return user;
}
public void setUser(Users user) {
this.user = user;
}
public Product getProduct() {
return product;
}
public void setProduct(Product product) {
this.product = product;
}
public Sale() {
}
public Sale(int id, double price, int quantity, double totalprice, String saledate, Users user, Product product) {
this.id = id;
this.price = price;
this.quantity = quantity;
this.totalprice = totalprice;
this.saledate = saledate;
this.user = user;
this.product = product;
}
@Override
public String toString() {
return "Sale [id=" + id + ", price=" + price + ", quantity=" + quantity + ", totalprice=" + totalprice
+ ", saledate=" + saledate + ", user=" + user + ", product=" + product + "]";
}
}
文件3:Product.java
package com.kgc.kh76.entity;
public class Product {
private int id; //INT(10) NOT NULL AUTO_INCREMENT COMMENT '商品 id',
private String productname; //VARCHAR(30) NOT NULL COMMENT '商品名称',
private int quantity; //INT(10) NOT NULL COMMENT '库存量',
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getProductname() {
return productname;
}
public void setProductname(String productname) {
this.productname = productname;
}
public int getQuantity() {
return quantity;
}
public void setQuantity(int quantity) {
this.quantity = quantity;
}
public Product() {
}
public Product(int id, String productname, int quantity) {
super();
this.id = id;
this.productname = productname;
this.quantity = quantity;
}
@Override
public String toString() {
return "Product [id=" + id + ", productname=" + productname + ", quantity=" + quantity + "]";
}
}
dao package中 - - - - - -- - -- -- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
dao是什么???
文件夹1:UsersDao.java 是interface文件。面向接口。
package com.kgc.kh76.dao;
import com.kgc.kh76.entity.Users;
public interface UsersDao {
//根据用户名和密码查询方法
Users queryUserByUnameAndPwd(String uname,String pwd);
//强调: 一般项目,删除是很少应用的
}
文件夹2:SaleDao.java 是interface文件。
package com.kgc.kh76.dao;
import java.util.List;
import com.kgc.kh76.entity.Sale;
public interface SaleDao {
//添加销售记录表
// 基本信息 : 商品名称 单价 数量
int addSale(Sale sale);
//查询所有销售记录
//对销售记录进行分页查询并根据销售日期排序(降序)
List<Sale> queryAllSales();
//根据销售记录ID修改销售记录信息
int updateSaleById(Sale sale);
}
文件夹3:ProductDao.java 是interface文件。
package com.kgc.kh76.dao;
import com.kgc.kh76.entity.Product;
public interface ProductDao {
// 对于商品表 减少库存
// 根据商品id更新商品库存的方法
int updateProductById(Product pro);
//根据商品名称查询该商品的库存数量
int productQuantity(String proName);
}
dao package下创建impl package impl package下的文件 - - - - - -- - -- -- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
UsersDaoImpl.java
package com.kgc.kh76.dao.impl;
import com.kgc.kh76.dao.UsersDao;
import com.kgc.kh76.entity.Users;
import com.kgc.kh76.utils.BaseUtils;
public class UsersDaoImpl extends BaseUtils implements UsersDao {
@Override
public Users queryUserByUnameAndPwd(String uname, String pwd) {
return null;
}
}
SaleDaoImpl.java
package com.kgc.kh76.dao.impl;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import com.kgc.kh76.dao.SaleDao;
import com.kgc.kh76.entity.Product;
import com.kgc.kh76.entity.Sale;
import com.kgc.kh76.entity.Users;
import com.kgc.kh76.utils.BaseUtils;
public class SaleDaoImpl extends BaseUtils implements SaleDao {
@Override
public int addSale(Sale s) {
String sql = "INSERT INTO sale(price,quantity,totalprice,saledate,userid,productid) VALUES(?,?,?,NOW(),?,?) ";
int addRes = super.executeUpdate(sql, new Object[] {s.getPrice(),s.getQuantity(),s.getTotalprice(),
s.getUser().getId(),s.getProduct().getId()});
return addRes;
}
@Override
public List<Sale> queryAllSales() {
//创建List<Sale>集合对象,用来存储数据库获取的rs结果集
List<Sale> sales = new ArrayList<Sale>();
//定义查询sql语句
StringBuffer sb = new StringBuffer();
sb.append(" SELECT s.id,price,s.quantity,totalprice,saledate,userid,productid,u.`realnam`,p.`productname` ");
sb.append(" FROM sale s ");
sb.append(" LEFT JOIN users u ON u.`id` = s.`userid` ");
sb.append(" LEFT JOIN product p ON p.`id` = s.`productid` ");
sb.append(" ORDER BY s.`saledate` DESC ");
//调用公共查询的方法
super.rs = super.executeQuery(sb.toString());
try {
//循环遍历rs结果集
while(rs.next()) {
//创建Sale销售记录对象,将从数据循环遍历的数据赋值给实体类对象
Sale sale = new Sale(rs.getInt("s.id"),
rs.getDouble("price"),
rs.getInt("s.quantity"),
rs.getDouble("totalprice"),
rs.getString("saledate"),
new Users(rs.getInt("userid"), null, null, rs.getString("u.realnam")),
new Product(rs.getInt("productid"), rs.getString("p.productname"), 0));
sales.add(sale);
}
} catch (SQLException e) {
e.printStackTrace();
}finally {
super.closeAll();
}
return sales;
}
@Override
public int updateSaleById(Sale sale) {
return 0;
}
}
ProductDaoImpl.java
package com.kgc.kh76.dao.impl;
import com.kgc.kh76.dao.ProductDao;
import com.kgc.kh76.entity.Product;
import com.kgc.kh76.utils.BaseUtils;
public class ProductDaoImpl extends BaseUtils implements ProductDao {
@Override
public int updateProductById(Product pro) {
return 0;
}
@Override
public int productQuantity(String proName) {
return 0;
}
}
test package中 测试main函数入口 - - - - - -- - -- -- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
SaleDaoImplTest.java
package com.kgc.kh76.test;
import java.util.List;
import com.kgc.kh76.dao.SaleDao;
import com.kgc.kh76.dao.impl.SaleDaoImpl;
import com.kgc.kh76.entity.Product;
import com.kgc.kh76.entity.Sale;
import com.kgc.kh76.entity.Users;
public class SaleDaoImplTest {
public static void main(String[] args) {
SaleDao dao = new SaleDaoImpl();
//新增
//创建Sale对象
Users user = new Users();
user.setId(3);
Product product = new Product();
product.setId(3);
Sale sale = new Sale(0, 11, 100, 1100, null, user, product);
int addRes = dao.addSale(sale);
System.out.println("addRes:"+addRes);
List<Sale> sales = dao.queryAllSales();
System.out.println("ID 商品 单价 数量 总价 销售日期 销售员 ");
for (Sale s : sales) {
System.out.println(s.getId()+" "+s.getProduct().getProductname()+
" "+s.getPrice()+" "+s.getQuantity()+" "+s.getTotalprice()+
" "+s.getSaledate()+" "+s.getUser().getRealnam());
}
}
}
- - - - - -- - -- -- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - - -- - -- -- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - - -- - -- -- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - - -- - -- -- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
day20191009周三和教员老师和班主任交流沟通笔记
1.针对自己身上的问题,对症下药。要有选择,不能什么都学会。
2.挂科四门,大学能毕业吗?然后是你能考上南林,是懒,智力没问题。
3.花功夫,世界不公平的事情多了。找到自己的平衡点。
4.4. 我自己的培训学习问题:1)来回看车路上地铁上背书,其他时间看代码每天的代码老师讲的知识最基本要弄懂,写,知道步骤,2)然后个自己定目标,不看然后能1小时写出来,不能行尸走肉不懂,今天。当日事当日毕。工作很多自己多看。3)截图,截图。录屏。4)自己做不来的事情一定要做。智力没问题,能做好。。工作去再学习。逆流而上。做好当下。
5.5. 实话实说,没做就要承担责任。1)自己肯学花时间,时间是海绵里的水,喝咖啡的时间。2)问人,解决问题,问大神,问老师,自己解决问题,每教学生都能学到新知识,适应环境,生命有限,做好当下这段时间,毕业设计。问一遍不理,问到别人理为止,问问题,解决问题。
理论是理论。熟能生巧。有的话听,有的话不听。过滤。
你说的对!可是自己的观点。
6.作业一发下来就订正,及时订正,及时改错。默写。
7.你要证明自己有能力,知道了作业之后就尽快尽早做好,尽善尽美,全力以赴,力所能及。
8.花的功夫和时间太少,抄写三遍。
9.不同的时间段需要改变自己的状态和方式,有更好的学习方式。问到自己会为止,说出来,解决问题。
问人,问厉害的人,前后左右的人。
10.写6遍,一定能弄懂。
11.只要功夫深,铁杵磨成针。花的功夫不够。
对学习孜孜不倦,认真专心,调整状态,活,多练,不厌其烦,问,查。解决问题。
成年人,自己的生命把握在自己的手中,自己的行为决定了自己的人生。
观察,问,知道问题,解决问题。
没完成作业就要付出责任。先看一遍后写
别人说是别人说,我自己是我自己的,自己对自己负责任。
脸皮要厚。欲戴皇冠,必承其重。想要得到就必须要付出。等价的。等价交换。每个人生都不易。
好记性不如烂笔头。
线下笔记,线上看视频。温故而知新。
写字打字坐姿端庄就不会累。自律才能自由。
忌浮躁。沉淀,想想最糟糕的事情。
入门的心。
只有一个女生,和大神混熟。和优秀的人做朋友。
人生来是平等的。
轻重缓急不可能所有的事情都掌握,有选择。有方向
第一位的是当天所讲的课程,最重要。
少说废话。做实事。
和自己比,因人而异,但要反思,效率,为什么别人能做到自己做不到呢?
不在可以问,在可以在线问。课程作业。问人,问优秀的人。
不会不可耻,不会就问解决问题。
弄懂。明白了吗?懂了吗?你认真看了几遍?你认真完成了几遍?6遍有吗?