就是一组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(); } } } } }