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

1.创建实体类

  1. package com.aaa.entity;
  2.  
  3. /**
  4. * 学生实体类 ---- table student
  5. */
  6. public class Student {
  7. /* 成员变量 属性 */
  8. private int id;
  9. private String name;
  10. private int age;
  11.  
  12. /*构造函数*/
  13. public Student() {
  14.  
  15. }
  16. public Student(int id, String name, int age) {
  17. this.id = id;
  18. this.name = name;
  19. this.age = age;
  20. }
  21.  
  22. /*set和get*/
  23. public int getId() {
  24. return id;
  25. }
  26.  
  27. public void setId(int id) {
  28. this.id = id;
  29. }
  30.  
  31. public String getName() {
  32. return name;
  33. }
  34.  
  35. public void setName(String name) {
  36. this.name = name;
  37. }
  38.  
  39. public int getAge() {
  40. return age;
  41. }
  42.  
  43. public void setAge(int age) {
  44. this.age = age;
  45. }
  46.  
  47. /*toString*/
  48. @Override
  49. public String toString() {
  50. return "Student{" +
  51. "id=" + id +
  52. ", name='" + name + '\'' +
  53. ", age=" + age +
  54. '}';
  55. }
  56. }

2.创建DAO(接口)

  1. package com.aaa.dao;
  2.  
  3. import com.aaa.entity.Student;
  4.  
  5. /**
  6. * 学生表的DAO
  7. */
  8. public interface IStudentDAO {
  9.  
  10. /**
  11. * 添加新学生
  12. * insert into student (name,age) values (?,?);
  13. * 两个以上的参数 全用对象出传参
  14. * @param 学生对象 里面存放当这需要添加的学生信息
  15. * @return boolean 成功返回 true 失败 返回 false
  16. */
  17. boolean add(Student s);
  18.  
  19. /**\
  20. * 根据id删除学生
  21. * delete from student where id = ?
  22. */
  23. boolean delete(int id);
  24.  
  25. /**
  26. * 根据id修改学生
  27. * update student set name = ?,age= ? where id = ?
  28. */
  29. boolean update(Student s);
  30.  
  31. }

2.1创建dao层 (实现类)

  1. package com.aaa.dao.impl;
  2.  
  3. import com.aaa.dao.IStudentDAO;
  4. import com.aaa.entity.Student;
  5. import com.aaa.util.DBUtil;
  6.  
  7. import java.sql.Connection;
  8. import java.sql.DriverManager;
  9. import java.sql.PreparedStatement;
  10.  
  11. public class StudentDAOImpl implements IStudentDAO {
  12.  
  13. //借助工具类 增加数据
  14. @Override
  15. public boolean add(Student s) {
  16.  
  17. String sql = "insert into student (name,age) values (?,?)";
  18. return DBUtil.executeUpdate(sql,s.getName(),s.getAge());
  19.  
  20. }
  21. //借助工具类 删除
  22. @Override
  23. public boolean delete(int id) {
  24. String sql = "delete from student where id = ?";
  25.  
  26. return DBUtil.executeUpdate(sql,id);
  27.  
  28. }
  29. //借助工具类 修改数据
  30. @Override
  31. public boolean update(Student s) {
  32. String sql = "update student set name=?,age=? where id = ?";
  33.  
  34. return DBUtil.executeUpdate(sql,s.getName(),s.getAge(),s.getId());
  35. }
  1. //查询所有
    @Override
  2. public List<Map<String, Object>> getAllStu() {
  3. //原生代码
  4. /* try {
  5. List<Map<String,Object>> list=new ArrayList<>();
  6. Connection conn = DBUtils.getConnection();
  7. String sql="select * from student";
  8.  
  9. PreparedStatement ps = conn.prepareStatement(sql);
  10. ResultSet rs = ps.executeQuery();
  11. while(rs.next()){
  12. Map<String,Object> maps=new HashMap<>();
  13. maps.put("id",rs.getObject("id"));
  14. maps.put("name",rs.getObject("name"));
  15. maps.put("age",rs.getObject("age"));
  16. list.add(maps);
  17. }
  18. return list;
  19.  
  20. } catch (SQLException e) {
  21. e.printStackTrace();
  22. }*/
  23.  
  24. //借助工具类 查询所有
  25. String sql="select * from student";
  26. List<Map<String, Object>> list = DBUtils.executeQuery(sql);
  27. if (list.size()>0){
  28. return list;
  29. }
  30. return null;
  31. }
  1.  
  1. }

