文章目录

  • DAO和增删改查通用方法-BasicDao
    • 分析问题
      • 图形介绍
      • 基本说明
    • 应用实例
      • utils包
      • domain包
      • DAO包
      • test包
    • 案例练习
      • DAO包
      • domain包
      • test包

DAO和增删改查通用方法-BasicDao

分析问题

  • apache-dbutils + Druid 简化了JDBC开发,但还有不足:
  1. SQL语句是固定,不能通过参数传入,通用性不好,需要进行改进,更方便执行增删改查
  2. 对于select操作,如果有返回值,返回值类型不能固定,需要使用泛型
  3. 将来的表很多,也无需求复杂,不可能只靠一个Java类完成
  4. 引出 => BasicDAO图形分析

图形介绍

基本说明

  1. DAO:data access object数据访问对象(访问数据的对象)

  2. 这样的通用类,称为BasicDao,是专门和数据库交互的,即完成对数据库(表)的crud操作

  3. 在BaiscDao的基础上,实现一张表对应一个Dao,更好的完成功能,比如Customer表Customer.java类(javabean)-CustomerDao.java

应用实例

完成一个简单设计

  1. com.taotao.dao_.utils//工具类
  2. com.taotao.dao_.domain//javabean
  3. com.taotao.dao_.dao//存放XxxDAO 和 BasicDAO
  4. com.taotao.dao_.test//写测试类

utils包

package com.taotao.dao_.utils;import com.alibaba.druid.pool.DruidDataSourceFactory;import javax.sql.DataSource;
import java.io.FileInputStream;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;/*** Create By 刘鸿涛* 2022/3/5 13:24* 基于 druid 数据库池的工具类*/
@SuppressWarnings({"all"})
public class JDBCUtilsByDruid {private static DataSource ds;//在静态代码块完成 ds初始化static {Properties properties = new Properties();try {properties.load(new FileInputStream("src\\druid.properties"));ds = DruidDataSourceFactory.createDataSource(properties);}catch(Exception e){e.printStackTrace();}}//编写getConnection方法public static Connection getConnection() throws SQLException {return ds.getConnection();}//关闭连接,再次强调,在数据库连接池技术中心,close不是真的断掉连接//而是把使用的Connection对象放回连接池public static void close(ResultSet resultSet, Statement statement, Connection connection){try {if (resultSet != null){resultSet.close();}if (statement != null){statement.close();}if (connection != null){connection.close();}} catch (SQLException e) {throw new RuntimeException(e);}}}

domain包

package com.taotao.dao_.domain;import java.time.LocalDateTime;
import java.util.Date;/*** Create By 刘鸿涛* 2022/3/5 16:00* Actor 对象和 actor 表的记录对应*/
@SuppressWarnings({"all"})
public class Actor {private Integer Id;private String name;private String sex;private LocalDateTime borndate;private String phone;public Actor() {    //一定要给一个无参构造器【反射需要】}public Actor(Integer id, String name, String sex, LocalDateTime borndate, String phone) {Id = id;this.name = name;this.sex = sex;this.borndate = borndate;this.phone = phone;}public Integer getId() {return Id;}public void setId(Integer id) {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 LocalDateTime getBorndate() {return borndate;}public void setBorndate(LocalDateTime borndate) {this.borndate = borndate;}public String getPhone() {return phone;}public void setPhone(String phone) {this.phone = phone;}@Overridepublic String toString() {return "\nActor{" +"Id=" + Id +", name='" + name + '\'' +", sex='" + sex + '\'' +", borndate=" + borndate +", phone='" + phone + '\'' +'}';}
}

DAO包

package com.taotao.dao_.dao;import com.taotao.jdbc.datasource.JDBCUtilsByDruid;
import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.BeanListHandler;
import org.apache.commons.dbutils.handlers.ScalarHandler;import java.sql.Connection;
import java.sql.SQLException;
import java.util.List;/*** Create By 刘鸿涛* 2022/3/6 16:05* 开发BasicDAO,是其他DAO的父类*/
@SuppressWarnings({"all"})
public class BasicDAO<T> { //泛型指定具体类型private QueryRunner qr = new QueryRunner();//开发通用的dml方法,针对任意的表public int dml(String sql,Object...parameters) {Connection connection = null;try {connection = JDBCUtilsByDruid.getConnection();int update = qr.update(connection, sql, parameters);return update;} catch (SQLException e) {//编译异常转为运行异常throw new RuntimeException(e);  //将编译异常 -> 运行异常,抛出} finally {JDBCUtilsByDruid.close(null,null,connection);}}/**** @param sql   sql 语句,可以有?* @param clazz clazz 传入一个类的Class对象 比如 Actor.class* @param parameters  传入 ?的具体的值,可以是多个* @return 根据Actor.class 返回对应的ArrayList 集合*///返回多个对象(即查询的结果是多行),针对任意表public List<T> queryMulti(String sql,Class<T> clazz,Object...parameters){Connection connection = null;try {connection = JDBCUtilsByDruid.getConnection();return qr.query(connection,sql,new BeanListHandler<T>(clazz),parameters);} catch (SQLException e) {//编译异常转为运行异常throw new RuntimeException(e);  //将编译异常 -> 运行异常,抛出} finally {JDBCUtilsByDruid.close(null,null,connection);}}//查询单行结果的通用方法public T querySingle(String sql, Class<T> clazz,Object...parameters){Connection connection = null;try {connection = JDBCUtilsByDruid.getConnection();return (T) qr.query(connection, sql, new BeanListHandler<T>(clazz), parameters);} catch (SQLException e) {//编译异常转为运行异常throw new RuntimeException(e);  //将编译异常 -> 运行异常,抛出} finally {JDBCUtilsByDruid.close(null,null,connection);}}//查询单行单列的方法,即返回单值的方法public Object queryScalar(String sql,Object...parameters){Connection connection = null;try {connection = JDBCUtilsByDruid.getConnection();return qr.query(connection,sql,new ScalarHandler(),parameters);} catch (SQLException e) {//编译异常转为运行异常throw new RuntimeException(e);  //将编译异常 -> 运行异常,抛出} finally {JDBCUtilsByDruid.close(null,null,connection);}}
}
package com.taotao.dao_.dao;/*** Create By 刘鸿涛* 2022/3/6 16:44*/
@SuppressWarnings({"all"})
public class ActorDAO extends BasicDAO{//1.就有BasicDAO 的方法//2.根据业务需求,可以编写特有的方法
}

test包

package com.taotao.dao_.test;import com.taotao.dao_.dao.ActorDAO;
import com.taotao.dao_.dao.GoodsDAO;
import com.taotao.dao_.domain.Actor;
import org.junit.Test;import java.util.List;/*** Create By 刘鸿涛* 2022/3/6 16:45*/
@SuppressWarnings({"all"})
public class TestDAO {@Test//测试ActorDAO 对actor表crud操作public void testActorDAO() {ActorDAO actorDAO = new ActorDAO();//1.查询List<Actor> actors = actorDAO.queryMulti("select * from actor where Id >= ?", Actor.class, 1);System.out.println("===查询结果===");for(Actor actor:actors){System.out.print(actor);}//        //2.查询单行记录
//        Actor actor = (Actor) actorDAO.querySingle("select * from actor where id = ?", Actor.class, 1);
//        System.out.println("====查询单行结果====");
//        System.out.println(actor);//3.查询单行单列Object o = actorDAO.queryScalar("select name from actor where id = ?", 1);System.out.println("\n===查询单行单列值===");System.out.println(o);//4.dml操作 insert,update,delete//返回受影响的行数System.out.println("===开始执行添加语句===");int dml = actorDAO.dml("insert into actor values(3,?,?,?,?)", "涛涛", "男","1984-10-15", "12454454");System.out.println(dml > 0?"执行成功":"执行没有结果");}
}

案例练习

