高效掌握JDBC技术(二)| 掌握ORM思想 | 定义连接数据库的工具类

简介: 高效掌握JDBC技术(二)| 掌握ORM思想 | 定义连接数据库的工具类

一、ORM思想及实践


ORM框架思想:


广义上,ORM指的是面向对象的对象模型和关系型数据库的数据结构之间的相互转换。 狭义上,ORM可以被认为是,基于关系型数据库的数据存储,实现一个虚拟的面向对象的数据访问接口。


在对象模型和关系型模型之间实现映射

模型 数据格式 操作数据的方式

java: 面向对象的语言 对象、属性、类 通过方法操作对象

mysql:关系型数据库 行、字段、表的设计 通过SQL语句操作表中数据

两者的区别:数据格式不同、操作数据的方式不同


两者的映射:

一张表的设计 – 一个类

表中的一个字段 – 类中的一个属性

表中的一行数据 – 一个对象

一条SQL – 一个方法

实践部分:


1、实体类


作用:跟数据库中表的设计进行映射,解决了两者之间数据格式不同的问题

java 数据库

类:对对象的设计 表:对字段的设计

属性 字段:列

对象 行

要求:

一张表对应一个实体类

类名必须与表名相关

类必须实现Serializable接口

一个字段对应一个属性

属性类型必须为引用类型

必须提供无参构造(建议全属性有参构造同步存在)

为了保证对象安全,正常对属性进行封装


/**
 * 映射t_user表
 */
public class User implements Serializable {
    private Integer id;
    private String name;
    private String sex;
    private Integer age;
    public User() {
    }
    public User(Integer id, String name, String sex, Integer age) {
        this.id = id;
        this.name = name;
        this.sex = sex;
        this.age = age;
    }
    public Integer getId() {
        return id;
    }
    public void setId(Integer id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getSex() {
        return sex;
    }
    public void setSex(String sex) {
        this.sex = sex;
    }
    public Integer getAge() {
        return age;
    }
    public void setAge(Integer age) {
        this.age = age;
    }
}


2、DAO模式


作用:用来解决两者之间数据操作方式不同的问题


操作 数据库 java

增 insert into… int insertXxx(对象)

删 delete from… int deleteXxx(Xxx 条件参数)

改 update … set … int updateXxx(Xxx 条件参数)

查询单个 select … from … where … 对象 selectXxxByXxx(Xxx 条件参数)

查询多个 select … from 对象集合/对象数组 selectXxxs()


实现:


一张表对应一个接口,接口中存放着对该表的所有操作的行为方法

接口名应与表名相关:t_user-->UserDao

包:com.xxx.dao

实现类:

一个实现类实现一个接口

实现类的命名:UserDao-->UserDaoImpl

包:com.xxx.dao.impl

优点:让方法声明与方法实现分离,可以促使接口成为一套行为规范,该规范可以拥有多种不同的实现方式,提高程序的可扩展性


UserDao接口:


package com.bz.dao;
import com.bz.entity.User;
/**
 * t_user的所有行为方法
 */
public interface UserDao {
    /**
     * 往表中添加一条信息
     * @param user  包含着所有属性值的对象
     * @return 受影响的行数
     */
    int insertUser(User user) throws  Exception;
    /**
     * 根据用户id查找指定用户信息
     * @param id  被查询的id
     * @return 对应的用户信息对象
     */
    User seleteUserById(Integer id) throws  Exception;
}


UserDaoImpl实现:


package com.bz.dao.impl;

import com.bz.dao.UserDao;

import com.bz.entity.User;


/**
 * 分别在不同的方法中使用JDBC6大步实现不同的功能方法
 */
public class UserDaoImpl implements UserDao {
    @Override
    public int insertUser(User user) throws Exception{
        //1. 加载驱动
        Class.forName("com.mysql.cj.jdbc.Driver");
        //2. 获取连接
        //用户名
        String username = "root";
        //密码
        String pwd = "123456";
        //连接的url
        String url = "jdbc:mysql://localhost:3306/baizhi2109?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=Asia/Shanghai";
        Connection conn = DriverManager.getConnection(url, username, pwd);
        //3. 获取发送SQL的工具
        String sql="insert into t_user (u_name,u_sex,u_age) VALUES(?,?,?)";
        PreparedStatement ps = conn.prepareStatement(sql);
        //4. 发送并执行SQL
        //给占位符赋值:用参数对象的值给表中字段赋值
        ps.setString(1,user.getName());
        ps.setString(2,user.getSex());
        ps.setInt(3,user.getAge());
        int n=ps.executeUpdate();
        //5. 处理结果集  略
        //6.关闭资源
        ps.close();
        conn.close();
        return  n;//把受影响行数返回
    }


