zoukankan      html  css  js  c++  java
  • 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);
  • 相关阅读:
    js上传照片本地预览
    2020年6月23日第一次面试题(外派PA)
    笔记
    2020VUE系统回顾与学习
    2019最全前端面试问题及答案总结
    常见的浏览器兼容性问题总结
    Vue咖啡app项目总结
    跨域问题研究总结
    Class.forName()用法及与new区别
    反射
  • 原文地址:https://www.cnblogs.com/yzcstart/p/11248943.html
Copyright © 2011-2022 走看看