赞
踩
1、加载MySQL数据库驱动
Class.forName("com.mysql.cj.jdbc.Driver");
2、创建数据库连接对象
通过DriverManager类创建数据库对象Connection。
Connection connection = DriverManager.getConnection(String url,String user,String pass);
其中MySQL数据库URL通常遵循如下写法:
jdbc:mysql://hostname:port/databasename
hostname为数据库服务器的IP地址,如果是本地可写:localhost或127.0.0.1。
port为数据库的监听端口,需要看安装时的配置,缺省为3306。
databasename数据库的名字。
3、创建Statment对象
Statment类主要用于执行静态SQL语句并返回它所生成结果的对象,通过Connection对象的createStatment()方法可以创建一个Statment对象。
Statment statement = coonn.createStatment();
其Connection创建Statement的方法有三个:
(1)、createStatement():创建基本的Statement对象
(2)、prepareStatement(String sql):根据传入的SQL语句创建预编译的Statement对象
可以通过调用 Connection 对象的 preparedStatement(String sql) 方法获取 PreparedStatement 对象
PreparedStatement 接口是 Statement 的子接口,它表示一条预编译过的 SQL 语句
PreparedStatement 对象所代表的 SQL 语句中的参数用问号(?)来表示,调用 PreparedStatement 对象的 setXxx() 方法来设置这些参数. setXxx() 方法有两个参数,第一个参数是要设置的 SQL 语句中的参数的索引(从 1 开始),第二个是设置的 SQL 语句中的参数的值
(3)、prepareCall(String sql):根据所传入的SQL语句创建CallableStatement对象
Statment弊端:
存在拼串操作,繁琐
存在SQL注入问题
其中所有的Statment都有如下三个方法来执行SQL语句
execute():可以执行任何SQL语句
execeteUpdate():主要用于执行DML和DDL语句。执行DML语句返回受SQL语句影响的行数,执行DDL语句返回0
executeQuery():只能执行查询语句,执行后返回查询结果的ResultSet对象
Java与SQL对应数据类型转换表
Java类型 | SQL类型 |
boolean | BIT |
byte | TINYINT |
short | SMALLINT |
int | INTEGER |
long | BIGINT |
String | CHAR,VARCHAR,LONGVARCHAR |
byte array | BINARY , VAR BINARY |
java.sql.Date | DATE |
java.sql.Time | TIME |
java.sql.Timestamp | TIMESTAMP |
方式一: 代码中显式出现了第三方数据库的API
- import java.sql.Connection;
- import java.sql.Driver;
- import java.sql.DriverManager;
- import java.sql.SQLException;
- import java.util.Properties;
- public class ConnectionTest{
- public static void main(String[] args) {
- try {
- //1.提供java.sql.Driver接口实现类的对象
- Driver driver = null;
- driver = new com.mysql.cj.jdbc.Driver();
-
- //2.提供URL,指明具体操作的数据
- String url = "jdbc:mysql://localhost:3306/mysql?characterEncoding=UTF-8";
-
- //3.提供Properties的对象,指明用户名和密码
- Properties info = new Properties();
- info.setProperty("user", "root");
- info.setProperty("password", "123456");
-
- //4.调用driver的connect(),获取连接
- Connection conn = driver.connect(url, info);
- System.out.println(conn);
- }
- catch(SQLException e) {
- e.printStackTrace();
- }
- }
- }

