2020-10-22

it2026-09-01  9

JDBC

就是一组Java连接数据库的API,这些API不是数据库厂商提供,是sun公司给我们封装好一些接口,具体的实现是由各个数据库厂商来实现的。我们想要操作不同的数据库,就需要用到各个数据库厂商给我们提供的接口的实现类。

操作JDBC四个步骤: 1.加载驱动 2.连接数据库 3.操作数据库 4.关闭数据库连接

常用的类: DriverManager:是java.sql包下的类,管理数据库的一组API,我们在使用DriverManager的时候最常用的就是getConnection()方法,通过此方法,我们可以获取到Connection对象. DriverManager常用的方法: getConnection(String url,String user,String password):此方法是一个静态方法,此方法的作用是获取Connection接口的对象,其中参数url代表想要连接的数据库的网络地址,user代表用户名,password代表密码 MySQL的url的格式:jdbc:mysql://主机地址:端口号/要连接的数据库的名称

Connection:是java.sql包下的接口,代表与特定的数据库之间的连接(会话),在连接上下文中执行SQl语句并返回执行的结果。 Connection常用的方法: 1.close():关闭数据库连接 2.createStatement():此方法会返回一个Statement对象

Statement:是java.sql包下的接口,Statement对象的作用就是用来执行静态SQL语句,并返回SQL语句的执行结果的对象。 Statement给我们提供的常用的方法: 1.execute(String sql):用来执行SQL语句的方法,此方法的返回值是boolean类型的对象,如果返回的第一个结果是ResultSet结果集对象,则此方法的返回值是true,否则是false.一般来讲我们不会用此方法执行查询,我们都是通过此方法执行除了查询之外的其他的SQL语句。 2.close():关闭当前操作数据库的Statement对象 3.executeQuery(String sql) :此方法的作用是用来执行查询语句并返回查询结果,返回值是ResultSet对象。

ResultSet:是java.sql包下的接口,表示数据库结果集的数据表,通常通过执行查询数据库的语句生成。 ResultSet常用的方法: next():此方法是将结果集中的光标指向下一条数据,在执行之前,此方法会判断是否存在下一条数据,如果存在,则向下移动光标并返回true,否则返回false. close():关闭结果集对象 getInt(int columnIndex):此方法是用来获取数据库中结果集的当前这一行的int类型的数据,参数代表当前字段在结果中出现的位置,位置从1开始的。 getDouble(int columnIndex):此方法是用来获取数据库中结果集的当前这一行的double类型的数据,参数代表当前字段在结果中出现的位置,位置从1开始的。 getFloat(int columnIndex):此方法是用来获取数据库中结果集的当前这一行的float类型的数据,参数代表当前字段在结果中出现的位置,位置从1开始的。 getString(int columnIndex):此方法是用来获取数据库中结果集的当前这一行的varchar类型或者char类型的数据,参数代表当前字段在结果中出现的位置,位置从1开始的。 getDate(int columnIndex):此方法是用来获取数据库中结果集的当前这一行的Date类型的数据,参数代表当前字段在结果中出现的位置,位置从1开始的。 getTimeStamp(int columnIndex):此方法是用来获取数据库中结果集的当前这一行的TimeStamp或是Date类型的数据,参数代表当前字段在结果中出现的位置,位置从1开始的。

getInt(String columnName):此方法是用来获取数据库中结果集的当前这一行的int类型的数据,参数代表当前字段的名称 getDouble(String columnName):此方法是用来获取数据库中结果集的当前这一行的double类型的数据,参数代表当前字段的名称 getFloat(String columnName):此方法是用来获取数据库中结果集的当前这一行的float类型的数据,参数代表当前字段的名称 getString(String columnName):此方法是用来获取数据库中结果集的当前这一行的varchar类型或者char类型的数据,参数代表当前字段的名称 getDate(String columnName):此方法是用来获取数据库中结果集的当前这一行的Date类型的数据,参数代表当前字段的名称 getTimeStamp(String columnName):此方法是用来获取数据库中结果集的当前这一行的TimeStamp或是Date类型的数据,参数代表当前字段的名称

总结JDBCDemo的问题所在: 1.数据库的驱动我们在频繁的加载。 解决的思路:加载一次即可。 2.SQL语句中传递的字段的数据都是常量,每一次想要修改必须重写编写代码。 解决思路:可以考虑使用变量 3.对于insert、update、delete方法来讲只有SQL语句不同,其他的都一样。 解决思路:可以考虑将这些一样的进行封装。

Connection常用方法: prepareStatement(String sql):返回一个PreparedStatement接口对象。

