1.DriverManager
驱动管理对象
功能:
(1)注册驱动,告诉程序该使用哪个数据库驱动jar
static void registerDriver(Driver driver):注册与给定的驱动程序 DriverManager
写代码使用:Class.forName("com.mysql.jdbc.Driver");
将Driver类加载进内存,就有一些代码会被自动执行(Driver类中有一些静态代码块的存在)
通过查看源码发现:在com.mysql.jdbc.Driver类中存在静态代码块
注意:MySQL5之后的驱动jar包可以省略注册驱动的步骤,因为在这个java.sql.Driver中已经写好了。
(2)获取数据库连接
- 方法: static Connection getConnection(String url, String user, String password)
- 参数:
- url:指定连接的路径,语法:jdbc:mysql://ip地址(域名):端口号/数据库名称,即:JDBC:子协议:子名称//主机名:端口/数据库名?属性名=属性值&…
- 例子:jdbc:mysql://localhost:3306/db3
- 如果连接的是本机的mysql服务器,并且mysql服务默认的端口是3306,则url可以简写为:jdbc:mysql:///数据库名称
- user:用户名
- password:密码
- url:指定连接的路径,语法:jdbc:mysql://ip地址(域名):端口号/数据库名称,即:JDBC:子协议:子名称//主机名:端口/数据库名?属性名=属性值&…
String url = "jdbc:mysql://localhost:3306/jdbcStudy?useUnicode=true&characterEncoding=utf8&useSSL=false"; // mysql端口默认3306 // 协议://主机地址:端口号/数据库名?参数1&参数2&参数3 // oracle默认端口1521 // jdbc:oracle:thin:@localhost:1521:sid
2.Connection
数据库连接对象
代表了当前的代码与数据库之间的桥梁
功能:
(1)获取执行sql的对象,创建一个Statement对象,用于将SQL语句发送到数据库。
- Statement createStatement()
- PreparedStatement prepardStatement(String sql)
(2)管理事务
- 开启事务:void setAutoCommit(boolean autoCommit) 调用该方法设置参数为false,即开启事务
- 提交事务:void commit()
- 回滚事务:void rollback()
3.Statement
执行Sql的对象
jdbc中的statement对象用于向数据库发送SQL语句,想完成对数据库的增删改查,只需要通过这个对象向数据库发送增删改查语句即可。
- Statement对象的executeUpdate方法,用于向数据库发送增删改查的sql语句。
- executeUpdate执行完后,将会返回一个整数(即增删改查语句导致了数据库几行数据发生了变化)。
- Statement.executeQuery方法用于向数据库发送查询语句,executeQuery方法返回代表查询结果的ResultSet对象。
statement.executeQuery(); // 查询操作返回ResultSet statement.execute(); // 执行任何sql statement.executeUpdate(); // 更新,插入,删除,都是用这个,返回一个受影响的行数 statement.executeBatch(); // 批量执行多个sql
CRUD操作-create
使用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(String sql)方法完成数据查询操作,示例操作:
Statement st = conn.createStatement(); String sql = "select * from user where id=1"; ResultSet rs = st.executeQuery(sql); while(rs.next()){ // 根据获取列的数据类型,分别调用rs的相应方法映射到java对象中 }
代码实现
(1)提取工具类
db.properties
driver=com.mysql.jdbc.Driver url=jdbc:mysql://localhost:3306/jdbcstudy?useUnicode=true&characterEncoding=utf8&useSSL=false username=root password=123456
注意:这里有个坑,一定要把db.properties放在src目录下,不然classload的范围有局限,导致一直加载不到
JdbcUtils.java
package cn.company.jdbc.utils; import java.io.InputStream; import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import java.util.Properties; 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 inputStream = JdbcUtils.class.getClassLoader().getResourceAsStream("db.properties"); System.out.println(inputStream); Properties properties = new Properties(); properties.load(inputStream); driver = properties.getProperty("driver"); url = properties.getProperty("url"); username = properties.getProperty("username"); password = properties.getProperty("password"); System.out.println(url); // 驱动只用加载一次 Class.forName(driver); } catch (Exception e) { e.printStackTrace(); } } // 获取连接 public static Connection getConnection() throws SQLException { return DriverManager.getConnection(url,username,password); } // 释放连接 public static void releaseConnection(Connection connection, Statement statement, ResultSet resultSet) throws SQLException { if (resultSet != null) { resultSet.close(); } if (statement != null) { statement.close(); } if (connection != null) { connection.close(); } } }
(2)编写增删改的方法,executeUpdate
增:
package cn.company.jdbc; import cn.company.jdbc.utils.JdbcUtils; import java.sql.Connection; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; public class TestInsert { public static void main(String[] args) throws SQLException { Connection connection = null; Statement statement = null; ResultSet resultSet = null; try { connection = JdbcUtils.getConnection(); // 获取数据库连接 statement = connection.createStatement(); String sql = "INSERT INTO users VALUES(4,'kuanghen','123456','2435579944@qq.com','2020-02-01')"; int i = statement.executeUpdate(sql); if (i > 0) { System.out.println("插入成功!"); } } catch (SQLException e) { e.printStackTrace(); } finally { JdbcUtils.releaseConnection(connection, statement, resultSet); } } }
数据库jdbcStudy的users表中增加了一条信息
删:
package cn.company.jdbc; import cn.company.jdbc.utils.JdbcUtils; import java.sql.Connection; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; public class TestDelete { public static void main(String[] args) throws SQLException { Connection connection = null; Statement statement = null; ResultSet rs = null; try { connection = JdbcUtils.getConnection(); statement = connection.createStatement(); String sql = "DELETE FROM users WHERE id='4'"; int i = statement.executeUpdate(sql); if (i > 0) { System.out.println("删除成功!"); } } catch (SQLException e) { e.printStackTrace(); } finally { JdbcUtils.releaseConnection(connection, statement, rs); } } }
改:
package cn.company.jdbc; import cn.company.jdbc.utils.JdbcUtils; import java.sql.Connection; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; public class TestUpdate { public static void main(String[] args) throws SQLException { Connection conn = null; Statement statement = null; ResultSet rs = null; try { conn = JdbcUtils.getConnection(); statement = conn.createStatement(); String sql = "update users set name='kuangshen',email='123@163.com' WHERE id='1'"; int i = statement.executeUpdate(sql); if (i > 0) { System.out.println("修改成功!"); } } catch (SQLException e) { e.printStackTrace(); } finally { JdbcUtils.releaseConnection(conn, statement, rs); } } }
修改结果:
查:
package cn.company.jdbc; import cn.company.jdbc.utils.JdbcUtils; import java.sql.Connection; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; public class TestSelect { public static void main(String[] args) throws SQLException { Connection conn = null; Statement statement = null; ResultSet rs = null; try { conn = JdbcUtils.getConnection(); statement = conn.createStatement(); String sql = "select * from users"; ResultSet resultSet = statement.executeQuery(sql); while (resultSet.next()) { System.out.println("id="+resultSet.getObject("id") + ",name="+resultSet.getObject("name")); System.out.println("---------"); } } catch (SQLException e) { e.printStackTrace(); } finally { JdbcUtils.releaseConnection(conn,statement, rs); } } }
4.Resultset
结果集对象
封装查询结果
(1)next():游标向下移动一行
(2)getXxx(参数):获取数据
Xxx:代表数据类型,如getInt() 会返回int型值,getString() 会返回String类型
参数有两种情况:
可以接受int:代表列的编号,从1开始。如,getString(1)
可以接受String:代表列的名称。如:getDouble("name")
5.PreparedStatement
执行sql的对象(功能比Statement强)