JDBC的封装,自己总结的自己总结的自己总结的


dao (代码分层)命名规范:

    1、com.XXX.dao    存放dao相关的类型 例如 StudentDAOImpl 处理 数据库的链接 存取数据

    2、com.XXX.servlet    存放servlet相关的类 例如:StudentServlet 处理 与浏览器交互的类

    3、com.XXX.entity     存放实体类 例如 Student 接受数据库对象模型

    4、com.XXX.util         存放工具类 例如 DBUtil


操作步骤:


首先,创建一个数据库表单,起名为Studetn。内有:id、name、age、sex四个属性。将id设为主键并且设置自动递增。


第二,在数据库建立完表单之后,在Java中创建一个数据库表单的实体类。(类名和表名一致)

内有:

    1、表单的属性值和属性的基本数据类型。

    2、无参的构造函数。

    3、有参的构造函数。

    4、Get和Set方法。

    5、toString方法。


第三:创建一个工具类。

内有:

    1、写一个静态代码块。将注册驱动写入其中。

       原因:驱动只需要加载一次即可,

          所以写在静态代码段中(static),类的静态代码块,随着类的加载,只执行一次。

    2、将建立连接进行封装。

    3、将增删改的通用方法也一并进行封装。


第四,先在dao层创建一个接口

内有:

    1、返回值类型和方法名、参数。

    1.1、可根据增删改分为不同的写法。

    1.2、两个以上的参数,全部使用对象传参。


第五:在dao层下创建一个包,命名为Impl,在这个包内创建一个接口实现类。

内有:

    1、写入SQL语句,要增删改的内容可用占位符代替。

    2、返回在工具类里给增删改通用方法设定的调用方法。

    3、在返回调用方法里加入占位符所代表的对象。


第六:在servlet里创建测试类。

内有:

    1、通过创建的实体类来赋值。

    2、通过实现类来调用接口里的方法。

    3、调用方法。


实例:


第一步:创建数据库表单。

    


第二步: 创建一个数据库表单的实体类。

    

 package com.Wuchuang.entiy;

 public class Student {

     private int id;
private String name;
private int age;
private String sex; public Student() {
} public Student(int id, String name, int age, String sex) {
this.id = id;
this.name = name;
this.age = age;
this.sex = sex;
} 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;
} public String getSex() {
return sex;
} public void setSex(String sex) {
this.sex = sex;
} @Override
public String toString() {
return "Student{" +
"id=" + id +
", name='" + name + '\'' +
", age=" + age +
", sex='" + sex + '\'' +
'}';
}
}

第三步:创建一个工具类。

    

 package com.Wuchuang.util;

 import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException; public class DBUtil {
//注册驱动,驱动只需要加载一次即可
//所以写在静态代码段中(static)
//类的静态代码块,随着类的加载,只执行一次。
static {
try {
Class.forName("com.mysql.jdbc.Driver");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
//建立链接。需要单独创建一个方法。
//通过返回值返回链接对象。
//链接每次用完之后就会关闭。
public static Connection getConnection() {
try {
return DriverManager.getConnection("jdbc:mysql:///test?characterEnconding=UTF-8", "数据库账户", "密码");
} catch (SQLException e) {
e.printStackTrace();
}
return null;
} /** 增删改的通用方法
* @param String sql 要执行的sql
* @param Object[] obj 对象类型的数组 里面存放着 sql执行的占位符参数
* 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]);
}
int i = ps.executeUpdate();
if (i>0)return true;
} catch (SQLException e) {
e.printStackTrace();
}finally {         close(conn,ps,null);
      }
 return false; 

  } 

 }
      // c查询的通用方法
public static List<Map<String,Object>> executeQuery(String sql,Object... args){
Connection conn = null;
PreparedStatement ps = null;
ResultSet set = null;
try {
conn = DBUtil.getConnection();
ps = conn.prepareStatement(sql);
/* 有可能有参数 */
for (int i=0;i<args.length;i++){
ps.setObject(i+1,args[i]);
}
/*执行*/
set = ps.executeQuery();
/*需要将所有数据都存放到 List中 每一行 用一个 map存放*/
List<Map<String,Object>> list = new ArrayList<>();
/*获取本次查询结果集有多少列*/
int count = set.getMetaData().getColumnCount(); while(set.next()){
Map<String, Object> map = new HashMap<>();//一行数据 用一个map 接收 for(int i=0;i<count;i++){
String name = set.getMetaData().getColumnLabel(i+1);
map.put(name,set.getObject(name));
}
/*将每行的map存放到 List中*/
list.add(map);
}
return list;
} catch (Exception e) {
e.printStackTrace();
}finally {
close(conn,ps,set);
}
return null;
} / /关闭的通用方法
private static void close(Connection conn,PreparedStatement st,ResultSet set){
try {
if(set!=null){
set.close();
}
if(st!=null){
st.close();
}
if(conn != null){
conn.close();
}
}catch (Exception e){
e.printStackTrace();
}
}
}

