JavaWeb--使用JDBC操作数据库(一)
JavaWeb–使用JDBC操作数据库
文章目录
- JavaWeb--使用JDBC操作数据库
- 1.JDBC简介
- 2.JDBC访问数据库步骤
- 3.JDBC封装
- 3.1为什么进行JDBC封装
- 3.1.1 封装的目的
- 3.1.2 封装的好处
- 3.2实现JDBC封装
- 3.3DAO层
- 3.3.1什么是DAO层
- 3.3.2DAO模式的组成
- 3.4属性文件
- 3.5单例模式
- 3.5.1为何需要单例模式
- 3.5.2单例模式概念
- 3.5.3单例模式分类
1.JDBC简介
- JDBC(Java DataBase Connectivity):Java数据库连接技术
- 作用:实现Java程序对各种数据库的访问
- 组成:由一组使用Java语言编写的类和接口(JDBC API)组成,位于
java.sql
以及javax.sql
包中
2.JDBC访问数据库步骤
package demo;import java.sql.*;public class Demo1_query {public static void main(String[] args) {// 1.加载JDBC驱动try {Class.forName("com.mysql.cj.jdbc.Driver");String url = "jdbc:mysql://127.0.0.1:3306/smbms?useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull&serverTimezone=GMT%2B8";String uname = "root";String upwd = "root";//2. DriverManager创建数据库连接Connection connection = DriverManager.getConnection(url, uname, upwd);//3.创建SQL语句String sql = "select " +"id," +"proCode," +"proName," +"proDesc " +"from smbms_provider";//4.通过Connection创建PreparedStatement对象用于执行SQL语句PreparedStatement statement = connection.prepareStatement(sql);//执行SQL语句 返回resultSet集合ResultSet resultSet = statement.executeQuery();while (resultSet.next()) {Long id = resultSet.getLong("id");String proCode = resultSet.getString("proCode");String proName = resultSet.getString("proName");String proDesc = resultSet.getString("proDesc");System.out.println(id + "\t" + proCode + "\t" + proName + "\t" + proDesc);}//5.关闭数据库连接connection.close(); } catch (Exception e) {e.printStackTrace();}}
}
3.JDBC封装
3.1为什么进行JDBC封装
3.1.1 封装的目的
- 减少代码冗余:将相似功能的代码抽取封装成方法
- 降低耦合度:通过接口抽象数据库操作,便于更换数据库
- 提高可维护性:统一管理数据库连接和操作
- 增强安全性:防止SQL注入攻击
3.1.2 封装的好处
- 代码复用性提高
- 系统扩展性增强
- 错误处理统一
- 资源管理规范
3.2实现JDBC封装
- 将所有增删改查操作抽取成接口
- 定义实体类传输数据
- 将通用的操作(打开、关闭连接等)封装到工具类
- 数据库工具类BaseDao:增、删、改、查的通用方法
3.3DAO层
3.3.1什么是DAO层
- DataAccessObject(数据存取对象)
- 位于业务逻辑和持久化数据之间
- 实现对持久化数据的访问
3.3.2DAO模式的组成
- DAO接口:定义数据操作的方法
- DAO实现类:实现接口中的方法
- 实体类:数据传输对象
- 数据库连接工具类:管理数据库连接和资源
3.4属性文件
-
后缀为.properties
-
数据格式为“键=值"
-
使用“#"来注释
mysql.driver=com.mysql.cj.jdbc.Driver mysql.url=jdbc:mysql://127.0.0.1:3306/test?useUnicode=true&characterEncoding=utf-8&useSSL=false&zeroDateTimeBehavior=convertToNull&serverTimezone=GMT%2B8 mysql.rootname=root mysql.rootpwd=root
3.5单例模式
3.5.1为何需要单例模式
- BaseDao:操作数据库的基类
- 每个线程对系统操作都需new一个BaseDao实例
- 初始化时的I/0操作消耗系统资源,影响系统性能
3.5.2单例模式概念
- 系统运行期间,有且仅有一个实例
- 一个类只有一个实例最基本的要求
- 只提供私有构造器
- 必须自行创建这个实例
- 定义了静态的该类私有对象
- 必须自行向整个系统提供这个实例
- 提供一个静态的公有方法,近返回创建或者获取本身的静态 私有对象
3.5.3单例模式分类
- 懒汉模式
- 在类加载时不创建实例,采用延迟加载的方式,在运 行调用时创建实例
- 特点
- 线程不安全
- 延迟加载
- 如何解决线程安全问题
- 同步(synchronized)
- 饿汉模式
- 在类加载的时候,就完成初始化
- 特点
- 线程安全
- 不具备延迟加载特性