使用JDBC连接并操作数据库
1.数据库驱动
介于Java程序和MySQL之间的程序。
2.JDBC
sun公司为了简化开发人员的操作,提供了一个(Java操作数据库的)规范,俗称JDBC。这些规范的实现由具体的厂商去做。
对于开发人员来说,只需要掌握JDBC接口的操作即可。JDBC程序介于数据库驱动和应用程序之间。
3.第一个JDBC程序
前期工作:
1.创建一个普通的Java项目
3.将mysql数据库驱动jar包复制到lib文件夹中
4.右键lib文件夹,选中 add as library,这才意味着成功导入了驱动程序包
连接数据库的步骤总结:
1、加载驱动
2、连接数据库 DriverManager
3、获得执行sql的对象 Statement
4、获得返回的结果集
5、释放连接
DriverManager
DriverManager.registerDriver(new com.mysql.jdbc.Driver()) Class.forName("com.mysql.jdbc.Driver()"); /* 上面这两行代码的作用都是一样的,第一个是通过向DriverManager.registerDriver方法传递一个驱动对象 */ // DriverManager.registerDriver方法源码如下 public static synchronized void registerDriver(java.sql.Driver driver) throws SQLException { registerDriver(driver, null); } // 其内部的registerDriver方法源码如下 public static synchronized void registerDriver(java.sql.Driver driver, DriverAction da) throws SQLException { /* Register the driver if it has not already been added to our list */ if(driver != null) { registeredDrivers.addIfAbsent(new DriverInfo(driver, da)); } else { // This is for compatibility with the original DriverManager throw new NullPointerException(); } println("registerDriver: " + driver); } // 再来看一下com.mysql.jdbc.Driver()的源码 public class Driver extends NonRegisteringDriver implements java.sql.Driver { public Driver() throws SQLException { } static { try { DriverManager.registerDriver(new Driver()); } catch (SQLException var1) { throw new RuntimeException("Can't register driver!"); } } } /* 可以看到其内部有一个静态代码块,在加载该类的时候,会执行这个静态代码块,这个静态代码块也是执行的 DriverManager.registerDriver方法,并且传递的是一个驱动对象,所以上面两种加载驱动的方式的本质是一样的 */ Connection connection = DriverManager.getConnection(url, username, password); // connection代表数据库 //数据库设置自动提交 connection.setAutoCommit() //事务提交 connection.commit() //事务回滚 connection.rollback()
URL
String url = "jdbc:mysql://localhost:3306/jdbcstudy?useUnicode=true&characterEncoding=utf8&&useSSL=false"; // jdbc:mysql://主机地址:port/数据库名?参数1&参数2……
Statement 执行SQL的对象,PrepareStatement 执行SQL的对象
String sql = "select * from users"; Statement statement = connection.createStatement(); statement.execute(); statement.executeQuery(); // 查询操作返回 一个结果集ResultSet statement.executeUpdate(); // 更新、插入、删除都是使用这个方法,会返回一个受影响的行数 //5.执行SQL的对象去执行SQL,如果有结果,则查看返回结果
ResultSet
获得指定的数据类型
ResultSet resultSet = statement.executeQuery(sql); // 结果集封装了我们全部的查询出来的结果 // 如果直到要获取的字段的类型,就指定类型,否则就是要getObject方法 resultSet.getObejct(); resultSet.getString(); resultSet.getInt(); resultSet.getDate();
遍历,指针
resultSet.beforeFirst() //移动到最前面 resultSet.afterLast() //移动到最后面 resultSet.next() // 移动下一个数据 resultSet.previous() // 移动到前一行 resultSet.absolute(row) // 移动到指定行
释放资源
resultSet.close();
statement.close();
connection.close();
4.Statement对象
JDBC中的Statement对象用于向数据库发送SQL语句,想完成对数据库的增删改查,只需要通过这个对象向数据库发送增删改查语句即可。
Statement对象的executeUpdate方法,用于向数据库发送增、删、改的sql语句,executeUpdate执行完成之后,,将会返回一个整数(即增删改语句导致了数据库几行数据发生了变化)。
Statement.executeQuery方法用于向数据库发送查询语句,executeQuery方法返回代表查询结果的ResultSet对象。
CRUD操作-insert
使用executeUpdate(String sql) 方法完成数据添加工作,示例操作:
Statement st = conn.createStatement(); String sql = "insert into user(....) values(....)"; int num = st.executeUpdate(sql); if(num > 0){ System.out.println("插入成功!!") }
CRUD操作-delete
使用executeUpdate(String sql)方法完成数据删除操作,示例操作:
Statement st = conn.createStatement(); String sql = "delete from user where id=1"; int num = st.executeUpdate(sql); if(num > 0){ System.out.println("删除成功!!") }
CRUD操作-update
使用executeUpdate(String sql)方法完成数据修改操作,示例操作:
Statement st = conn.createStatement(); String sql = "update user set name= '' where name = '' "; int num = st.executeUpdate(sql); if(num > 0){ System.out.println("修改成功!!") }
CRUD操作-read
使用executeQuery方法完成数据查询操作,示例操作:
Statement st = conn.createStatement(); String sql = "select * from user where id=1"; ResultSet rs = st.executeQuery(sql); while(rs.next()){ // 根据获取列的数据类型,分别调用rs的相应方法映射到java对象中 }
4.规范化实现
1.在src文件夹下写一个配置文件db.properties,用于保存连接数据库的关键信息;
内容如下:
driver = com.mysql.jdbc.Driver url = jdbc:mysql://localhost:3306/jdbcstudy?useUnicode=true&characterEncoding=utf8&&useSSL=false username = 用户名 password = 密码
2.新建一个utils包,用于存放连接数据库的工具类,该工具类的代码实现如下:
public class jdbcUtils { private static String driver = null; private static String url = null; private static String username = null; private static String password = null; static { try{ InputStream in = jdbcUtils.class.getClassLoader().getResourceAsStream("db.properties"); Properties properties = new Properties(); properties.load(in); driver = properties.getProperty("driver"); url = properties.getProperty("url"); username = properties.getProperty("username"); password = properties.getProperty("password"); //1.驱动只用加载一次 Class.forName(driver); }catch (Exception e){ e.printStackTrace(); } } // 获取连接 public static Connection getConnection() throws SQLException { return DriverManager.getConnection(url,username,password); } // 释放连接资源 public static void relese(Connection conn, Statement st, ResultSet rs){ if (rs!=null){ try{ rs.close(); }catch (SQLException e) { e.printStackTrace(); } } if (st!=null){ try{ st.close(); }catch (SQLException e) { e.printStackTrace(); } } if (conn!=null){ try{ conn.close(); }catch (SQLException e) { e.printStackTrace(); } } } }
3.在其他的具体业务包里面编写具体操作数据库的代码
增加操作:
public class jdbctest02 { public static void main(String[] args) { Connection conn = null; Statement st = null; ResultSet rs = null; try { conn = jdbcUtils.getConnection(); // 获取数据库连接 st = conn.createStatement(); //获得SQL的执行对象 String sql = "insert into users values(4,'lalal','123456','xxx@163.com','2020-01-01')"; int i = st.executeUpdate(sql); if (i>0){ System.out.println("插入成功"); } } catch (SQLException e) { e.printStackTrace(); }finally { jdbcUtils.relese(conn,st,rs); } } }
删除操作:
public class jdbctest03 { public static void main(String[] args) { Connection conn = null; Statement st = null; ResultSet rs = null; try { conn = jdbcUtils.getConnection(); // 获取数据库连接 st = conn.createStatement(); //获得SQL的执行对象 String sql = "delete from users where id = 4"; int i = st.executeUpdate(sql); if (i>0){ System.out.println("删除成功"); } } catch (SQLException e) { e.printStackTrace(); }finally { jdbcUtils.relese(conn,st,rs); } } }
修改操作:
public class jdbctest04 { public static void main(String[] args) { Connection conn = null; Statement st = null; ResultSet rs = null; try { conn = jdbcUtils.getConnection(); // 获取数据库连接 st = conn.createStatement(); //获得SQL的执行对象 String sql = "update users set name = '库卡卡' where id = 1"; int i = st.executeUpdate(sql); if (i>0){ System.out.println("修改成功"); } } catch (SQLException e) { e.printStackTrace(); }finally { jdbcUtils.relese(conn,st,rs); } } }
查询操作:
public class jdbctest05 { public static void main(String[] args) { Connection conn = null; Statement st = null; ResultSet rs = null; try { conn = jdbcUtils.getConnection(); // 获取数据库连接 st = conn.createStatement(); //获得SQL的执行对象 String sql = "select * from users"; rs = st.executeQuery(sql); while (rs.next()){ System.out.println("id="+rs.getObject("id")); System.out.println("name="+rs.getObject("name")); System.out.println("pwd="+rs.getObject("password")); System.out.println("email="+rs.getObject("email")); System.out.println("birthday="+rs.getObject("birthday")); } } catch (SQLException e) { e.printStackTrace(); }finally { jdbcUtils.relese(conn,st,rs); } } }