jdbc实现连接和增删改查功能

 更新时间:2019年02月20日 10:53:46   作者:lxh5431  
这篇文章主要为大家详细介绍了jdbc实现连接和基本的增删改查功能,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

JDBC的定义

JDBC(Java Data Base Connectivity,java数据库连接)是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,它由一组用Java语言编写的类和接口组成。JDBC提供了一种基准,据此可以构建更高级的工具和接口,使数据库开发人员能够编写数据库应用程序。

jdbc的基本连接

简单的说就是加载驱动,建立连接,然后进行查询和删除等语句的操作,在java中提供了java.sql的jar包,不过我现在用的是mysql的连接和实例,在这里基本在本地的服务器都是用到下面这个语句。

Class.forName("com.mysql.jdbc.Driver");

  String url="jdbc:mysql://localhost:3306/test2?useUnicode=true&characterEncoding=utf-8";
  String user="root";
  String password="root";

加载和建立连接,这就是基本的一个语法结构,在连接数据库当然还有其他的属性可以设置,比如说最大的连接数了,和如何建立连接池,都可以在配置中用到,这里我就简单的介绍如何连接,后面跟的是这个连接的字符集,防止出现乱码。

简单的增删改查

简单的增删改查是每个开发者都会遇到的,毕竟我们整个系统真正的业务所在也是这几个简单的逻辑,但是在关系的连接和耦合性下就会变成复杂百倍的系统,所以要懂得基本的就可以窥见更大系统的构建了,所以我现在要分析的只是基本的功能实现。

首先连接好数据库之后,那就是创建查询语句,这里用到的是statment这个关键词,下面是代码的基本实现。

package dbtest;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;


public class DbTest {

 public static void main(String[] args) {
  Employee employee1 =new Employee();
  employee1.setEmpno(555);
  employee1.setEname("hakly");
  employee1.setSal(5400);
  employee1.setHiredate(new Date());

  addEmployee(employee1);
  List<Employee>employees=getEmployees();
  for(Employee employee:employees){
   System.out.println(employee);

  }

  Employee employee =new Employee();
  employee.setEmpno(999);
  employee.setEname("jack");
  employee.setSal(5000);
  employee.setHiredate(new Date());

  addEmployee(employee);

 }

  public static List<Employee> getEmployees() {
  ResultSet rs=null;
  Connection conn=null;
  Statement stat=null;
  List<Employee> employees=new ArrayList<Employee>();
  try{
   Class.forName("com.mysql.jdbc.Driver");


  String url="jdbc:mysql://localhost:3306/test2?useUnicode=true&characterEncoding=utf-8";
  String user="root";
  String password="root";
  conn= DriverManager.getConnection(url,user,password);
  stat=conn.createStatement();
  String sql="select * from emp";
   rs=stat.executeQuery(sql);
   Employee employee=null;
  while(rs.next()){
   employee=new Employee();
   employee.setEmpno(rs.getInt("empno"));
   employee.setEname(rs.getString("ename"));
   employee.setSal(rs.getDouble("sal"));
  employee.setHiredate(rs.getDate("hiredate"));
  employees.add(employee);
  }


  }catch(Exception e ){
   e.printStackTrace();
  }finally{
   try {
    if(conn!=null){
    conn.close();
   } 
    }catch (SQLException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
   }
  }
  return employees;
 }
  public static void addEmployee(Employee employee) {
   Connection conn = null;
   Statement stat = null;
   // 1.注册驱动程序
   try {
    Class.forName("com.mysql.jdbc.Driver");

    // 2.建立连接
    String url = "jdbc:mysql://localhost:3306/test2?useUnicode=true&characterEncoding=utf-8";
    String user = "root";
    String password = "root";
    conn = DriverManager.getConnection(url, user, password);

    // 3.创建执行语句,发送sql命令
    stat = conn.createStatement();
    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
    String sql = "insert into emp(empno,ename,sal,hiredate) values(" + employee.getEmpno() + ",'"
      + employee.getEname() + "'," + employee.getSal() + ",'" + sdf.format(employee.getHiredate()) + "')";

    // 4.处理执行结果
    int i = stat.executeUpdate(sql);
   } catch (Exception e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
   } finally {
    // 5.关闭资源
    try {
     if (conn != null) {
      conn.close();
     }
    } catch (SQLException e) {
     // TODO Auto-generated catch block
     e.printStackTrace();
    }
   }
  }
  public static void updateEmployee(Employee employee) {
   Connection conn = null;
   Statement stat = null;
   // 1.注册驱动程序
   try {
    Class.forName("com.mysql.jdbc.Driver");

    // 2.建立连接
    String url = "jdbc:mysql://localhost:3306/test2?useUnicode=true&characterEncoding=utf-8";
    String user = "root";
    String password = "root";
    conn = DriverManager.getConnection(url, user, password);

    // 3.创建执行语句,发送sql命令
    stat = conn.createStatement();
    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
    String sql = "update emp set ename='"+employee.getEname()+"empno"+employee.getEmpno()+"sal"+employee.getSal();
    // 4.处理执行结果
    int i = stat.executeUpdate(sql);
   } catch (Exception e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
   } finally {
    // 5.关闭资源
    try {
     if (conn != null) {
      conn.close();
     }
    } catch (SQLException e) {
     // TODO Auto-generated catch block
     e.printStackTrace();
    }
   }
  }

}

