jdbc增删改查进行封装

时间:2022-11-07 18:20:22
jdbc封装

1   dao (代码分层)
com.aaa.dao 存放dao相关的类型 例如 StudentDAOImpl 处理 数据库的链接 存取数据
com.aaa.servlet 存放servlet相关的类 例如:StudentServlet 处理 与浏览器交互的类
com.aaa.entity 存放实体类 例如 Student 接受数据库对象模型
com.aaa.util 存放工具类 例如 DBUtil
2 练习 模拟 servlet调用 dao
2.1 创建一个数据库表 Student( id name age )
2.2 创建数据库表对应的实体类 (为什么要创建实体类?作用:以后数据库表中的数据 提取到 java中的时候 用 对象来存储)
2.3 创建DAO
A 组成 两部分: 接口 ( 声明 )和 实现类
接口的命名规则例如: IStudentDAO I 代表这是一个接口 Student 对应业务名称(表名) DAO 后缀 表明当前是一个dao接口
实现类的命名规则例如: StudentDAOImpl Student 代表业务名称(表明) DAOImpl 代表dao接口的实现
为什么需要接口+实现类? 因为 我们需要一个多态的特征。
---------------------多态------------------------
什么是多态? 多种状态
如何产生多态? 继承多态 父类的引用 子类的对象 例如 : Animal a = new Dog(); 基本上不用
接口多态 接口的应用 实现类的对象 例如: IStudentDAO dao = new StudentDAOImpl();
为什么要使用多态? 程序解耦 解除程序的耦合性
(不使用多态会产生什么问题?)
------------------------------------------------
B 接口声明的方法(接口中该写哪些方法)
重要:根据业务需求 / CRUD 增删改查
2.4 接口中 声明 五个方法 (一个方法:返回值 参数 试想一下 这个业务的sql )
A 添加新学生
B 根据id删除学生
C 根据id修改学生
D 根据id查询学生
E 查询所有学生
2.5 对方法完成实现
2.6 测试代码
3 jdbc封装
我们发现 在dao的实现类中 有很多重复代码 我们可以将其封装起来
3.1 创建一个类 DBUtil
3.2 加载驱动和建立链接的代码 完全一样
加載驅動写到静态代码快中 :因为 驱动只需要加载一次即可 比如:你安装了一台电脑 只需要下载一次qq 以后直接使用就可以了
类的静态代码块 随着类的加载 只执行一次
建立链接的代码 单独创建一个方法 通过返回值返回链接对象:为什么链接要链接多次 因为链接用完了就关闭了
3.3 关闭的代码也需要封装
3.4 增删改的预处理代码 也基本一样 4.11日 练习 1 dao的创建 2 增删改的三个方法(声明) 3 学会使用 DBUtil 4 弄清楚 executeupdate的原理 5 能自主封装
最终目的 dao封装 20分钟

1.创建实体类

package com.aaa.entity;

