Spring(一)
一、编写jdbc的工程代码用于分享程序的耦合
工程结构
pom.xml
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.itheima</groupId> <artifactId>day01_eesy_01jdbc</artifactId> <version>1.0-SNAPSHOT</version> <packaging>jar</packaging> <dependencies> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.7</version> </dependency> </dependencies> </project>
JdbcDemo1
package com.itheima.jdbc; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; public class JdbcDemo1 { 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/eesy","root","root"); //3.获取操作数据库的预处理对象 PreparedStatement pstm = conn.prepareStatement("select * from account"); //4.执行SQL语句,得到结果集 ResultSet rs = pstm.executeQuery(); //5.遍历输出结果 while (rs.next()){ System.out.println(rs.getString("name")); } //6.释放资源 rs.close(); pstm.close(); conn.close(); } }
遇到的问题
(1)以上代码mysql标红
分析:查看Maven结构,提示5.1.7不存在
解决:将pom.xml中的版本换成5.1.6
<dependencies>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.6</version>
</dependency>
</dependencies>
(2)运行代码提示
解决方法:
在url路径上加上这句话
?useUnicode=true&characterEncoding=utf-8
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/eesy?useUnicode=true&characterEncoding=utf-8","root","root");
二、编译期依赖
DriverManager.registerDriver(new com.mysql.jdbc.Driver());
现象:删除pom.xml中的依赖,运行代码
三、程序的耦合和解耦的思路分享
耦合的表现:
1)使用了new关键字创建对象
2)注释掉mysql依赖
3)运行程序,报编译期错误
解决耦合:
1)使用反射创建对象
2)运行程序
3)不再报编译期错误,但是会报运行错误,此时放开注释,再次运行成功
此方式存在的问题,"com.mysql.jdbc.Driver"在程序中是写死的,如果换成其他数据库如Oracle,还是有问题,那么如何解决呢?
什么是耦合?
耦合:程序间的依赖关系
包括:
类之间的依赖
方法之间的依赖
解耦:
降低程序的依赖关系
实际开发中
应该做到:编译期不依赖,运行时才依赖
解耦的思路:
第一步:使用反射来创建对象,而避免使用new关键字
第二步:通过读取配置文件来获取要创建的对象全限定类名
四、曾经代码中的问题分享
新建一个工程
目录结构
pom.xml文件
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.itheima</groupId> <artifactId>day01_eesy_02factory</artifactId> <version>1.0-SNAPSHOT</version> <packaging>jar</packaging> </project>
业务层接口
package com.itheima.service;
/*
* 帐号业务层接口
* */
public interface IAccountService {
/*
* 模拟保存账户
* */
void saveAccount();
}
业务层实现
package com.itheima.service.ipml; import com.itheima.service.IAccountService; import com.itheima.dao.IAccountDao; import com.itheima.dao.impl.AccountDaoImpl; /* * 账号的业务层实现 * */ public class AccountServiceImpl implements IAccountService { private IAccountDao accountDao = new AccountDaoImpl(); public void saveAccount() { accountDao.saveAccount(); } }
持久层接口
package com.itheima.dao; /* * 帐号的持久层接口 * */ public interface IAccountDao { /* *模拟保存账户 */ public void saveAccount(); }
持久层实现
package com.itheima.dao.impl; import com.itheima.dao.IAccountDao; /* * 账户的持久层实现 * */ public class AccountDaoImpl implements IAccountDao { public void saveAccount() { System.out.println("保存了账户!"); } }
表现层(模拟)
package com.itheima.ui; import com.itheima.service.IAccountService; import com.itheima.service.ipml.AccountServiceImpl; /* * 模拟一个表现层,用于调用业务层 * */ public class Client { public static void main(String[] args) { IAccountService as = new AccountServiceImpl(); as.saveAccount(); } }
以上代码存在的问题
1.强依赖(耦合),如果将持久层代码拷走,所有文件代码报编译错误
2.解决,使用工厂