工具类

  1. package com.aaa.util;
  2.  
  3. import java.sql.Connection;
  4. import java.sql.DriverManager;
  5. import java.sql.PreparedStatement;
  6. import java.sql.SQLException;
  7.  
  8. public class DBUtil {
  9.  
  10. static {
  11. try {
  12. Class.forName("com.mysql.jdbc.Driver");
  13. } catch (ClassNotFoundException e) {
  14. e.printStackTrace();
  15. }
  16. }
  17.  
  18. public static Connection getConnection(){
  19. try {
  20. return DriverManager.getConnection("jdbc:mysql://localhost:3306/test?characterEnconding=UTF-8", "root", "123456");
  21. } catch (SQLException e) {
  22. e.printStackTrace();
  23. }
  24. return null;
  25. }
  26. /** 增删改的通用方法
  27. * @param String sql 要执行的sql
  28. * @param Object[] obj 对象类型的数组 里面存放着 sql执行的占位符参数
  29. * 【name,age,id】
  30. * 【id】
  31. * 【name,age】
  32. * Object... 可变参数
  33. * */
  34. public static boolean executeUpdate(String sql,Object... args){
  35.  
  36. PreparedStatement ps = null;
  37. try {
  38. ps = getConnection().prepareStatement(sql);
  39.  
  40. for (int i=0;i<args.length;i++){
  41. ps.setObject(i+1,args[i]);
  42. }
  43.  
  44. /* ps.setObject(1,s.getName());
  45. ps.setObject(2,s.getAge());
  46. ps.setObject(3,s.getId());*/
  47.  
  48. int i = ps.executeUpdate();
  49. if (i>0)return true;
  50. } catch (SQLException e) {
  51. e.printStackTrace();
  52. } finally {
  53. //关闭
  54. }
  55.  
  56. return false;
  57. }
  1. /**
  2. * 查询的通用方法
  3. * @param sql
  4. * @param args
  5. * @return
  6. */
  7. public static List<Map<String, Object>> executeQuery(String sql, Object... args) {
  8.  
  9. try {
  10. /**
  11. * 需要将所有数据都存到List中 每一行 用一个map存放
  12. */
  13. List<Map<String, Object>> list = new ArrayList<>();
  14. Connection conn = DBUtils.getConnection();
  15. PreparedStatement ps = conn.prepareStatement(sql);
  16. /**
  17. * 有可能有参数 查询不是所有 而是查询其中几条
  18. */
  19. for (int i = 0; i < args.length; i++) {
  20. ps.setObject(i + 1, args[i]);
  21. }
  22. /**
  23. * 执行sql
  24. */
  25. ResultSet rs = ps.executeQuery();
  26. /**
  27. *获得本次查询的总列数
  28. */
  29. int count = rs.getMetaData().getColumnCount();
  30.  
  31. while (rs.next()) {
  32. Map<String, Object> maps = new HashMap<>();
  33. for (int i = 1; i <= count; i++) {
  34. /**
  35. * 获得每列的字段名
  36. */
  37. String name = rs.getMetaData().getColumnLabel(i);
  38. maps.put(name, rs.getObject(i));
  39.  
  40. }
  41. /**
  42. * 将每行的map存放到List中
  43. */
  44. list.add(maps);
  45. }
  46. return list;
  47. } catch (SQLException e) {
  48. e.printStackTrace();
  49. }
  50. return null;
  51. }
  52.  
  53. /**
  54. * 关闭的通用方法
  55. */
  56. private static void close(Connection conn, PreparedStatement ps, ResultSet rs) {
  57. try {
  58. if (rs != null) {
  59. rs.close();
  60. }
  61. if (ps != null) {
  62. ps.close();
  63. }
  64. if (conn != null) {
  65. conn.close();
  66. }
  67. } catch (Exception e) {
  68. e.printStackTrace();
  69. }
  70. }
  1.  
  1. }