  1. 建立goods表
  2. domain中建Goods类
  3. DAO中建GoodsDAO继承BasicDAO
  4. testDao类中测试

mysql中建立表

表结构为

DAO包

直接继承BasicDAO包即可

package com.taotao.dao_.dao;/*** Create By 刘鸿涛* 2022/3/6 17:47*/
public class GoodsDAO extends BasicDAO{}

domain包

package com.taotao.dao_.domain;/*** Create By 刘鸿涛* 2022/3/6 17:49*/
public class Goods {private Integer id;private String goods_name;private Integer price;public Goods() {}public Goods(Integer id, String goods_name, Integer price) {this.id = id;this.goods_name = goods_name;this.price = price;}public int getId() {return id;}public void setId(Integer id) {this.id = id;}public String getGoods_name() {return goods_name;}public void setGoods_name(String goods_name) {this.goods_name = goods_name;}public int getPrice() {return price;}public void setPrice(Integer price) {this.price = price;}@Overridepublic String toString() {return "Goods{" +"id=" + id +", goods_name='" + goods_name + '\'' +", price=" + price +'}';}
}

test包

package com.taotao.dao_.test;import com.taotao.dao_.dao.ActorDAO;
import com.taotao.dao_.dao.GoodsDAO;
import com.taotao.dao_.domain.Actor;
import org.junit.Test;import java.util.List;/*** Create By 刘鸿涛* 2022/3/6 16:45*/
@SuppressWarnings({"all"})
public class TestDAO {@Testpublic void testGoodsDAO(){GoodsDAO goodsDAO = new GoodsDAO();int dml = goodsDAO.dml("insert into goods values(?,?,?)", null, "华为手机", 3000);System.out.println(dml >0 ?"执行成功":"执行失败");}
}

MySQL攻略 -DAO和增删改查通用方法-BasicDAO的认知与实现、案例练习相关推荐