PreparedStatement:是java.sql包下的一个接口,表示预编译的 SQL 语句的对象。 什么叫预编译的SQL语句,实际上就是指,在SQL语句中我们对于需要设置的字段的数据,我们可以采用占位符的形式进行编写,并预编译在SQL语句在中,之后我们只需要设置占位符即可。

DAO:数据访问对象,主要就是提供对数据库执行的方法进行封装。 VO:value Object 值对象,主要的作用就是用来传递数据。

package com.ran.demo1; import java.sql.Connection; import java.sql.Date; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import java.text.SimpleDateFormat; public class Test { public static void main(String[] args) { selectAllEmp(); } public static void insertEmp(){ //反射加载 try { Class.forName("com.mysql.jdbc.Driver"); } catch (ClassNotFoundException e) { e.printStackTrace(); } // 获取数据库链接 Connection conn = null; Statement stat=null; try { conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/java2020", "root", "root"); //插入数据 String sql="insert into emp(empid,ename,job,sal,hiredate) values(1,'lishi','manager',800,now());"; stat=conn.createStatement(); stat.execute(sql); } catch (SQLException e) { e.printStackTrace(); } finally { // 关闭数据库连接 if(stat != null){ try { stat.close(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } } if (conn != null) { try { conn.close(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } } public static void updateEmp(){ //反射加载 try { Class.forName("com.mysql.jdbc.Driver"); } catch (ClassNotFoundException e) { e.printStackTrace(); } // 获取数据库链接 Connection conn = null; Statement stat=null; try { conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/java2020", "root", "root"); //插入数据SQL语句 String sql="update emp set ename='zs',sal=1000 where empid=1"; stat=conn.createStatement(); stat.execute(sql); } catch (SQLException e) { e.printStackTrace(); } finally { // 关闭数据库连接 if(stat != null){ try { stat.close(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } } if (conn != null) { try { conn.close(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } } public static void deleteEmp(){ //反射加载 try { Class.forName("com.mysql.jdbc.Driver"); } catch (ClassNotFoundException e) { e.printStackTrace(); } // 获取数据库链接 Connection conn = null; Statement stat=null; try { conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/java2020", "root", "root"); //插入数据SQL语句 String sql="delete from emp where empid=1 "; stat=conn.createStatement(); stat.execute(sql); } catch (SQLException e) { e.printStackTrace(); } finally { // 关闭数据库连接 if(stat != null){ try { stat.close(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } } if (conn != null) { try { conn.close(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } } public static void selectAllEmp(){ //反射加载 try { Class.forName("com.mysql.jdbc.Driver"); } catch (ClassNotFoundException e) { e.printStackTrace(); } // 获取数据库链接 Connection conn = null; Statement stat=null; ResultSet rs=null; SimpleDateFormat sdf=new SimpleDateFormat("yyyy年MM月dd日"); try { conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/java2020", "root", "root"); //插入数据SQL语句 String sql="select ename,empid,job from emp"; stat=conn.createStatement(); rs=stat.executeQuery(sql); while(rs.next()){ int empid=rs.getInt("empid"); String ename=rs.getString("ename"); String job=rs.getString("job"); // double sal=rs.getDouble(4); // Date t1=rs.getDate(5); // String t=sdf.format(t1); System.out.println(empid+ename+job); } } catch (SQLException e) { e.printStackTrace(); } finally { // 关闭数据库连接 if(rs!=null){ try { rs.close(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } } if(stat != null){ try { stat.close(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } } if (conn != null) { try { conn.close(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } } }

package com.rang.excercise; import java.util.Date; public class Emp { public Emp(int empid, String ename, String job, double sal, Date hiredate) { super(); this.empid = empid; this.ename = ename; this.job = job; this.sal = sal; this.hiredate = hiredate; } public Emp() {} private int empid; private String ename; private String job; private double sal; private Date hiredate; public int getEmpid() { return empid; } public void setEmpid(int empid) { this.empid = empid; } public String getEname() { return ename; } public void setEname(String ename) { this.ename = ename; } public String getJob() { return job; } public void setJob(String job) { this.job = job; } public double getSal() { return sal; } public void setSal(double sal) { this.sal = sal; } public Date getHiredate() { return hiredate; } public void setHiredate(Date hiredate) { this.hiredate = hiredate; } @Override public String toString() { return "Emp [empid=" + empid + ", ename=" + ename + ", job=" + job + ", sal=" + sal + ", hiredate=" + hiredate + "]"; } } package com.rang.excercise; import java.sql.*; import java.util.ArrayList; import java.util.List; public class EmpDao implements BaseDao<Emp> { public EmpDao() { } @Override public void insert(Emp t) { String sql = "insert into emp(ename,job,sal,hiredate) values(?,?,?,?);"; DbTools.executeUpdate(sql, t.getEname(), t.getJob(), t.getSal(), t.getHiredate()); } @Override public void update(Emp t) { String sql = "update emp set ename=?,job=?,sal=?,hiredate=? where empid=?"; DbTools.executeUpdate(sql, t.getEname(), t.getJob(), t.getSal(), t.getHiredate(), t.getEmpid()); } @Override public void delete(Emp t) { String sql = "delete from emp where empid=?"; DbTools.executeUpdate(sql, t.getEmpid()); } @Override public Emp selectById(Emp t) { Emp emp = null; String sql = "select * from emp where empid=?"; List<Object[]> list = DbTools.executeQuery(sql, t.getEmpid()); if (list.size() > 0) { Object[] objs = list.get(0); int empid = (Integer) objs[0]; String ename = (String) objs[1]; String job = (String) objs[2]; double sal = (Double) objs[3]; Timestamp hd = (Timestamp) objs[4]; emp=new Emp(empid,ename,job,sal,new java.util.Date(hd.getTime())); } return emp; } @Override public List<Emp> selectAll() { List<Emp> emps = new ArrayList<>(); String sql = "select * from emp"; List<Object[]> list=DbTools.executeQuery(sql,null); if (list.size() > 0) { for(int i=0;i<list.size();i++){ Object[] objs = list.get(i); int empid = (Integer) objs[0]; String ename = (String) objs[1]; String job = (String) objs[2]; double sal = (Double) objs[3]; Timestamp hd = (Timestamp) objs[4]; Emp emp=new Emp(empid,ename,job,sal,new java.util.Date(hd.getTime())); emps.add(emp); } } return emps; } } package com.rang.excercise; import java.util.List; public interface BaseDao<T> { public abstract void insert(T t); public abstract void update(T t); public abstract void delete(T t); public abstract T selectById(T t); public abstract List<T> selectAll(); } package com.rang.excercise; import java.sql.*; import java.util.ArrayList; import java.util.List; public class DbTools { //URL private static final String URL="jdbc:mysql://localhost:3306/test"; //user private static final String USER="root"; //pwd private static final String PWD="root"; //PreparedStatement 对象 private static PreparedStatement preparedStatement=null; //ResultSet对象 private static ResultSet resultSet=null; //connection对象 private static Connection connection=null; //编写一个静态块用于加载驱动 static { try { Class.forName("com.mysql.jdbc.Driver"); } catch (ClassNotFoundException e) { e.printStackTrace(); } } public static Connection getConnection() { if (connection == null) { try { connection = DriverManager.getConnection(URL, USER, PWD); connection.setAutoCommit(false); } catch (SQLException e) { e.printStackTrace(); } } return connection; } //insert,update,delete public static void executeUpdate(String sql,Object...objs){ //获取connection 对象 connection=getConnection(); //获取PreparedStatement 对象 try { preparedStatement=connection.prepareStatement(sql); if(objs!=null){ for(int i=0;i<objs.length;i++){ preparedStatement.setObject(i+1,objs[i]); } } preparedStatement.executeUpdate(); commit(); } catch (SQLException e) { e.printStackTrace(); rollback(); }finally { close(); } } //select方法 public static List<Object[]> executeQuery(String sql,Object...objs){ List<Object[]> list=new ArrayList<>(); connection=getConnection(); try { preparedStatement=connection.prepareStatement(sql); if(objs!=null&&objs.length>0){ for(int i=0;i<objs.length;i++){ preparedStatement.setObject(i+1,objs[i]); } } resultSet=preparedStatement.executeQuery(); while(resultSet.next()){ Object[] datas=new Object[resultSet.getMetaData().getColumnCount()]; for(int i=0;i<datas.length;i++){ datas[i]=resultSet.getObject(i+1); } list.add(datas); } } catch (SQLException e) { e.printStackTrace(); }finally { close(); } return list; } //事务提交 public static void commit(){ if (connection!=null){ try { connection.commit(); } catch (SQLException e) { e.printStackTrace(); } } } //回滚 public static void rollback(){ if (connection!=null){ try { connection.rollback(); } catch (SQLException e) { e.printStackTrace(); } } } //静态方法关闭资源 public static void close(){ if(resultSet!=null){ try { resultSet.close(); } catch (SQLException e) { e.printStackTrace(); } } if(preparedStatement !=null){ try { preparedStatement.close(); } catch (SQLException e) { e.printStackTrace(); } } if(connection!=null){ try { connection.close(); } catch (SQLException e) { e.printStackTrace(); } connection=null; } } }
最新回复(0)