方式二: 相较于方式一,这里使用反射实例化Driver,不在代码中体现第三方数据库的API。体现了面向接口编程 思想。
- import java.sql.Connection;
- import java.sql.Driver;
- import java.sql.DriverManager;
- import java.sql.SQLException;
- import java.util.Properties;
- public class ConnectionTest{
- public static void main(String[] args){
- try {
- //1.实例化Driver
- String className = "com.mysql.cj.jdbc.Driver";
- Class clazz = Class.forName(className);
- Driver driver = (Driver) clazz.newInstance();
-
- //2.提供URL,指明具体操作的数据
- String url = "jdbc:mysql://localhost:3306/mysql?characterEncoding=UTF-8";
-
- //3.提供Properties的对象,指明用户名和密码
- Properties info = new Properties();
- info.setProperty("user", "root");
- info.setProperty("password", "123456");
-
- //4.调用driver的connect(),获取连接
- Connection conn = driver.connect(url, info);
- System.out.println(conn);
- }
- catch(SQLException e) {
- e.printStackTrace();
- } catch (InstantiationException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- } catch (IllegalAccessException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- } catch (ClassNotFoundException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- }
- }

方式三: 使用DriverManager实现数据库的连接。
- import java.sql.Connection;
- import java.sql.Driver;
- import java.sql.DriverManager;
- import java.sql.SQLException;
- import java.util.Properties;
- public class ConnectionTest{
- public static void main(String[] args){
- try {
- //1.数据库连接的4个基本要素:
- String url = "jdbc:mysql://localhost:3306/mysql?characterEncoding=UTF-8";
- String user = "root";
- String password = "abc123";
- String driverName = "com.mysql.cj.jdbc.Driver";
- //2.实例化Driver
- Class clazz = Class.forName(driverName);
- Driver driver = (Driver) clazz.newInstance();
-
- //3.注册驱动
- DriverManager.registerDriver(driver);
-
- //4.获取连接
- Connection conn = DriverManager.getConnection(url, user, password);
- System.out.println(conn);
- }
- catch(SQLException e) {
- e.printStackTrace();
- } catch (InstantiationException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- } catch (IllegalAccessException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- } catch (ClassNotFoundException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- }
- }

方式四: 不必显式的注册驱动了。因为在DriverManager的源码中已经存在静态代码块,实现了驱动的注册。
- import java.sql.Connection;
- import java.sql.Driver;
- import java.sql.DriverManager;
- import java.sql.SQLException;
- import java.util.Properties;
- public class ConnectionTest{
- public static void main(String[] args){
- try {
- //1.数据库连接的4个基本要素:
- String url = "jdbc:mysql://localhost:3306/mysql?characterEncoding=UTF-8";
- String user = "root";
- String password = "123456";
- String driverName = "com.mysql.cj.jdbc.Driver";
- /*2.实例化Driver
- Class clazz = Class.forName(driverName);
- Driver driver = (Driver) clazz.newInstance();
-
- //3.注册驱动
- DriverManager.registerDriver(driver);
-
- //4.获取连接
- */
- Connection conn = DriverManager.getConnection(url, user, password);
- System.out.println(conn);
-
- }
- catch(SQLException e) {
- e.printStackTrace();
- }
- }
- }

结果集(ResultSet)是数据中查询结果返回的一种对象,可以说结果集是一个存储查询结果的对象,但是结果集并不仅仅具有存储的功能,他同时还具有操纵数据的功能,可能完成对数据的更新等。
结果集读取数据的方法主要是getXXX(),他的参数可以是整型表示第几列(是从1开始的),还可以是列名。返回的是对应的XXX类型的值。如果对应那列 是空值,XXX是对象的话返回XXX型的空值,如果XXX是数字类型,如Float等则返回0,boolean返回false.使用getString()可以返回所有的列的值,不过返回的都是字符串类型的。
1、查询需要调用PreparedStatement 的 executeQuery() 方法,查询结果是一个ResultSet 对象
2、 ResultSet 对象维护了一个指向当前数据行的游标,初始的时候,游标在第一行之前,可以通过 ResultSet 对象 的 next() 方法移动到下一行。调用 next()方法检测下一行是否有效。若有效,该方法返回 true,且指针下移。 相当于Iterator对象的 hasNext() 和 next() 方法的结合体。
3、 当指针指向一行时, 可以通过调用 getXxx(int index) 或 getXxx(int columnName) 获取每一列的值。注意:Java与数据库交互涉及到的相关Java API中的索引都从1开始。
例如: getInt(1), getString("name")
Result基本使用:
1、直接使用get方法获取对应的类型的数据,当然需要结合while(resultset.next())
- ResultSet rs = ps.executeQuery();
- if(rs.next()){
- employee=new Employee(rs.getLong(1),rs.getString(2),rs.getString(3),rs.getInt(4));
- }
2、使用getMetaData()方法, 可用于获取关于 ResultSet 对象中列的类型和属性信息的对象。
ResultSetMetaData meta = rs.getMetaData();
代码:
- ResultSetMetaData rsmd = rs.getMetaData();// 得到记录集,元素对象。
- // 通过此对象可以得到表的结构,包括,列名,列的个数,列数据类型
- while(rs.next()){
- T m = cls.newInstance();// 通过反射得到实体对象。
- for(int i=0;i<rsmd.getColumnCount();i++){
- String col_name = rsmd.getCatalogName(i+1);// 获取列名
- Object value = rs.getObject(col_name);//获取列对应的值。
- Field field = cls.getDeclaredField(col_name);//获取对象对应的名称属性,然后给属性赋值
- field.setAccessible(true);// 让可以访问私有属性
- field.set(m,value);// 给对象私有属性赋值
- }
- list.add(m);
preparedStatement是和编译预处理有关的类,是Statement的一个子类,preparedStatement类定义的SQL语句中则包含一个或多个问号“?”占位符,他们对应多个IN参数。
preparedStatement的用法:
1、创建对象
在对象pstmt中包含了语句“update table1 set x = ? where y = ?”,该语句被发送到DBMS进行编译预处理,为执行做准备
preparedStatement pstmt = con.preparedStatement("update table1 set x = ? where y = ?");
2、设定参数
pstmt.setLong(1,123456789); pstmt.setLong(2,987654321);
3、执行语句
pstmt.executeUpdate();
1、使用Statement实例通过执行静态SELECT语句查询数据的代码:
- String sql = "sqlect * from database_name where sex = num ";
- Statement stmt = con.createStatement();
- PreparedStatement pstmt = con.prepareStatement(sql);
- CallableStatement cstmt = con.prepareCall("{CALL demoSp(?,?)}");
使用Statement实例执行静态SELECT语句查询记录:
- import java.sql.*;
- public class StatementStatic_QueryTest{
- static {
- try {
- Class.forName("com.mysql.cj.jdbc.Driver");
- }catch(ClassNotFoundException e) {
- e.printStackTrace();
- }
- }
- public static void main(String[] args) {
- try {
- Connection conn = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/mysql?characterEncoding=UTF-8","root","123456");
- Statement stmt = conn.createStatement();
- String sql = "select * from Statement_QueryTest";
- ResultSet rs = stmt.executeQuery(sql);
- while(rs.next()) {
- String name = rs.getString(1);
- int age = rs.getInt(2);
- String sex = rs.getString(3);
- System.out.println(name+" "+age+" "+sex+" ");
- }
- stmt.close();
- conn.close();
- }catch(SQLException e) {
- e.printStackTrace();
- }
- }
- }

输出:
张翰林 20 男
刘霖 18 女
胡政 21 男
王子怡 19 女
陈静仪 20 女
2、利用PreparedStatement实例通过执行动态SELECT语句查询数据的代码:
- String sql = "select * from database_name where sex = num ";
- PreparedStatement prpdStmt = connection.prepareStatement(sql);
- prpdStmt.setString(1,"男");
- ResultSet rs = prpdStmt.executeQuery();
使用PreparedStatement实例执行动态SELECT语句查询记录:
- import java.sql.*;
- public class StatementDynamic_QueryTest{
- static {
- try {
- Class.forName("com.mysql.cj.jdbc.Driver");
- }catch(ClassNotFoundException e) {
- e.printStackTrace();
- }
- }
- public static void main(String[] args) {
- try {
- Connection conn = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/mysql?characterEncoding=UTF-8","root","123456");
- Statement stmt = conn.createStatement();
- String sql = "select * from Statement_QueryTest"; //定义静态SELECT语句
- PreparedStatement prpdStmt = conn.prepareStatement(sql); //预处理动态INSERT语句
- ResultSet rs = prpdStmt.executeQuery(sql); //执行动态INSERT语句
- ResultSetMetaData metaData = rs.getMetaData();
- System.out.println(metaData.getColumnName(1)+" "); //通过列索引获得指定列的名称
- System.out.println(metaData.getColumnName(2)+" "); //通过列索引获得指定列的名称
- System.out.println(metaData.getColumnName(3)+" "); //通过列索引获得指定列的名称
- while(rs.next()) {
- String name = rs.getString(1); //通过列索引获得指定列的值
- int age = rs.getInt(2); //通过列索引获得指定列的值
- String sex = rs.getString(3); //通过列索引获得指定列的值
- System.out.println(name+" "+age+" "+sex+" ");
- }
- rs.close();
- prpdStmt.close();
- conn.close();
- }catch(SQLException e) {
- e.printStackTrace();
- }
- }
- }

输出:
name
age
sex
张翰林 20 男
刘霖 18 女
胡政 21 男
王子怡 19 女
陈静仪 20 女
3、利用CallableStatement实例通过执行存储过程查询数据的代码:
- String call = "{call pro_record_select_by_sex(?)}";
- CallableStatement cablStmt = connection.prepareStatement(call);
- cablStmt.setString(1,"男");
- ResultSet rs = cablStmt.executeQuery();
对数据的插入,可有两种操作模式:一种是直接使用SQL语句插入,而是通过可更新的结果集对象集间接插入,用下面的形式创建语句对象:
- Statement stmt = con.createStatement(ResultSet.TYPE)
- SCROLL_SENSITIVE,ResultSet.CUNCUR_UPDATABLE);
插入数据两种方式的实例
第一种:
String sqlins = "INSERT INTO student values(' "+name+" ',' "+age+" ',' "+sex+" ',' "+wage+" ',' "+" ',' "+addr+" ');
第二种
- rs.moveToInsertRow();
- rs.updateString("name","LiMing");
- rs.updateString("age",40);
- rs.updateString("sex","男");
- rs.updateString("wage",4500);
- rs.updateString("addr","北京市");
- rs.insertRow();
通过Statement实例执行静态INSERT语句添加单条记录
- import java.sql.*;
- public class StatementStatic_insertTest{
- static {
- try {
- Class.forName("com.mysql.cj.jdbc.Driver");
- }catch(ClassNotFoundException e) {
- e.printStackTrace();
- }
- }
- public static void main(String[] args) {
- try {
- Connection conn = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/mysql?characterEncoding=UTF-8","root","123456");
- Statement statement = conn.createStatement();
- String sql = "insert into Statement_QueryTest(name,age,sex) values ('刘乐',19,'女')";
- statement.executeUpdate(sql);
- statement.close();
- conn.close();
- System.out.println("插入数据成功");
- } catch (SQLException e){
- e.printStackTrace();
- }
- }
- }

通过Statement实例执行动态INSERT语句添加单条记录
- import java.sql.*;
- public class StatementDynamic_insertTest{
- static {
- try {
- Class.forName("com.mysql.cj.jdbc.Driver");
- }catch(ClassNotFoundException e) {
- e.printStackTrace();
- }
- }
- public static void main(String[] args) {
- try {
- Connection conn = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/mysql?characterEncoding=UTF-8","root","123456");
- String[] [] records = {{"王璇","22","女"}};
- String sql = "insert into Statement_QueryTest(name,age,sex) values (?,?,?)";
- PreparedStatement prpdStmt = conn.prepareStatement(sql); //预处理动态INSERT语句
- prpdStmt.clearBatch(); //清空Batch
- for(int i =0;i<records.length;i++) {
- prpdStmt.setString(1, records[i][0]); //向第一个?添加数据
- prpdStmt.setInt(2, Integer.valueOf(records[i][1]).intValue()); //向第二个?添加数据
- prpdStmt.setString(3, records[i][2]); //向第三个?添加数据
- prpdStmt.addBatch(); //将INSERT语句添加到Batch中
-
- }
- prpdStmt.executeBatch(); //批量执行Batch中的INSERT语句
- prpdStmt.close();
- conn.close();
- System.out.println("插入数据成功");
- } catch (SQLException e){
- e.printStackTrace();
- }
- }
- }

1、利用Statement实例通过执行静态Update语句修改数据代码:
- String sql = "updqte tb_record set sqlary = ? where duty = ? ";
- statement.executeUpdate(sql);
2、利用Statement实例通过执行动态Update语句修改数据代码:
- String sql = "update tb_record set salary = ? where duty = ?";
- PreparedStatement prpdStmt = connection.preparedStatement(sql);
- prpdStmt.setInt(1,300);
- prpdStmt.setString(2,"部门经理");
- prpdStmt.executeUpdate();
- 3、利用CallableStatement实例通过执行存储过程修改数据代码:
- String call = "{call pro_record_update_salary_by_duty(?,?)}";
- CallableStatement cablStmt = connection preparedCall(call);
- cablStmt.setInt(1,3000);
- cablStmt.setString(2,"部门经理");
- cablStmt.executeUpdate();
- 通过Statement实例每次执行一条UPDATE语句
- import java.sql.*;
- public class StatementStatic_UpdateTest{
- static {
- try {
- Class.forName("com.mysql.cj.jdbc.Driver");
- }catch(ClassNotFoundException e) {
- e.printStackTrace();
- }
- }
- public static void main(String[] args) {
- try {
- Connection conn = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/mysql?characterEncoding=UTF-8","root","123456");
- Statement statement = conn.createStatement();
- String sql = "update Statement_QueryTest set name = '刘子扬' where name = '胡政'";
- statement.executeUpdate(sql);
- conn.close();
- }catch(SQLException e) {
- e.printStackTrace();
- }
- }
- }

1、利用Statement实例通过执行静态DELETE语句修改数据代码:
- String sql = "delete from Statement_QueryTest where name = "王浩";
- statement.executeUpdate(sql);
2、利用PreparedStatement实例通过执行动态DELETE语句修改数据代码:
- String sql = "delete from Statement_QueryTest where name = "王浩";
- PreparedStatemnet prpdStmt = connection.preparedStatement(sql);
- prdStmt.setString(1,"李宁");
- prpdStmt.executeUpdate(sql);
3、利用CallableStatement实例通过执行存储过程删除数据代码:
- String call = "{call Statement_QueryTest_delete_by_date(?)}";
- CallableStatement cablStmt = connection preparedCall(call);
- cablStmt.setInt(1,"李宁");
- cablStmt.executeUpdate();
通过Statement实例每次执行一条DELETE语句
- import java.sql.*;
- public class Statement_DeleteTest{
- static {
- try {
- Class.forName("com.mysql.cj.jdbc.Driver");
- }catch(ClassNotFoundException e) {
- e.printStackTrace();
- }
- }
- public static void main(String[] args) {
- try {
- Connection conn = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/mysql?characterEncoding=UTF-8","root","123456");
- Statement statement = conn.createStatement();
- String sql = "delete from Statement_QueryTest where name = '刘子扬'";
- statement.executeUpdate(sql);
- statement.close();
- conn.close();
- }catch(SQLException e) {
- e.printStackTrace();
- }
- }
- }
- 通过PreparedStatement实例一次执行多条DELETE语句
- import java.sql.*;
- public class PreparedStatement_DeleteTest{
- static {
- try {
- Class.forName("com.mysql.cj.jdbc.Driver");
- }catch(ClassNotFoundException e) {
- e.printStackTrace();
- }
- }
- public static void main(String[] args) {
- try {
- Connection conn = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/mysql?characterEncoding=UTF-8","root","123456");
- Statement statement = conn.createStatement();
- String names[] = {"张飞","张小霞"};
- String sql = "delete from StatementStatic_QueryTest where name = ?";
- PreparedStatement prpdStmt = conn.prepareStatement(sql);
- prpdStmt.clearBatch();
- for(int i = 1 ;i<names.length;i++) {
- prpdStmt.setString(1, names[i]);
- prpdStmt.addBatch();
- }
- prpdStmt.executeBatch();
- conn.close();
- }catch(SQLException e) {
- e.printStackTrace();
- }
- }
- }

数据库连接池的基本思想 就是为数据库连接建立一个“缓冲池”。预先在缓冲池中放入一定数量的连接,当需要建立数据库连接时,只需从“缓冲池”中取出一个,使用完毕之后再放回去。我们可以通过设定连接池最大连接数来防止系统无尽的与数据库连接。更为重要的是我们可以通过连接池的管理机制监视数据库的连接的数量﹑使用情况,为系统开发﹑测试及性能调整提供依据。
资源重用
由于数据库连接得以重用,避免了频繁创建,释放连接引起的大量性能开销。在减少系统消耗的基础上,另一方面也增加了系统运行环境的平稳性。
更快的系统反应速度
数据库连接池在初始化过程中,往往已经创建了若干数据库连接置于连接池中备用。此时连接的初始化工作均已完成。对于业务请求处理而言,直接利用现有可用连接,避免了数据库连接初始化和释放过程的时间开销,从而减少了系统的响应时间
新的资源分配手段
对于多应用共享同一数据库的系统而言,可在应用层通过数据库连接池的配置,实现某一应用最大可用数据库连接数的限制,避免某一应用独占所有的数据库资源
统一的连接管理,避免数据库连接泄漏
在较为完善的数据库连接池实现中,可根据预先的占用超时设定,强制回收被占用连接,从而避免了常规数据库连接操作中可能出现的资源泄露
导入c3p0依赖
jdbc依赖
MySQL Connector依赖
创建c3p0配置文件c3p0-config.xml
测试
// 1、创建数据库连接池对象
DataSource ds = new ComboPooledDataSource();
// 2、获取连接对象
Connection conn = ds.getConnection();后面的代码和jdbc就接通了
c3p0.properties
Druid为阿里巴巴的数据源,(数据库连接池),集合了c3p0、dbcp、proxool等连接池的优点,还加入了日志监控,有效的监控DB池连接和SQL的执行情况。
导入Druid的依赖
编写Druid.properties配置文件
测试
- import com.alibaba.druid.pool.DruidDataSourceFactory;
- import javax.sql.DataSource;
- import java.io.IOException;
- import java.io.InputStream;
- import java.sql.Connection;
- import java.sql.PreparedStatement;
- import java.sql.ResultSet;
- import java.sql.SQLException;
- import java.util.Properties;
-
- public class DruidDemo {
- public static void main(String[] args) {
- //1.导入jar包
- //2.定义配置文件
- //3.加载配置文件
- Properties pro = new Properties();
- InputStream resourceAsStream = DruidDemo.class.getClassLoader().getResourceAsStream("Druid.properties");
- Connection connection = null;
- PreparedStatement preparedStatement = null;
- ResultSet resultSet = null;
- try {
- pro.load(resourceAsStream);
- DataSource ds = DruidDataSourceFactory.createDataSource(pro);
- connection = ds.getConnection();
- String sql = "Select * from studnet.class1";
- preparedStatement = connection.prepareStatement(sql);
- resultSet = preparedStatement.executeQuery();
- while (resultSet.next()){
- Integer id = resultSet.getInt("序号");
- String name = resultSet.getString("学号");
- String value = resultSet.getString("姓名");
-
- System.out.println(id+" "+name+" "+value);
- }
- } catch (IOException e) {
- e.printStackTrace();
- } catch (SQLException e) {
- e.printStackTrace();
- } catch (Exception e) {
- e.printStackTrace();
- } finally {
- if (connection!=null){
- try {
- connection.close();
- } catch (SQLException e) {
- e.printStackTrace();
- }
- }
- if (resultSet!=null){
- try {
- resultSet.close();
- } catch (SQLException e) {
- e.printStackTrace();
- }
- }
- if (preparedStatement!=null){
- try {
- preparedStatement.close();
- } catch (SQLException e) {
- e.printStackTrace();
- }
- }
- }
- }
- }

Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。