时间:2021-07-01 10:21:17 帮助过:10人阅读
n 用来管理JDBC驱动和获取Connection对象的类
n static Connection getConnection(String url, String user, String password)
u 建立一个到指定数据库的连接,并返回一个Connection对象
n 表示和指定数据库建立的数据库连接对象。
n Statement createStatement()
u 获取一个Statement对象,用来执行没有占位符的SQL语句
n void close()
u 关闭当前的数据库连接,释放它所创建的JDBC资源
n SQL的执行器,用于执行一个静态的SQL语句并返回它产生的结果
u ResultSet executeQuery(String sql)
l 执行给定的SQL语句,并返回一个用于查询结果的ResultSet对象
u int executeUpdate(String sql)
l 执行给定的SQL语句,用于更新数据库数据,返回发生变化数据的行数
u void close()
l 关闭Statement对象以及它所对应的结果集。
n 代表通过查询数据库获取到的结果集。
u boolean next()
l 将结果集的当前行向前移动一行。如果以及到达最后一行的后面,则返回false
u Xxx getXxx(int 列号)
u Xxx getXxx(int 列名)
l Xxx指数据类型,例如int、double、String、Date等
l 用给定的列号或列名返回该列的值,并将值转换为指定类型。
u void close()
l 关闭当前的结果集
n mysql-connector-java-5.1.7-bin.jar
static { try { java.sql.DriverManager.registerDriver(new Driver()); } catch (SQLException E) { throw new RuntimeException("Can‘t register driver!"); } } |
n 在驱动程序的静态代码块中,会自动将驱动程序通过DriverManager进行注册,所以我们要做的只是将驱动类加载进JDK中,静态代码块将会自动执行。
//加载数据库驱动 Class.forName("com.mysql.jdbc.Driver"); |
n String url
u 数据库URL
l 在连接数据库时,我们必须使用各种与数据库类型相关的参数,例如主机名、端口号和数据库名。
l 语法:jdbc:子协议:厂商内容
l 例如:
n MySQL
u jdbc:mysql://主机地址:端口号/库名
u jdbc:mysql://localhost:3306/test
n Oracle
u jdbc:oracle:thin:@主机地址:端口号:数据库名
u jdbc:oracle:thin:@localhost:1521:atguigu
n SQLServer
u jdbc:microsoft:sqlserver//主机地址:端口号; DatabaseName=库名
u jdbc:microsoft:sqlserver//localhost:1433; DatabaseName=sid
n String user
u 连接数据库使用的用户的用户名,我们这里MySQL的用户名就是root
n String password
u 连接数据库使用的用户的密码,我们这里同样也是root
//设置url地址 String url = "jdbc:mysql://localhost:3306/test"; //设置用户名 String username = "root"; //设置用户密码 String password = "root"; //获取数据库连接 Connection conn = DriverManager.getConnection(url,username,password); |
//获取Statement对象 Statement stat = conn.createStatement(); |
n executeUpdate()用于执行增、删、改相关的方法,它可以返回一个int值,表示执行SQL语句后影响到的行数。
//创建SQL语句 String sql = "INSERT INTO tb_user VALUES(null,‘sunwukong‘)"; //执行SQL语句 int count = stat.executeUpdate(sql); |
n executeQuery()用于执行查询的方法,该方法会返回一个ResultSet对象,对象中封装了查询到的数据。
//创建SQL语句 String sql = "SELECT * FROM tb_user"; //执行SQL语句查询信息 ResultSet rs = stat.executeQuery(sql); |
//创建一个while循环用于读取ResultSet中的数据 while(rs.next()){ //获取第一列的数据 int id = rs.getInt(1); //获取第二列的数据 String um = rs.getString(2); //输出数据 System.out.println(id+"--"+um); } |
n 上边的代码我们是通过列的序号来获取列的信息的。如getInt(1)获取第一列的数据并返回一个int值,getString(2)获取第二列的信息并返回一个String,注意这里的列是从1开始的,而不是0。
n 同样我们也可以通过列名来获取指定属性,和上边的用法类似,只不过不在传int行的列序号,而是传String型的列名。如:getInt(“id”) 获取int型的id的值,getString(“username”) 获取String型的username的值。注意这里的id和username都是表的列名,也就是表头中的内容,如果没有使用别名则以表中的名称为准,如果使用了别名则以别名为准。
//关闭ResultSet rs.close(); //关闭Statement stat.close(); //关闭Connection conn.close(); |
//设置四个参数 String username = "root"; String password = "root"; String driverClass = "com.mysql.jdbc.Driver"; String url = "jdbc:mysql://localhost:3306/test";
//加载驱动 Class.forName(driverClass);
//分别声明Connection Statement ResultSet三个变量 Connection conn = null; Statement stat = null; ResultSet rs = null;
try { //获取Connection对象 conn = DriverManager.getConnection(url, username, password);
//获取Statement对象 stat = conn.createStatement();
//执行sql获取ResultSet对象 rs = stat.executeQuery("");
//读取rs对象中的内容
} catch (SQLException e) { e.printStackTrace(); } finally{ //关闭rs if(rs!=null){ try { rs.close(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } }
//关闭stat if(stat != null){ try { stat.close(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } }
//关闭conn if(conn != null){ try { conn.close(); } catch (SQLException e) { e.printStackTrace(); } } } |
n 对用户输入进行校验,检查是否包含非法字符
n 分两次检查用户名和密码,先通过SQL查询用户对象,再检查密码是否正确
n 使用PreparedStatement
n PreparedStatement中已经包含了编译好的SQL语句,在这条SQL语句中可以设置一个过多个参数,这些参数使用?作为占位符,我们只需要在SQL语句执行之前使用对应的参数替换占位符即可。PreparedStatement中为我们提供了很多的setXxx()方法用来替换占位符。
n 由于PreparedStatement中的SQL语句已经预编译过了,其执行效率要高于Statement。
n PreparedStatement继承了Statement的所有功能,但是在这个基础上还添加了多个setXxx()方法用来设置占位符。同时三个方法execute()、executeUpdate()、executeQuery()都已经添加了不需要参数的版本,而之前需要参数的方法我们不应该在调用。
n 获取PreparedStatement
u Connection.prepareStatement(String sql);
PreparedStatement pstmt = conn.prepareStatement("SELECt * FROM tb_user WHERE username=? AND password=?"); |
u 我们可以通过Connection对象的prepareStatement方法获取一个PreparedStatement对象,调用这个方法我们必须要传一个SQL语句,这个条SQL语句就是我们的预编的SQL语句,我们会发现SQL语句中出现两个?,这两个问号就是我们所说的占位符,这些占位符在SQL语句执行之前必须要被替换成有效的值。
n 替换占位符:
u 在PreparedStatement中提供了很多的setXxx()方法用来替换占位符。所谓的Xxx就是指我们Java中的数据类型,如int、String、long、double等。
u 例如:setString(占位符位置 , 占位符的值)、setInt(占位符位置 , 占位符的值)、setObject(占位符位置 , 占位符的值)。
pstmt.setString(1, username); pstmt.setString(2, password); |
n 执行SQL
u 执行SQL也很简单,上边也说了PreparedStatement提供类三个无参的execute()、executeUpdate()、executeQuery()三个方法,根据要操作的SQL的数据类型不同执行相应的方法即可。
rs = pstmt.executeQuery(); |
类型 |
长度 |
tinyblob |
28--1B(256B) |
blob |
216-1B(64K) |
mediumblob |
224-1B(16M) |
longblob |
232-1B(4G) |
tinyclob |
28--1B(256B) |
clob |
216-1B(64K) |
mediumclob |
224-1B(16M) |
longclob |
232-1B(4G) |
类型 |
长度 |
tinytext |
28--1B(256B) |
text |
216-1B(64K) |
mediumtext |
224-1B(16M) |
longtext |
232-1B(4G) |
n addBatch()
u 将一组已经设置好的参数,添加到批处理中
n executeBatch()
u 执行批处理
//获取connection conn = JDBCUtils.getConnection(); //设置sql语句 String sql = "INSERT INTO customer (name,age,gender) VALUES(?,?,?)"; //获取PreparedStatement对象 pstmt = conn.prepareStatement(sql); //使用for循环批量设置参数 for (int i = 0; i < 10000; i++) { pstmt.setString(1, NameUtils.getName()); pstmt.setInt(2, NameUtils.getAge()); pstmt.setString(3, NameUtils.getGender()); //每设置完一组参数,将参数添加到批量操作中 pstmt.addBatch(); } //执行批量操作 pstmt.executeBatch(); |
n rewriteBatchedStatements=true
n 一个事务是一个不可分割的工作单位,事务中包括的诸操作要么都做,要么都不做。
n 事务必须是使数据库从一个一致性状态变到另一个一致性状态。一致性与原子性是密切相关的。
n 一个事务的执行不能被其他事务干扰。即一个事务内部的操作及使用的数据对并发的其他事务是隔离的,并发执行的各个事务之间不能互相干扰。
n 持久性也称永久性(permanence),指一个事务一旦提交,它对数据库中数据的改变就应该是永久性的。接下来的其他操作或故障不应该对其有任何影响。
n START TRANSACTION
u 开启事务,开启事务后我们在MySQL中输出的每个语句将不会自动提交修改。
n COMMIT
u 提交事务,提交刚才对数据库做的修改操作
n ROLLBACK
u 回滚事务,取消刚才对数据库做的所有操作
n conn.setAutoCommit(false)
u 设置事务不自动提交,开启事务
n conn.commit();
u 提交事务
n conn.rollback();
u 回滚事务
n 初始连接数量
n 最小空闲连接数
n 每次增加连接数
n 最大空闲连接数
n 最大连接数
n 最大等待时间
n JDBC为我们提供了DataSource接口,所有的数据库连接池都需要实现该接口,有了该接口以后,我们在获取数据库连接就不需要使用DriverManager了。
n Connection getConnection()
u 从数据库连接池中获取一个连接
n commons-dbcp-1.4.jar
n commons-pool-1.5.5.jar
n BasicDataSource
n BasicDataSourceFactory
//创建连接池对象 BasicDataSource dataSource = new BasicDataSource();
//设置连接信息 dataSource.setUrl("jdbc:mysql://localhost:3306/test"); dataSource.setUsername("root"); dataSource.setPassword("root"); dataSource.setDriverClassName("com.mysql.jdbc.Driver");
//指定初始化连接的个数 dataSource.setInitialSize(10); //指定最大的连接数,数据连接池的容量 dataSource.setMaxActive(50); //指定连接池中的最小连接数 dataSource.setMinIdle(5); //设置最大等待时间 dataSource.setMaxWait(1000);
//获取数据库连接 Connection connection = dataSource.getConnection(); |
n initialSize
u 初始化连接的个数,默认值为0
n maxActive
u 连接池中的最大连接数,默认值为8,若设置为负数,表示无限制
n maxIdle
u 最大空闲连接数,默认值为8,若设置为负数,表示无限制
n minIdle
u 最小空闲连接数,默认值为0
n maxWait
u 最大等待时间,默认为-1,无限等待
n connectionProperties
u 连接属性,指定url地址后边的参数
n defaultAutoCommit
u 是否自动提交事务,默认为true
n c3p0-0.9.1.2.jar
n ComboPooledDataSource
//获取连接池对象 ComboPooledDataSource dataSource = new ComboPooledDataSource();
//设置连接信息 dataSource.setDriverClass("com.mysql.jdbc.Driver"); dataSource.setJdbcUrl("jdbc:mysql://localhost:3306/test"); dataSource.setUser("root"); dataSource.setPassword("root");
//设置连接池信息 dataSource.setAcquireIncrement(5); dataSource.setInitialPoolSize(10); dataSource.setMinPoolSize(2); dataSource.setMaxPoolSize(50);
//获取数据库连接 Connection connection = dataSource.getConnection();
|
n 文件的名称必须为c3p0-config.xml
n 文件必须放到项目的类路径下
n 格式:
<?xml version="1.0" encoding="UTF-8"?> <c3p0-config> <default-config> <property name="jdbcUrl">jdbc:mysql://localhost:3306/test</property> <property name="driverClass">com.mysql.jdbc.Driver</property> <property name="user">root</property> <property name="password">root</property> <!-- 最小的连接数 --> <property name="minPoolSize">5</property> <!-- 最大的连接数 --> <property name="maxPoolSize">30</property> <!-- 初始化的连接数 --> <property name="initialPoolSize">10</property> <!-- 需要时一次性创建的连接数 --> <property name="acquireIncrement">5</property> <!-- 缓存多少个Statement对象 --> <property name="maxStatements">15</property> </default-config> <named-config name="oracle-config"> <property name="jdbcUrl">jdbc:oracle:thin:@localhost:1521:orcl</property> <property name="driverClass">oracle.jdbc.driver.OracleDriver</property> <property name="user">orcl</property> <property name="password">orcl</property>
<!-- 最小的连接数 --> <property name="minPoolSize">5</property> <!-- 最大的连接数 --> <property name="maxPoolSize">30</property> <!-- 初始化的连接数 < 人气教程排行
|