测试类(模拟Servlet)

  1. package com.aaa.servlet;
  2.  
  3. import com.aaa.dao.IStudentDAO;
  4. import com.aaa.dao.impl.StudentDAOImpl;
  5. import com.aaa.entity.Student;
  6. import org.junit.Test;
  7.  
  8. public class JavaTest {
  9.  
  10. @Test
  11. public void test1(){
  12.  
  13. Student s = new Student(1, "测试吃饭", 28);
  14.  
  15. /*测试 dao 的增删改*/
  16. IStudentDAO dao = new StudentDAOImpl();
  17.  
  18. /*增*/
  19. dao.add(s);
  20.  
  21. dao.delete(3);
  22.  
  23. dao.update(s);
  1. //查询所有 借助工具类 增删改代码可不写
  2. IStudentDAO sd=new StudentDAOImpl();
  3. List<Map<String, Object>> allStu = sd.getAllStu();
  4. System.out.println(allStu);
  1.  
  1.  
  2. }
  3.  
  4. }

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

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

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

  2. jdbc 增删改查以及遇见的 数据库报错Can'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 增删改查 简单封装(基于 FMDB)

    /** *  对 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. vulnhub writeup - 持续更新

    目录 wakanda: 1 0. Description 1. flag1.txt 2. flag2.txt 3. flag3.txt Finished Tips Basic Pentesting: ...

  2. docker容器日志收集方案(方案三 filebeat+journald本地日志收集)

    其实方案三和方案二日志采集套路一样,但是还是有点差别. 差别就在于日志格式如下: ​ 为了方便对比吧日志贴上来 Nov 16 10:51:58 localhost 939fe968a91d[4721] ...

  3. Spring类型转换(Converter)

    Spring的类型转换 以前在面试中就有被问到关于spring数据绑定方面的问题,当时对它一直只是朦朦胧胧的概念,最近稍微闲下来有时间看了一下其中数据转换相关的内容,把相应的内容做个记录. 下面先说明 ...

  4. .NET CORE学习笔记系列(1)——ASP.NET MVC Core 介绍和项目解读

    ASP.NET MVC Core 项目文件夹解读 一.项目文件夹总览 1.1.Properties——launchSettings.json 启动配置文件,你可以在项目中“Properties”文件夹 ...

  5. Django 【orm】或

    方式一: q=Q() q.connection="or" q.children.append(("pk",1)) q.children.append((&quo ...

  6. 基于SpringMVC拦截器和注解实现controller中访问权限控制

    SpringMVC的拦截器HandlerInterceptorAdapter对应提供了三个preHandle,postHandle,afterCompletion方法. preHandle在业务处理器 ...

  7. Java项目的导入和导出

    在很多情况下,需要将当前的 Java工程传递给其他人继续工作, 或协同工作,或者是从其他人那里接收到传递来的Java项目, 就需要掌握 Java项目的导入和导出. 以 Hello World 为例: ...

  8. 错误代码1045 Access denied for user 'root'@'localhost' (using password:YES)

    在mysql中新建连接,ip地址是127.0.0.1,账号是root,密码是123456,但是测试连接的时候报错, 错误代码1045 Access denied for user 'root'@'lo ...

  9. 基于vue-simple-uploader封装文件分片上传、秒传及断点续传的全局上传插件

    目录 1. 前言 2. 关于vue-simple-uploader 3. 基于vue-simple-uploader封装全局上传组件 4. 文件上传流程概览 5. 文件分片 6. MD5的计算过程 7 ...

  10. Github 上 Star 最多的个人 Spring Boot 开源学习项目

    2016年,在一次技术调研的过程中认识到了 Spring Boot ,试用之后便一发不可收拾的爱上它.为了防止学习之后忘记,就在网上连载了 Spring Boot 系列文章,没想到这一开始便与 Spr ...