首页 > 编程 > Java > 正文

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

2019-11-26 09:15:59
字体:
来源:转载
供稿:网友

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);  } }}

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

总结

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

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

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表