这里的代码很繁琐,但是没办法,为了更清新一点的去了解,这个过程是必须的,然后接下来就是进行简单的优化,虽然代码还是差不多,但是感觉上会更加简洁了 ,这里就要建立一个工具类了代码如下

package dbtest;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

public class JdbcUtil {
 static String url = "jdbc:mysql://localhost:3306/xxx?useUnicode=true&characterEncoding=utf-8";
 static String user = "root";
 static String password = "root";

 static{
  try {
   Class.forName("com.mysql.jdbc.Driver");
  } catch (ClassNotFoundException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }
 }
 public static Connection getConnection() throws SQLException{
  String url = "jdbc:mysql://localhost:3306/test2?useUnicode=true&characterEncoding=utf-8";
  String user = "root";
  String password = "root";
  return DriverManager.getConnection(url, user, password);

 }
 public static void free(Connection conn){

  try {
   if (conn != null) {
    conn.close();
   }
  } catch (SQLException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }
 }
 }

在这里,把数据库连接和异常处理,等工作都及合成一个工具类,然后再主函数调用就可以了,这就是面向对象的一个体现,当然还是会分析下关于主类的代码,要不然就太过于空洞了,下面要分析的主类代码如下

package com.niit.jdbc;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

public class EmployeeDao1 {

 public static void main(String[] args) throws ParseException {

  List<Employee> employees=getEmployees();
  for(Employee employee:employees){
   System.out.println(employee);
  }

  /*Employee employee = new Employee();
  employee.setEmpno(9999);
  employee.setEname("tom");
  employee.setSal(6000);

  SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd");
  employee.setHiredate(sdf.parse("2015-07-23"));

  //addEmployee(employee);
  //updateEmployee(employee);
  deleteEmployee(9999);*/



 }

 public static List<Employee> getEmployees() {
  Connection conn = null;
  Statement stat = null;
  ResultSet rs = null;
  List<Employee> employees = new ArrayList<Employee>();
  // 1.注册驱动程序
  try {
   //2.获取连接
   conn=JdbcUtil.getConnection();

   // 3.创建执行语句,发送sql命令
   stat = conn.createStatement();
   String sql = "select * from emp";

   // 4.处理执行结果
   rs = stat.executeQuery(sql);
   Employee employee = null;
   while (rs.next()) {
    employee = new Employee();
    employee.setEmpno(rs.getInt("empno"));
    employee.setEname(rs.getString("ename"));
    employee.setSal(rs.getDouble("sal"));
    employee.setHiredate(rs.getDate("hiredate"));

    employees.add(employee);
   }

  } catch (Exception e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  } finally {
   // 5.关闭资源
   JdbcUtil.free(conn);
  }
  return employees;
 }

 public static void addEmployee(Employee employee) {
  Connection conn = null;
  Statement stat = null;
  // 1.注册驱动程序
  try {
   //2.获取连接
   conn=JdbcUtil.getConnection();

   // 3.创建执行语句,发送sql命令
   stat = conn.createStatement();
   SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
   String sql = "insert into emp(empno,ename,sal,hiredate) values(" + employee.getEmpno() + ",'"
     + employee.getEname() + "'," + employee.getSal() + ",'" + sdf.format(employee.getHiredate()) + "')";

   // 4.处理执行结果
   int i = stat.executeUpdate(sql);
  } catch (Exception e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  } finally {
   // 5.关闭资源
   JdbcUtil.free(conn);
  }
 }

