参考的学习视频→https://b23.tv/av47952931/p82
●什么是程序的耦合呢?我们来看一个例子↓
首先在idea中新建一个maven project,不选择任何骨架
在新建好的maven工程的pom文件中
添加打包形式<packaging>jar</packaging>和mysql依赖
<dependencies>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.44</version>
</dependency>
</dependencies>
配置好的pom文件如下
向数据库test中新建account表,并插入数据
use test;
create table account(
id int primary key auto_increment,
uname varchar(40),
money float
)character set utf8 collate utf8_general_ci;
insert into account(uname,money) values('aaa',1000);
insert into account(uname,money) values('bbb',5432);
insert into account(uname,money) values('ccc',6666);
新建一个类JdbcDemo1,在该类的main方法中
用传统方式编写java代码来查询数据库
public static void main(String[] args) throws Exception{
//1.注册驱动
DriverManager.registerDriver(new com.mysql.jdbc.Driver());
//2.获取连接
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/test","root","1234");
//3.获取操作数据库的预处理对象
PreparedStatement pstm = conn.prepareStatement("select * from account");
//4.执行SQL,得到结果集
ResultSet rs = pstm.executeQuery();
//5.遍历结果集
while(rs.next()){
System.out.println(rs.getString("uname"));
}
//6.释放资源
rs.close();
pstm.close();
conn.close();
}
运行程序,成功打印出了数据
*发现问题
当我们注释掉mysql的依赖语句后
再次运行,出现编译错误
这说明在没有依赖的情况下,该工程不能正常编译,这就是程序的耦合。
当我们把
DriverManager.registerDriver(new com.mysql.jdbc.Driver());
换成
Class.forName("com.mysql.jdbc.Driver");
之后,再次运行,发现编译成功,而抛出的是异常而不是错误。
这是用反射来创建对象的一个例子 ,它把依赖从编译阶段挪到了运行阶段。前一个方法依赖的是一个具体的驱动类,而后者只是依赖一个字符串,这样带来的好处是可以减少程序的耦合。
但这又带来一个新问题,由于这里的驱动类作为字符串已经在代码里固定了,如果我以后需要修改这个驱动类该怎么办呢?于是我们需要通过读取配置文件来获取要创建的对象全限定类名。
◆总结一下
耦合:程序间的依赖关系,包括:
- 类之间的依赖
- 方法之间的依赖
解耦:降低程序间的依赖关系。
实际开发中:
- 应该做到:编译期不依赖,运行时才依赖。
解耦的思路:
- 第一步:使用反射来创建对象,而避免使用new关键字。
- 第二步:通过读取配置文件来获取要创建的对象全限定类名。