JDBC(Java DataBase Connectivity)

JDBC本质:其实是官方定义的一套所有关系型数据库的规则,即接口。各个数据库厂商去实现这套                        接口,提供数据库驱动jar包。我们可以使用这套接口编程,真正执行的代码是驱动jar包                        终端额实现类。

 

步骤:1.导入驱动jar包 mysql-connector-java

           2.注册驱动

           3.获取数据库连接对象 Connection

   4.定义sql

   5.获取执行sql语句的对象 Statement

   6.执行sql,接收返回结果

   7.处理结果

   8.释放资源

 

 

 1.sql注入问题:在拼接sql时,有一些sql的特殊关键字参与字符串的拼接。会造成安全性问题

    1.输入用户随便,输入密码:a' or 'a' = 'a

    2.sql:select * from user where username = 'hfhfa' and password = 'a' or 'a' = 'a'

2.解决sql注入问题:使用PreparedStatement对象来解决

3.预编译的SQL:参数使用?作为占位符

4.步骤:

   1.导入驱动jar包 mysql-connector-java

           2.注册驱动

           3.获取数据库连接对象 Connection

   4.定义sql

    *注意:sql的参数使用?作为占位符。如:select * from user where username = ?and password = ?;

   5.获取执行sql语句的对象 PreparedStatement    Connection.PerpareStatement(String sql)

   6.给?赋值

    *方法;setXXX(参数1,参数2)

      参数1:?的位置编号 从1开始

      参数2:?的值

   7.执行sql,接收返回结果,不需要传递sql语句

   8.处理结果

   8.释放资源

 

JDBC管理事务

1.事物:一个包含多个步骤的业务操作。如果这业务操作被事务管理,则这多个步骤要么同时成功,要么同时失败

2.操作:

    *开启事务

    *提交事务

    *回滚事务

3.使用Connection对象来管理事务

    *开启事物:setAutoCommit(boolean autoCommit):调用该方法设置参数为false,即开启事物

      -----执行sql之前开启事务

    *提交事物:commit()

      -----当所有sql都执行完提交事务

    *回滚事物:roolback()

      -----在catch中回滚事务

 

 C3P0数据库连接池技术

步骤:1.导入jar包

    *导入jar包(两个)c3p0-0.9.5.2.jar mchange-commoms-java-0.12.jar,不要忘记导入数据库驱动jar包

   2.定义配置文件

    *名称:c3p0.properties 或者 c3p0-config.xml

    *路径:直接将文件放在src目录下即可

   3.创建核心对象 数据库连接池对象 comboPooledDataSource

   4.获取连接:getConnection

 

c3p0-config.xml 配置文件

<?xml version="1.0" encoding="utf-8"?>
<c3p0-config>
<default-config>
<!-- 连接参数-->
<property name="driverClass">com.mysql.jdbc.Driver</property>
<property name="jdbcUrl">jdbc:mysql://localhost:3306/itcast</property>
<property name="user">root</property>
<property name="password">123456</property>

<!-- 连接池参数-->
<!-- 初始申请连接数量-->
<property name="initialPoolSize">5</property>
<!-- 最大连接数量-->
<property name="maxPoolSize">10</property>
<!-- 超时时间-->
<property name="checkoutTimeout">3000</property>

</default-config>

<named-config name="otherc3p0"> //可以指定配置选项
</named-config>
</c3p0-config>

测试1:

package c3p0;

import com.mchange.v2.c3p0.ComboPooledDataSource;

import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.SQLException;

/*
c3p0数据库连接池演示
*/
public class c3p0demo {
public static void main(String[] args) throws SQLException {
//1.创建数据库连接池对象
DataSource ds = new ComboPooledDataSource();
//2.获取连接对象
Connection conn = ds.getConnection();
//3.打印
System.out.println(conn);
}
}

结果:
com.mchange.v2.c3p0.impl.NewProxyConnection@2a18f23c [wrapping: com.mysql.jdbc.JDBC4Connection@d7b1517]

测试2:

package c3p0;

import com.mchange.v2.c3p0.ComboPooledDataSource;

import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.SQLException;

/*

c3p0配置文件参数演示
*/
public class c3p0demo2 {
public static void main(String[] args) throws SQLException {
//1.获取DataSource
DataSource ds = new ComboPooledDataSource();//可以指定配置文件名称,调用对应的配置文件
//2.获取连接
for (int i = 1;i <= 11; i++){
Connection conn = ds.getConnection();
System.out.println(i+":"+conn);
if (i == 5){
conn.close();//归还连接到连接池中
}
}
}
}

结果:

