0


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

✅作者简介:C/C++领域新星创作者、CSDN内容合伙人,喜欢学习后端语言的大学生
✨精品专栏:C++面向对象核心
🔥系列专栏:JDBC技术
📃推荐一款模拟面试、刷题神器👉注册免费刷题

🔥前言

上文讲了JDBC连接数据库的六大步,成功完成了对数据库的修改的读取。那么今天就来学习一下ORM思想,理解面向对象语言与关系型数据库之间的映射关系,学习把连接数据库的方法定义到一个工具类中从而减少重复代码的书写。

文章目录

一、ORM思想及实践

ORM框架思想:

广义上,

ORM

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

  • 在对象模型和关系型模型之间实现映射
    模型数据格式操作数据的方式java: 面向对象的语言对象、属性、类通过方法操作对象mysql:关系型数据库行、字段、表的设计通过SQL语句操作表中数据

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

  • 两者的映射: - 一张表的设计 – 一个类- 表中的一个字段 – 类中的一个属性- 表中的一行数据 – 一个对象- 一条SQL – 一个方法


实践部分:

1、实体类

  • 作用:跟数据库中表的设计进行映射,解决了两者之间数据格式不同的问题
    java数据库类:对对象的设计表:对字段的设计属性字段:列对象行

  • 要求: 1. 一张表对应一个实体类2. 类名必须与表名相关3. 类必须实现Serializable接口4. 一个字段对应一个属性5. 属性类型必须为引用类型6. 必须提供无参构造(建议全属性有参构造同步存在)7. 为了保证对象安全,正常对属性进行封装

/**
 * 映射t_user表
 */publicclassUserimplementsSerializable{privateInteger id;privateString name;privateString sex;privateInteger age;publicUser(){}publicUser(Integer id,String name,String sex,Integer age){this.id = id;this.name = name;this.sex = sex;this.age = age;}publicIntegergetId(){return id;}publicvoidsetId(Integer id){this.id = id;}publicStringgetName(){return name;}publicvoidsetName(String name){this.name = name;}publicStringgetSex(){return sex;}publicvoidsetSex(String sex){this.sex = sex;}publicIntegergetAge(){return age;}publicvoidsetAge(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()
  • 实现:1. 一张表对应一个接口,接口中存放着对该表的所有操作的行为方法2. 接口名应与表名相关:t_user-->UserDao3. 包:com.xxx.dao- 实现类: 1. 一个实现类实现一个接口2. 实现类的命名:UserDao-->UserDaoImpl3. 包:com.xxx.dao.impl
  • 优点:让方法声明与方法实现分离,可以促使接口成为一套行为规范,该规范可以拥有多种不同的实现方式,提高程序的可扩展性

UserDao接口:

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

UserDaoImpl实现:

packagecom.bz.dao.impl;importcom.bz.dao.UserDao;importcom.bz.entity.User;/**
 * 分别在不同的方法中使用JDBC6大步实现不同的功能方法
 */publicclassUserDaoImplimplementsUserDao{@OverridepublicintinsertUser(User user)throwsException{//1. 加载驱动Class.forName("com.mysql.cj.jdbc.Driver");//2. 获取连接//用户名String username ="root";//密码String pwd ="123456";//连接的urlString 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;//把受影响行数返回}@OverridepublicUserseleteUserById(Integer id)throwsException{User user=null;//用来返回的User对象//1. 加载驱动Class.forName("com.mysql.cj.jdbc.Driver");//2. 获取连接//用户名String username ="root";//密码String pwd ="123456";//连接的urlString url ="jdbc:mysql://localhost:3306/baizhi2109?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=Asia/Shanghai";Connection conn =DriverManager.getConnection(url, username, pwd);//准备发送SQLString 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=newUser(uid, uname, usex, uage);}//关闭资源
        rs.close();
        ps.close();
        conn.close();return user;}}

测试UserDao的接口实现类:

packagecom.bz.test;importcom.bz.dao.UserDao;importcom.bz.dao.impl.UserDaoImpl;importcom.bz.entity.User;publicclassTestUser{publicstaticvoidmain(String[] args)throwsException{//创建实现类对象UserDao ud=newUserDaoImpl();//测试查询方法User user= ud.seleteUserById(2);System.out.println(user);//创建用来添加的对象User user =newUser("zhangsan","男",38);//调用添加方法,接收返回值int n = ud.insertUser(user);//判断返回值if(n>0){System.out.println("添加成功");}else{System.out.println("添加失败");}}}

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

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

1、JDBCUtils的具体代码实现

packagecom.bz.util;importjava.sql.*;/**
 * 工具类:方便方法调用,所有方法都应为静态方法
 */publicclassJDBCUtils{publicstaticConnectiongetConnection(){Connection conn =null;try{//1. 加载驱动Class.forName("com.mysql.cj.jdbc.Driver");//2. 获取连接//用户名String username ="root";//密码String pwd ="123456";//连接的urlString 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
     */publicstaticvoidclose(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、调用工具类

publicclassUserDaoImplimplementsUserDao{@OverridepublicintinsertUser(User user)throwsException{//调用工具类的方法获取连接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;//把受影响行数返回}}

希望大家可以在这篇文章中学到ORM思想,此外可以参加投票,我将会在后续文章中做出改进,感谢你的配合!

本文转载自: https://blog.csdn.net/m0_58618795/article/details/126630412
版权归原作者 微凉秋意 所有, 如有侵权,请联系我们删除。

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

还没有评论