  1. Java+MyEclipse+Tomcat (六)详解Servlet和DAO数据库增删改查操作

    此篇文章主要讲述DAO.Java Bean和Servlet实现操作数据库,把链接数据库.数据库操作.前端界面显示分模块化实现.其中包括数据的CRUD增删改查操作,并通过一个常用的JSP网站前端模板界面 ...

  2. java servlet dao_Java+MyEclipse+Tomcat 详解Servlet和DAO数据库增删改查操作(源码)

    [实例简介] 该资源主要参考自己的博客http://blog.csdn.net/eastmount/article/details/45936121 讲诉Java+MyEclipse+Tomcat 详 ...

  3. Mysql —— C语言链接mysql数据库,实现可以增删改查的角色权限登录系统

    /******************************************************************** * 标题:C语言链接mysql数据库,实现可以增删改查的角色 ...

  4. Node连接MySQL数据库进行基本的增删改查操作(一看就会)

    Node连接MySQL数据库进行基本的增删改查操作(一看就会) ❤️ ❤️ ❤️ ❤️ ❤️ ❤️ ❤️ ❤️ ❤️ ❤️ ❤️ ❤️ ❤️ ❤️ ❤️ ❤️ ❤️ ❤️ ❤️ ❤️ ❤️ ❤️ ❤️ ...

  5. MYSQL - database 以及 table 的增删改查

    MYSQL - database 以及 table 的增删改查 MySQL的相关概念介绍 MySQL 为关系型数据库(Relational Database Management System), 这 ...

  6. MySQL 使用SQL语句实现 增删改查

    MySQL 使用SQL语句实现 增删改查 环境准备:MySQL,navicat 一.增加数据 语法: INSERT INTO 表名(字段1,字段2,字段3...) VALUES(值1,值2,值3... ...

  7. mysql创建数据表列子,MySQL 创建数据库及简单增删改查

    MySQL 创建数据库及简单增删改查 我们可以在登陆 MySQL 服务后,使用 create 命令创建数据库,语法如下: CREATE DATABASE 数据库名; 登入: Enter passwor ...

  8. 1-1 MySQL数据库的基本操作 【增删改查】

    1-1 MySQL数据库的基本操作 [增删改查] 一.基础操作 创建数据库 查看数据库 选择数据库 删除数据库 二.建立一个基础数据库 三.基本操作 外键约束与字段自增 数据的增删改 数据查询 数据排 ...

  9. SpringBoot+Mysql+MDUI实现数据的增删改查和列表操作及单,多文件上传实例

    SpringBoot+Mysql+MDUI实现数据的增删改查和列表操作及单,多文件上传实例 开源地址:https://gitee.com/jfkjrym/demo.git evan原创内容!evan原 ...

最新文章

  1. 四大组件之 Activity_任务和返回栈
  2. python程序运行时间计时软件_python中的计时器timeit的使用方法
  3. java 移动页面中的图片上传_HTML5移动端图片上传(一)
  4. MySQLdb安装的错误说明
  5. “打工皇帝”唐骏的成功4+1理论
  6. 一种解决Android studio 3.0 Build报错的方法
  7. CSS之after与before的content 和 attr 配合使用
  8. popen函数的实现
  9. 求n的阶乘【VB代码实现】
  10. QQ音乐自定义音效通用设置
  11. GetWindowRect,GetClientRect,ScreenToClient MoveWindow SetWindowPos 用法说明
  12. Vblog#2 DAY1
  13. matlab学习笔记 repmat函数与kron函数之区别
  14. 编译原理——NFA确定化和DFA最小化
  15. 针对 Windows 和 WSUS 的 2019 SHA-2 代码签名支持要求
  16. Oracle 工具篇+Oracle Remote Diagnostic Agent(RDA)
  17. 每日MySQL之024:FLUSH TABLES
  18. 伪随机生成器具体实现——杂乱的方法
  19. 关于华为昆仑关键业务服务器
  20. word2vec聚类

热门文章

  1. 2021-10-24 NodeJS面试题
  2. 利用 shopsn 搭建 Web电子商城+IOS+安卓+API 客户端 ,ShopSN介绍
  3. ch340 win7 64位驱动下载 win10也可以用
  4. 苏州大学计算机在南京就业,江苏这几所学校实力强,就业前景好,赶紧收藏
  5. mysql优化or_mysql or语句的优化
  6. 一个网址,需要生成一个带有人脸识别功能的APP如何做?
  7. java根据生日精确计算年龄_java根据出生日期计算年龄(精确到天)
  8. invalid use of incomplete type ‘class Ui ::Ccam_para_set‘的解决办法
  9. 问题1.“程序兼容性助手:无法在此设备上加载驱动程序” ——【“Usb-blaster”、“Hardlock.sys”】。问题2.“关闭内存完整性 后电脑开机一直循环重启,进不去window系统”
  10. MATLAB 绘制圆点标定板