1.JDBC是什么?
JDBC是用于在Java语言编程中与数据库连接的API。根本上,JDBC是一个规范,它提供了一整套接口,允许以一种可移植的访问底层数据库API。 Java可以用它来编写不同类型的可执行文件。
2.JDBC架构
两层:
三层:
UI(表现层): UI就是界面,即用户交互的界面。但它不只是一个个用户界面,也是需要有代码来接收用户输入的数据和显示处理后返回给用户的数据。
BLL:(业务逻辑层): UI层和DAL层之间的桥梁。业务逻辑具体包含:验证、计算、业务规则等等。其实就是数据的处理和传输。
DAL:(数据访问层): 与数据库打交道。实现对数据的增、删、改、查。(其实对数据的操作都是这四个)将存储在数据库中的数据提交给业务层,同时将业务层处理的数据保存到数据库。
(用户的需求反映给界面(UI),UI反映给BLL,BLL反映给DAL,DAL进行数据的操作,操作后再一一返回,直到将用户所需数据反馈给用户)
上面看起来每一层都是独立的在完成各自的工作,那么三层之间通过什么来联系实现用户请求和反馈数据这些过程呢?
Entity(实体层):实体层贯穿于三层之间,来连接三层。
当然还有一个问题就是在三层间传递的某个数据表会包含很多信息,每个变量都做为参数来传递的话,方法中的参数实在是多得让人眼花缭乱分不清了。那就考虑一下用实体做参数如何? 不用考虑参数匹配的问题,用到实体中哪个属性拿来直接用就可以,很方便。(就好像我们在做游戏或画图板时,在另一个与界面分离的实现功能类中需要用到界面上的某个按钮控件,我们可以选择把整个界面传参过去,而不只是传那个按钮控件,如果下次再用到界面上的其他东东也就不需要再传递其他参数了,而且当需要用到界面上的很多控件时,一个一个传是极其混乱不方便的。)
将每个数据表作为一个实体类,实体类封装的属性对应到表中的字段,这样的话,实体在贯穿于三层之间时,就可以实现数据的增删改查了。
看张贴近生活的图或许能更好的理解下这三层之间的关系!
服务员:只管接待客人;
厨师:只管做客人点的菜;
采购员:只管按客人点菜的要求采购食材;
他们之间各尽其职,不需要去管其他的工作。这也就体现出了三层架构的目的:解耦!!!
他们三层之间的联系是这样的:
顾客和服务员(UI层)说:我要一个炒茄子,而服务员不负责炒茄子,她就把请求往上递交,传递给厨师(BLL层),厨师需要茄子,就把请求往上递交,传递给采购员(DAL层),采购员从仓库里取来茄子传回给厨师,厨师响应cookEggplant()方法,做好炒茄子后,又传回给服务员,服务员把茄子呈现给顾客。
在此过程中,茄子作为参数在三层中传递,如果顾客点炒鸡蛋,则鸡蛋作为参数(这是变量做参数)。如果用户增加需求,我们还得在方法中添加参数,每个方法都得增加。上面通过实体类的封装解决这个问题,就是我们可以把茄子、鸡蛋、面条作为属性定义到顾客实体中,一旦顾客增加了炒鸡蛋需求,直接把鸡蛋属性拿出来用即可,不用再去考虑去每层的方法中添加参数和参数的匹配问题了。
3.JDBC MySQL 连接
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;
public class jdbcDemo {
public static void main(String[] args) throws Exception {
// 1.注册驱动 通过反射 JDBC驱动名
Class.forName("com.mysql.jdbc.Driver");
//2.获得连接 数据库URL
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/ssm?characterEncoding=utf-8","root","root");
//3.创建一个Statement
String sql="select * from t_user"; //t_user表明
PreparedStatement state=conn.prepareStatement(sql);
//4.执行SQL
ResultSet rs = state.executeQuery();
//定义List而不是ArrayList是实现多态
List<User> users=new ArrayList<User>();
while(rs.next()){
//用角标来取,传的是数字。int id = rs.getInt(“1”);报错
//可以通过字段名获取字段 int id = rs.getInt(“id”);
int id = rs.getInt(1);
String name = rs.getString(2);
User u=new User();
u.setId(id);
u.setName(name);
users.add(u);
}
//5.释放资源
rs.close();
state.close();
conn.close();
System.out.println(users.size());
}
}
//用户类
public class User {
private int id;
private String name;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
数据库建表可以参考文章https://blog.csdn.net/ziyonghong/article/details/81806905。