1:com.mchange.v2.c3p0.impl.NewProxyConnection@2a18f23c [wrapping: com.mysql.jdbc.JDBC4Connection@d7b1517]
2:com.mchange.v2.c3p0.impl.NewProxyConnection@23223dd8 [wrapping: com.mysql.jdbc.JDBC4Connection@4ec6a292]
3:com.mchange.v2.c3p0.impl.NewProxyConnection@ea4a92b [wrapping: com.mysql.jdbc.JDBC4Connection@3c5a99da]
4:com.mchange.v2.c3p0.impl.NewProxyConnection@5a01ccaa [wrapping: com.mysql.jdbc.JDBC4Connection@71c7db30]
5:com.mchange.v2.c3p0.impl.NewProxyConnection@4563e9ab [wrapping: com.mysql.jdbc.JDBC4Connection@11531931]
6:com.mchange.v2.c3p0.impl.NewProxyConnection@4cdbe50f [wrapping: com.mysql.jdbc.JDBC4Connection@11531931]
7:com.mchange.v2.c3p0.impl.NewProxyConnection@7cf10a6f [wrapping: com.mysql.jdbc.JDBC4Connection@7e0babb1]
8:com.mchange.v2.c3p0.impl.NewProxyConnection@5ba23b66 [wrapping: com.mysql.jdbc.JDBC4Connection@2ff4f00f]
9:com.mchange.v2.c3p0.impl.NewProxyConnection@3f0ee7cb [wrapping: com.mysql.jdbc.JDBC4Connection@75bd9247]
10:com.mchange.v2.c3p0.impl.NewProxyConnection@7dc36524 [wrapping: com.mysql.jdbc.JDBC4Connection@35bbe5e8]
11:com.mchange.v2.c3p0.impl.NewProxyConnection@5a39699c [wrapping: com.mysql.jdbc.JDBC4Connection@3cb5cdba]

 

 

Druid数据库连接池

步骤:1.导入jar包 druid-1.0.9.jar

   2.定义配置文件

    *是properties形式的

    *可以叫任意名称,可以在放在任意目录下

   3.加载配置文件

   4.获取数据库连接池对象:通过工厂类来获取 DruidDataSourceFactory

   5.获取连接:getConnection

druid.properties 配置文件


driverClassName=com.mysql.jdbc.Driver
url=jdbc:mysql://127.0.0.1:3306/itcast?useSSL=false
useSSL=true
username=root
password=123456

#初始化连接数量
initialSize=5

#最大连接数
maxActive=10

#最大等待时间
maxWait=3000
minIdle=3

测试1:

package druid;

import com.alibaba.druid.pool.DruidDataSourceFactory;

import javax.sql.DataSource;
import java.io.IOException;
import java.io.InputStream;
import java.sql.Connection;
import java.util.Properties;

public class Druiddemo {
public static void main(String[] args) throws Exception {
//1.导入jar包
//2.定义配置文件
//3.加载配置文件
Properties pro = new Properties();
InputStream is = Druiddemo.class.getClassLoader().getResourceAsStream("druid.properties");
pro.load(is);
//4.获取连接池对象
DataSource ds = DruidDataSourceFactory.createDataSource(pro);

//5.获取连接
Connection conn = ds.getConnection();
System.out.println(conn);

}
}

 

定义工具类

1.定义一个JDBCUtils

2.提供静态代码块加载配置文件,初始化连接池对象

3.提供方法

  *获取连接对象:通过数据库连接池获取连接

  *释放资源

  *获取连接池的方法

Druid 连接池的工具类
package util;

import com.alibaba.druid.pool.DruidDataSourceFactory;

import javax.sql.DataSource;
import java.io.IOException;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;