/**
* 学生实体类 ---- table student
*/
public class Student {
/* 成员变量 属性 */
private int id;
private String name;
private int age; /*构造函数*/
public Student() { }
public Student(int id, String name, int age) {
this.id = id;
this.name = name;
this.age = age;
} /*set和get*/
public int getId() {
return id;
} public void setId(int id) {
this.id = id;
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public int getAge() {
return age;
} public void setAge(int age) {
this.age = age;
} /*toString*/
@Override
public String toString() {
return "Student{" +
"id=" + id +
", name='" + name + '\'' +
", age=" + age +
'}';
}
}

2.创建DAO(接口)

package com.aaa.dao;

import com.aaa.entity.Student;

/**
* 学生表的DAO
*/
public interface IStudentDAO { /**
* 添加新学生
* insert into student (name,age) values (?,?);
* 两个以上的参数 全用对象出传参
* @param 学生对象 里面存放当这需要添加的学生信息
* @return boolean 成功返回 true 失败 返回 false
*/
boolean add(Student s); /**\
* 根据id删除学生
* delete from student where id = ?
*/
boolean delete(int id); /**
* 根据id修改学生
* update student set name = ?,age= ? where id = ?
*/
boolean update(Student s); }

2.1创建dao层 (实现类)

package com.aaa.dao.impl;

import com.aaa.dao.IStudentDAO;
import com.aaa.entity.Student;
import com.aaa.util.DBUtil; import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement; public class StudentDAOImpl implements IStudentDAO { //借助工具类 增加数据
@Override
public boolean add(Student s) { String sql = "insert into student (name,age) values (?,?)";
return DBUtil.executeUpdate(sql,s.getName(),s.getAge()); }
//借助工具类 删除
@Override
public boolean delete(int id) {
String sql = "delete from student where id = ?"; return DBUtil.executeUpdate(sql,id); }
//借助工具类 修改数据
@Override
public boolean update(Student s) {
String sql = "update student set name=?,age=? where id = ?"; return DBUtil.executeUpdate(sql,s.getName(),s.getAge(),s.getId());
}
//查询所有 
@Override
public List<Map<String, Object>> getAllStu() {
//原生代码
/* try {
List<Map<String,Object>> list=new ArrayList<>();
Connection conn = DBUtils.getConnection();
String sql="select * from student"; PreparedStatement ps = conn.prepareStatement(sql);
ResultSet rs = ps.executeQuery();
while(rs.next()){
Map<String,Object> maps=new HashMap<>();
maps.put("id",rs.getObject("id"));
maps.put("name",rs.getObject("name"));
maps.put("age",rs.getObject("age"));
list.add(maps);
}
return list; } catch (SQLException e) {
e.printStackTrace();
}*/ //借助工具类 查询所有
String sql="select * from student";
List<Map<String, Object>> list = DBUtils.executeQuery(sql);
if (list.size()>0){
return list;
}
return null;
}

}

工具类

package com.aaa.util;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException; public class DBUtil { static {
try {
Class.forName("com.mysql.jdbc.Driver");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
} public static Connection getConnection(){
try {
return DriverManager.getConnection("jdbc:mysql://localhost:3306/test?characterEnconding=UTF-8", "root", "123456");
} catch (SQLException e) {
e.printStackTrace();
}
return null;
}
/** 增删改的通用方法
* @param String sql 要执行的sql
* @param Object[] obj 对象类型的数组 里面存放着 sql执行的占位符参数
* 【name,age,id】
* 【id】
* 【name,age】
* Object... 可变参数
* */
public static boolean executeUpdate(String sql,Object... args){ PreparedStatement ps = null;
try {
ps = getConnection().prepareStatement(sql); for (int i=0;i<args.length;i++){
ps.setObject(i+1,args[i]);
} /* ps.setObject(1,s.getName());
ps.setObject(2,s.getAge());
ps.setObject(3,s.getId());*/ int i = ps.executeUpdate();
if (i>0)return true;
} catch (SQLException e) {
e.printStackTrace();
} finally {
//关闭
} return false;
}
/**
* 查询的通用方法
* @param sql
* @param args
* @return
*/
public static List<Map<String, Object>> executeQuery(String sql, Object... args) { try {
/**
* 需要将所有数据都存到List中 每一行 用一个map存放
*/
List<Map<String, Object>> list = new ArrayList<>();
Connection conn = DBUtils.getConnection();
PreparedStatement ps = conn.prepareStatement(sql);
/**
* 有可能有参数 查询不是所有 而是查询其中几条
*/
for (int i = 0; i < args.length; i++) {
ps.setObject(i + 1, args[i]);
}
/**
* 执行sql
*/
ResultSet rs = ps.executeQuery();
/**
*获得本次查询的总列数
*/
int count = rs.getMetaData().getColumnCount(); while (rs.next()) {
Map<String, Object> maps = new HashMap<>();
for (int i = 1; i <= count; i++) {
/**
* 获得每列的字段名
*/
String name = rs.getMetaData().getColumnLabel(i);
maps.put(name, rs.getObject(i)); }
/**
* 将每行的map存放到List中
*/
list.add(maps);
}
return list;
} catch (SQLException e) {
e.printStackTrace();
}
return null;
} /**
* 关闭的通用方法
*/
private static void close(Connection conn, PreparedStatement ps, ResultSet rs) {
try {
if (rs != null) {
rs.close();
}
if (ps != null) {
ps.close();
}
if (conn != null) {
conn.close();
}
} catch (Exception e) {
e.printStackTrace();
}
}

}

测试类(模拟Servlet)

package com.aaa.servlet;

import com.aaa.dao.IStudentDAO;
import com.aaa.dao.impl.StudentDAOImpl;
import com.aaa.entity.Student;
import org.junit.Test; public class JavaTest { @Test
public void test1(){ Student s = new Student(1, "测试吃饭", 28); /*测试 dao 的增删改*/
IStudentDAO dao = new StudentDAOImpl(); /*增*/
dao.add(s); dao.delete(3); dao.update(s);
 //查询所有 借助工具类   增删改代码可不写
IStudentDAO sd=new StudentDAOImpl();
List<Map<String, Object>> allStu = sd.getAllStu();
System.out.println(allStu);


    }

}

jdbc增删改查进行封装的更多相关文章

  1. JDBC增删改查,PreparedStatement和Statement的区别

    此篇是在上一篇的基础上使用PreparedStatement对象来实现JDBC增删改查的 具体工具类JDBCTools和实现类和配置文件在上一篇Statement对象实现的时候有写. 上一篇地址htt ...

  2. jdbc 增删改查以及遇见的 数据库报错Can&&num;39&semi;t get hostname for your address如何解决

    最近开始复习以前学过的JDBC今天肝了一晚上 来睡睡回笼觉,长话短说 我们现在开始. 我们先写一个获取数据库连接的jdbc封装类 以后可以用 如果不是maven环境的话在src文件下新建一个db.pr ...

  3. JDBC增删改查和查唯一的完整代码

    第一部分代码(实体类) package com.wf.entity; public class Hehe{ private int hehe_id; private String hehe_name; ...

  4. JDBC增删改查

    /* db.properties的配置 driver=com.mysql.jdbc.Driver url=jdbc:mysql://localhost:3306/day14 username=root ...

  5. iOS sqlite 增删改查 简单封装&lpar;基于 FMDB&rpar;

    /** *  对 sqlite 的使用进行简单封装,仅涉及简单的单表 增删改查 * *  基于 FMDB * *  操作基于 model ,数据库表字段与 model 属性一一对应,对 model 整 ...

  6. JAVA JDBC 增删改查简单例子

    1.数据库配置文件jdbc.properties driver=com.mysql.jdbc.Driver url=jdbc:mysql://localhost:3306/test username= ...

  7. JDBC 增删改查代码 过滤查询语句

    package test; import java.sql.Connection; import java.sql.ResultSet; import java.sql.SQLException; i ...

  8. iOS SQLite 增删改查的封装(关系型)

    在工程里导入libsqlite3.tbd库(Xcode 7) #import <UIKit/UIKit.h> @interface AppDelegate : UIResponder &l ...

  9. JDBC增删改查简单测试

    首先编写一个entity以便与数据库表文件相对应 lyTable.java public class LyTable implements java.io.Serializable { private ...

随机推荐

  1. js中push&lpar;&rpar;&comma;pop&lpar;&rpar;&comma;unshift&lpar;&rpar;&comma;shift&lpar;&rpar;的用法小结

    1.push().pop()和unshift().shift() 这两组同为对数组的操作,并且会改变数组的本身的长度及内容. 不同的是 push().pop() 是从数组的尾部进行增减,unshift ...

  2. 9&period;30notes

    memcached   缓存机制,减轻数据库负载.它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提高动态.数据库驱动网站的速度. array_slice(data['list'],0,10) ...

  3. Tomcat settings should be set in Tomcat Preference Page解决

    选择tomcat version,然户找到该tomcat的主目录,输入在tomcat home,下面的参数会自动配置,点击apply. 然后在左边选择advanced,同样把tomcat的主目录复制在 ...

  4. MySql索引的优缺点

    优点 有了索引.对于记录数量很多的表,可以提高查询速度. 缺点 索引是占用空间的. 索引会影响update insert delete速度 ALERT!!! 1.索引要创建在where和join用到的 ...

  5. (DDD)仓储的思考

    (DDD)仓储的思考 为什么需要仓储呢?领域对象(一般是聚合根)的被创建出来后的到最后持久化到数据库都需要跟数据库打交道,这样我们就需要一个类似数据库访问层的东西来管理领域对象.那是不是我们就可以设计 ...

  6. hashlib&comma;configparser&comma;logging模块

    一.常用模块二 hashlib模块 hashlib提供了常见的摘要算法,如md5和sha1等等. 那么什么是摘要算法呢?摘要算法又称为哈希算法.散列算法.它通过一个函数,把任意长度的数据转换为一个长度 ...

  7. 旧版本firefox添加扩展addons的地址

    不要在 firefox 本身的addons 中去查找, 搜索, 那个是搜索不到的, 因为那个是针对 最新版的, 旧版本的很多插件都不能用, 被移除了, 要在 那个专门 提供 插件的站点中去寻找扩展 h ...

  8. 程序员必会算法-KMP算法

    KMP算法是一种优秀的字符串匹配算法,字符串匹配的常规算法是一步一步进行移位和比较操作,直至找到完全相匹配的字符串. 下面通过一个例子,为大家仔细说明KMP算法的使用和思路: 问题: 在字符串“DEA ...

  9. 20175234 2018-2019-2 《Java程序设计》第八周学习总结

    目录 20175234 2018-2019-2 <Java程序设计>第八周学习总结 教材学习内容总结 15.1泛型 15.2链表 15.3堆栈 15.4散列映射 15.5树集 15.6树映 ...

  10. CF1101G &lpar;Zero XOR Subset&rpar;-less

    题目地址:CF1101G (Zero XOR Subset)-less 线性基基础题 预处理一个前缀异或和 \(s_i\) 这样题目就变成了:在 \(n\) 个 \(s_i\) 中尽量选择多的数使选择 ...