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)运行代码提示

EXCEPTION IN THREAD "MAIN" JAVA.SQL.SQLEXCEPTION: UNKNOWN INITIAL CHARACTER SET INDEX '255' RECEIVED FROM SERVER. INITIAL CLIENT CHARACTER SET CAN BE FORCED VIA THE 'CHARACTERENCODING' PROPERTY.

解决方法:

在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.解决,使用工厂

 

posted @ 2020-06-20 10:34  蓝裙子  阅读(165)  评论(0编辑  收藏  举报