   @Override

   public User seleteUserById(Integer id) throws  Exception {

       User user=null;//用来返回的User对象


 

//1. 加载驱动
        Class.forName("com.mysql.cj.jdbc.Driver");
        //2. 获取连接
        //用户名
        String username = "root";
        //密码
        String pwd = "123456";
        //连接的url
        String url = "jdbc:mysql://localhost:3306/baizhi2109?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=Asia/Shanghai";
        Connection conn = DriverManager.getConnection(url, username, pwd);
        //准备发送SQL
        String sql = "select * from t_user where u_id=?";
        PreparedStatement ps = conn.prepareStatement(sql);
        //发送SQL
        //给占位符赋值
        ps.setInt(1,id);
        ResultSet rs=ps.executeQuery();
        //处理结果集
        if (rs.next()){//判断结果集中是否存在内容
            Integer uid = rs.getInt("u_id");
            String uname = rs.getString("u_name");
            String usex = rs.getString("u_sex");
            Integer uage = rs.getInt("u_age");
            //根据字段值构建对应的User对象
            user= new User(uid, uname, usex, uage);
        }
        //关闭资源
        rs.close();
        ps.close();
        conn.close();
        return user;
    }
}


测试UserDao的接口实现类:


package com.bz.test;

import com.bz.dao.UserDao;

import com.bz.dao.impl.UserDaoImpl;

import com.bz.entity.User;


public class TestUser {
    public static void main(String[] args) throws Exception{
        //创建实现类对象
        UserDao ud=new UserDaoImpl();
  //测试查询方法
        User user= ud.seleteUserById(2);
        System.out.println(user);
        //创建用来添加的对象
        User user = new User("zhangsan", "男", 38);
        //调用添加方法,接收返回值
        int n = ud.insertUser(user);
        //判断返回值
        if (n>0){
            System.out.println("添加成功");
        }else{
            System.out.println("添加失败");
        }
    }
}


二、实现数据库连接的工具类——JDBCUtils


从上面书写Dao接口实现类的时候我们发现,每当我要对数据库进行操作就要建立一个连接,书写六大步骤,是不是过于繁琐呢?因此我们直接实现一个数据库连接的工具类来减少重复代码的书写。


1、JDBCUtils的具体代码实现


package com.bz.util;
import java.sql.*;
/**
 * 工具类:方便方法调用,所有方法都应为静态方法
 */
public class JDBCUtils {
    public static Connection getConnection(){
        Connection conn =null;
        try {
            //1. 加载驱动
            Class.forName("com.mysql.cj.jdbc.Driver");
            //2. 获取连接
            //用户名
            String username = "root";
            //密码
            String pwd = "123456";
            //连接的url
            String url = "jdbc:mysql://localhost:3306/baizhi2109?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=Asia/Shanghai";
            conn = DriverManager.getConnection(url, username, pwd);
        }catch (ClassNotFoundException e){
            System.out.println("驱动路径不正确");
        }catch (SQLException e){
            System.out.println("获取连接失败");
        }catch (Exception e){
            System.out.println("未知异常");
            e.printStackTrace();
        }
       return conn;
    }
    /**
     * 关闭资源连接  非空判断:防止空指针
     * @param rs
     * @param ps
     * @param conn
     */
    public static void close(ResultSet rs, PreparedStatement ps,Connection conn){
        if (rs!=null){
            try {
                rs.close();
            } catch (SQLException e) {
                System.out.println("关闭rs失败");
            }
        }
        if (ps!=null){
            try {
                ps.close();
            } catch (SQLException e) {
                System.out.println("关闭ps失败");
            }
        }
        if (conn!=null){
            try {
                conn.close();
            } catch (SQLException e) {
                System.out.println("关闭conn失败");
            }
        }
    }
}


2、调用工具类


public class UserDaoImpl implements UserDao {
    @Override
    public int insertUser(User user) throws Exception{
        //调用工具类的方法获取连接
        Connection conn=JDBCUtils.getConnection();
        //3. 获取发送SQL的工具
        String sql="insert into t_user (u_name,u_sex,u_age) VALUES(?,?,?)";
        PreparedStatement ps = conn.prepareStatement(sql);
        //4. 发送并执行SQL
        //给占位符赋值:用参数对象的值给表中字段赋值
        ps.setString(1,user.getName());
        ps.setString(2,user.getSex());
        ps.setInt(3,user.getAge());
        int n=ps.executeUpdate();
        //5. 处理结果集  略
        //6.调用工具类方法关闭资源
        JDBCUtils.close(null,ps,conn);
        return  n;//把受影响行数返回
    }
}



相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。   相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情: https://www.aliyun.com/product/rds/mysql 
相关文章
|
11月前
|
SQL Java 数据库连接
除了JDBC,还有哪些常见的数据库访问技术?
除了JDBC,还有哪些常见的数据库访问技术?
873 2
|
12月前
|
监控 Java 关系型数据库
HikariCP 高性能数据库连接池技术详解与实践指南
本文档全面介绍 HikariCP 高性能数据库连接池的核心概念、架构设计和实践应用。作为目前性能最优异的 Java 数据库连接池实现,HikariCP 以其轻量级、高性能和可靠性著称,已成为 Spring Boot 等主流框架的默认连接池选择。本文将深入探讨其连接管理机制、性能优化策略、监控配置以及与各种框架的集成方式,帮助开发者构建高性能的数据访问层。
1180 8
|
SQL Java 关系型数据库
Java连接MySQL数据库环境设置指南
请注意,在实际部署时应该避免将敏感信息(如用户名和密码)硬编码在源码文件里面;应该使用配置文件或者环境变量等更为安全可靠地方式管理这些信息。此外,在处理大量数据时考虑使用PreparedStatement而不是Statement可以提高性能并防止SQL注入攻击;同时也要注意正确处理异常情况,并且确保所有打开过得资源都被正确关闭释放掉以防止内存泄漏等问题发生。
510 13
|
SQL 关系型数据库 MySQL
MySQL数据库连接过多(Too many connections)错误处理策略
综上所述,“Too many connections”错误处理策略涉及从具体参数配置到代码层面再到系统与架构设计全方位考量与改进。每项措施都需根据具体环境进行定制化调整,并且在执行任何变更前建议先行测试评估可能带来影响。
1973 11
|
12月前
|
监控 Java 关系型数据库
HikariCP 高性能数据库连接池技术详解与实践指南
本文档全面介绍 HikariCP 高性能数据库连接池的核心概念、架构设计和实践应用。作为目前性能最优异的 Java 数据库连接池实现,HikariCP 以其轻量级、高性能和可靠性著称,已成为 Spring Boot 等主流框架的默认连接池选择。本文将深入探讨其连接管理机制、性能优化策略、监控配置以及与各种框架的集成方式,帮助开发者构建高性能的数据访问层。
786 1
|
SQL 数据管理 BI
数据库操作三基石:DDL、DML、DQL 技术入门指南
本文围绕数据库操作核心语言 DDL、DML、DQL 展开入门讲解。DDL 作为 “结构建筑师”,通过CREATE(建库 / 表)、ALTER(修改表)、DROP(删除)等命令定义数据库结构;DML 作为 “数据管理员”,以INSERT(插入)、UPDATE(更新)、DELETE(删除)操作数据表记录,需搭配WHERE条件避免误操作;DQL 作为 “数据检索师”,通过SELECT结合WHERE、ORDER BY、LIMIT等子句实现数据查询与统计。三者相辅相成,是数据库操作的基础,使用时需注意 DDL 的不可撤销性、DML 的条件约束及 DQL 的效率优化,为数据库学习与实践奠定基础。
|
SQL druid Java
Java数据库部分(MySQL+JDBC)(二、JDBC超详细学习笔记)(下)
Java数据库部分(MySQL+JDBC)(二、JDBC超详细学习笔记)
391 3
Java数据库部分(MySQL+JDBC)(二、JDBC超详细学习笔记)(下)
|
SQL Java 关系型数据库
Java数据库部分(MySQL+JDBC)(二、JDBC超详细学习笔记)(上)
Java数据库部分(MySQL+JDBC)(二、JDBC超详细学习笔记)
798 3
Java数据库部分(MySQL+JDBC)(二、JDBC超详细学习笔记)(上)
|
Java 关系型数据库 MySQL
mysql5.7 jdbc驱动
遵循上述步骤,即可在Java项目中高效地集成MySQL 5.7 JDBC驱动,实现数据库的访问与管理。
3290 1