时间:2020-10-05 21:33:17 | 栏目:JAVA代码 | 点击:次
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); } } }
这样看上去就比较清晰和明了,不用分割开来去看代码,只要调用到那个累才去照这个类的方法,这样就能够更加有利于检查和排错,维护的间接性的一个软件的奋斗的目标,虽然只是简单的优化,却能够减轻了我们写代码和维护的成本。
总结
通过本次编码,对面向对象的编程的开发有更加清晰的了解,当然对重构和优化的重要性有更深的了解,在这个软件里我学会的不仅是代码的书写,还学会了代码的重构不仅需要不断的提炼,还需要对代码的细微的观察。