第四步:在dao层创建一个接口。

 package com.Wuchuang.dao;

 import com.Wuchuang.entiy.Student;

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

第五步:创建一个接口实现类。

 package com.Wuchuang.dao.Impl;

 import com.Wuchuang.dao.IStudentDAO;
import com.Wuchuang.entiy.Student;
import com.Wuchuang.util.DBUtil; public class StudentDAOImpl implements IStudentDAO {
@Override
public boolean add(Student s) {
String sql = "insert into Student (name,age,sex) values (?,?,?)"; return DBUtil.executeUpdate(sql,s.getName(),s.getAge(),s.getSex());
} @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 = ?,sex = ? where id = ?"; return DBUtil.executeUpdate(sql,s.getName(),s.getAge(),s.getSex(),s.getId()); }
}

第六步:进行测试。

 package com.Wuchuang.servlet;

 import com.Wuchuang.dao.IStudentDAO;
import com.Wuchuang.dao.Impl.StudentDAOImpl;
import com.Wuchuang.entiy.Student;
import org.junit.Test; public class ServletTest{
@Test
public void test(){
Student s = new Student(1,"吃饭",38,"男"); IStudentDAO dao = new StudentDAOImpl(); dao.add(s);
} }

2019年4月11日17:22:31

最新文章

  1. ABP之动态WebAPI(一)
  2. 使用多种客户端消费WCF RestFul服务(二)——.net4.0篇
  3. Java 基础知识点(必知必会其二)
  4. 分布式数据存储 - MySQL主从复制高可用方案
  5. 多核模糊C均值聚类
  6. 【转】apue《UNIX环境高级编程第三版》第一章答案详解
  7. Html笔记(六)超链接
  8. 构建服务端的AMD/CMD模块加载器
  9. CSS3 加载进度样式
  10. 字串变换 (2002 年NOIP全国联赛提高组)
  11. POJ3264 (RMQのST解法)
  12. 【前端】Vue和Vux开发WebApp日志一、整合vue+cordova和webpack+gulp
  13. Deploying Customizations in Oracle E-Business Suite Release 12.2
  14. 20190118_xlVBA多表合并
  15. 关于“用VS2010的C++导入ADO导入不了,提示无法打开源文件msado15.tlh”的问题
  16. Android-Kotlin-函数表达式&amp;String与Int转换$异常处理
  17. C#快速读写文件
  18. 转 kvm、qemu-kvm、ibvirt及openstack,之间的关系
  19. JavaSE基础之JDBC
  20. mmap函数使用

热门文章

  1. fiddler导出请求返回的响应数据
  2. SpringMVC学习笔记九:拦截器及拦截器的简单实用
  3. python 添加字符串的七种方法
  4. javaWeb简单登录实现验证数据库
  5. Thomson Plaza里面的三家店以及水果大会
  6. 会编程的 AI + 会修 Bug 的 AI,等于什么 ?
  7. 涉嫌垄断的App Store,到底做了什么让开发者暴怒
  8. hihoCoder 1128 二分查找
  9. WiredTiger运行时参数优化
  10. 【自己的下载平台】搭建aria2网站