/*
Druid 连接池的工具类
*/
public class JDBCUtils {

//1.定义成员变量
private static DataSource ds;

static {
//1.加载配置文件
Properties pro = new Properties();

try {
pro.load(JDBCUtils.class.getClassLoader().getResourceAsStream("druid.properties"));

//2.获取datasource
ds = DruidDataSourceFactory.createDataSource(pro);
} catch (IOException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
}

//2.获取连接
public static Connection getConnection() throws SQLException {
return ds.getConnection();
}

//3.释放资源
public static void close(Statement stmt,Connection conn){
close(null,stmt,conn);
}

public static void close(ResultSet rs ,Statement stmt, Connection conn){
if(rs != null){
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(stmt != null){
try {
stmt.close();
} catch (SQLException e) {
e.printStackTrace();
}
}

if(conn != null){
try {
conn.close();//归还连接
} catch (SQLException e) {
e.printStackTrace();
}
}
}

//4.获取连接池
public static DataSource getDataSource(){

return ds;
}

}

 工具类测试代码:


package druid;

import util.JDBCUtils;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;

/*
使用新的工具类
*/
public class DruidDemo2 {

public static void main(String[] args) {
Connection conn = null;
PreparedStatement pstmt = null;
try {
//1.获取连接
conn = JDBCUtils.getConnection();
//2.定义sql
String sql = "insert into student values(null,?,?)";
//3.获取pstm对象
pstmt = conn.prepareStatement(sql);
//4.给?赋值
pstmt.setString(1,"王五");
pstmt.setDouble(2,3000);
//4.执行sql
int count = pstmt.executeUpdate();
System.out.println(count);


} catch (SQLException e) {
e.printStackTrace();
}finally {
JDBCUtils.close(pstmt,conn);
}
}
}

 

Spring JDBC

Spring框架对JDBC的简单封装。提供了一个JDBCTemplate对象简化JDBC的开发

步骤:1.导入jar包

   2.创建JdbcTemplate对象。依赖数据源DataSource

   3.调用JdbcTemplate的方法来完成CRUD的操作

    *******update() 执行DML语句。增、删除、改语句

    *******queryForMap() 查询结果,将结果集封装为map集合,(将列名作为key,将值作为value,将这条记录封装为一个map集合)这个方法查询的结果只能是1个结果

    *******queryForList() 查询结果,将结果集封装为list集合,(将每一条记录封装为map集合,再将map集合装载到list集合中)

    *******query() 查询结果,将结果封装为JavaBean对象,(一般我们使用BeanPropertyRowMapper实现类,可以完成数据到JavaBean的自动封装)BeanPropertyRowMapper<类型>(类型.class)

 

    *******queryForObject() 查询结果,将结果封装为对象,(一般用于聚合函数的查询)

 

 druid.properties配置文件

driverClassName=com.mysql.jdbc.Driver
url=jdbc:mysql://127.0.0.1:3306/itcast?useSSL=false  更改红色数据库
useSSL=true
username=root
password=123456
initialSize=5
maxActive=10
maxWait=3000
minIdle=3

JDBCUtils工具类

package util;

import com.alibaba.druid.pool.DruidDataSourceFactory;

import javax.sql.DataSource;
import java.io.IOException;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;

public class JDBCUtils {

    //1.定义成员变量
    private  static DataSource ds;

    static {
        //1。加载配置文件
        Properties pro = new Properties();

        try {
            pro.load(JDBCUtils.class.getClassLoader().getResourceAsStream("druid.properties"));

            //2.获取datasource
            ds = DruidDataSourceFactory.createDataSource(pro);
        } catch (IOException e) {
            e.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public static  Connection getConnection() throws SQLException {
        return ds.getConnection();
    }

    public static void close(Statement stmt,Connection conn){
        close(null,stmt,conn);
    }

    public static void close(ResultSet rs ,Statement stmt, Connection conn){

        if(rs != null){
            try {
                rs.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        if(stmt != null){
            try {
                stmt.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }

        if(conn != null){
            try {
                conn.close();//归还连接
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }
    //获取连接池

    public static DataSource getDataSource(){
        return ds;
    }


}

JdbcTemplateDemo1 测试

package jdbctemplate;

import com.alibaba.druid.util.JdbcUtils;
import org.springframework.jdbc.core.JdbcTemplate;
import util.JDBCUtils;

public class JdbcTemplateDemo1 {
    public static void main(String[] args) {
        //1.导入驱动jar包
        //2.创建JdbcTemplate对象
        JdbcTemplate template = new JdbcTemplate(JDBCUtils.getDataSource());
        //3.调用方法
        String sql = "update student set balance = 2000 where id = ?";
        int count = template.update(sql, 3);
        System.out.println(count);
    }

}

练习:数据库名称为emp

//创建jdbctemplate对象
JdbcTemplate template = new JdbcTemplate(JDBCUtils.getDataSource());

1.修改1号数据的 salary 为 10000

//3.调用方法
String sql = "update emp set salary = 10000 where id = 1";
int count = template.update(sql);
System.out.println(count);

2.添加一条记录

//3.调用方法
String sql = "insert into emp(id,name,dept_id) values(?,?,?) ";
int count = template.update(sql,1015,"郭靖",10);
System.out.println(count);

3.删除刚才添加的记录

//3.调用方法
String sql = "delete from emp where id = ?";
int count = template.update(sql,1015);
System.out.println(count);

4.查询id为1的记录,将其封装为Map集合 (将列名作为key,将值作为value,将这条记录封装为一个map集合)这个方法查询的结果只能是1个结果

//3.调用方法
String sql = "select * from emp where id = ?";
Map<String, Object> map = template.queryForMap(sql, 1);
System.out.println(map);

5.查询所有记录,将其封装为list(将每一条记录封装为map集合,再将map集合装载到list集合中)

//3.调用方法
String sql = "select * from emp";
List<Map<String, Object>> list = template.queryForList(sql);
for (Map<String, Object> map : list) {
System.out.println(map);
}

6.查询所有记录,将其封装为Emp对象的list集合

String sql = "select * from emp";
List<Emp> list = template.query(sql, new BeanPropertyRowMapper<Emp>(Emp.class));
for (Emp emp : list) {
System.out.println(emp);
}

7.查询总记录数

//3.调用方法
String sql = "select * from emp";
Long total = template.queryForObject(sql, Long.class);
System.out.println(total);

 

posted @ 2019-07-26 10:58  Yzc_start  阅读(326)  评论(0编辑  收藏  举报