 public static void updateEmployee(Employee employee) {
  Connection conn = null;
  Statement stat = null;
  // 1.注册驱动程序
  try {
   //2.获取连接
   conn=JdbcUtil.getConnection();

   // 3.创建执行语句,发送sql命令
   stat = conn.createStatement();

   SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
   String sql = "update emp set ename='" + employee.getEname() + "',sal=" + employee.getSal() + ",hiredate='"
     + sdf.format(employee.getHiredate()) + "' where empno=" + employee.getEmpno();

   // 4.处理执行结果
   int i = stat.executeUpdate(sql);
  } catch (Exception e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  } finally {
   // 5.关闭资源
   JdbcUtil.free(conn);
  }
 }

 public static void deleteEmployee(int empno) {
  Connection conn = null;
  Statement stat = null;
  // 1.注册驱动程序
  try {
   //2.获取连接
   conn=JdbcUtil.getConnection();

   // 3.创建执行语句,发送sql命令
   stat = conn.createStatement();
   SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
   String sql = "delete from emp where empno="+empno;

   // 4.处理执行结果
   int i = stat.executeUpdate(sql);
  } catch (Exception e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  } finally {
   // 5.关闭资源
   JdbcUtil.free(conn);
  }
 }

}

这样看上去就比较清晰和明了,不用分割开来去看代码,只要调用到那个累才去照这个类的方法,这样就能够更加有利于检查和排错,维护的间接性的一个软件的奋斗的目标,虽然只是简单的优化,却能够减轻了我们写代码和维护的成本。

总结

通过本次编码,对面向对象的编程的开发有更加清晰的了解,当然对重构和优化的重要性有更深的了解,在这个软件里我学会的不仅是代码的书写,还学会了代码的重构不仅需要不断的提炼,还需要对代码的细微的观察。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • java清除html转义字符

    java清除html转义字符

    这篇文章主要介绍了一个静态文件处理的一些便捷服务,包括 java清除html转义字符,清除html代码,从style样式中读取CSS的属性,将字符串截取指定长度,涉及log4j,common-lang类的学习
    2014-01-01
  • java实现的二级联动菜单效果

    java实现的二级联动菜单效果

    这篇文章主要介绍了java实现的二级联动菜单效果,结合实例形式分析了java前台页面布局及与后台交互构造联动菜单的相关技巧,需要的朋友可以参考下
    2016-08-08
  • 继承JpaRepository后,找不到findOne()方法的解决

    继承JpaRepository后,找不到findOne()方法的解决

    这篇文章主要介绍了继承JpaRepository后,找不到findOne()方法的解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-08-08
  • 深度解析SpringBoot中@Async引起的循环依赖

    深度解析SpringBoot中@Async引起的循环依赖

    本文主要介绍了深度解析SpringBoot中@Async引起的循环依赖,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-02-02
  • java递归读取目录下所有文件的方法

    java递归读取目录下所有文件的方法

    这篇文章主要为大家详细介绍了java递归读取目录下所有文件的方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-02-02
  • java应用程序如何自定义log4j配置文件的位置

    java应用程序如何自定义log4j配置文件的位置

    这篇文章主要介绍了java应用程序如何自定义log4j配置文件的位置,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-12-12
  • 详解Java ArrayList类

    详解Java ArrayList类

    这篇文章主要介绍了Java ArrayList类的相关资料,文中示例代码非常详细,帮助大家更好的理解和学习,感兴趣的朋友可以了解下
    2020-07-07
  • logback的使用和logback.xml详解(小结)

    logback的使用和logback.xml详解(小结)

    Logback是由log4j创始人设计的另一个开源日志组件,这篇文章主要介绍了logback的使用和logback.xml详解(小结),非常具有实用价值,需要的朋友可以参考下
    2018-11-11
  • SpringBoot整合MongoDB的实现代码

    SpringBoot整合MongoDB的实现代码

    自己本科时候一直使用的是Mysql,目前的课题组使用的是MongoDB,因此就花了一部分时间整理了一下,实现springboot与MongoDB的整合,并且实现基本的增删改查操作,从头到尾给出一个完整的案例。
    2021-05-05
  • Java多线程实现之Callable详解

    Java多线程实现之Callable详解

    这篇文章主要介绍了Java多线程实现之Callable详解,Callable是一个接口,用于实现多线程,与实现Runnable类似,但是功能更强大,通过实现Callable接口,我们需要重写call()方法,该方法可以在任务结束后提供一个返回值,需要的朋友可以参考下
    2023-08-08

最新评论