您的位置:68399皇家赌场 > 虚拟主机 > Java JDBC 操作

Java JDBC 操作

发布时间:2019-05-03 21:48编辑:虚拟主机浏览(87)

    数据库连接池

    DBCP DataBase Conection Pool:数据库连接池

    倘使没有数据库连接池,每一趟事情都亟待服务器和数据库服务器建构三遍一连,业务管理完连接断开,假若有一万次工作管理,则须求树立一万次一连,而服务器和数据库服务器频仍开关连接相当占用能源。 使用数据库连接池,连接池起始化时得以钦点多少个起来连接,即便有连日进来直接采纳起来连接,那样不用每一次都成立连接,那样能够保障前几回不用建构新连接直接行使起来连接,当呼吁数量超过开首连接数量的时候,然后查看最哈拉雷接数量,要是未有到最大数据则在池中新建二个接连,要是到了最大数量并且当前又不曾空余连接 那就只好等待某些连接空闲

    0叁备选数据

    * A: 准备数据
        * a: 创建数据库和表结构
            #创建数据库
            create database mybase;
            #使用数据库
            use mybase;
            ###创建分类表
            create table sort(
              sid int PRIMARY KEY AUTO_INCREMENT,
              sname varchar(100),
              sprice DOUBLE,
              sdesc VARCHAR(500)
            );
    
        * b: 向表中插入数据
            #初始化数据
            insert into sort(sname,sprice,sdesc) values('家电',2000, '优惠的促销');
            insert into sort(sname,sprice,sdesc) values('家具',8900, '家具价格上调,原材料涨价');
            insert into sort(sname,sprice,sdesc) values('儿童玩具',290, '赚家长的钱');
            insert into sort(sname,sprice,sdesc) values('生鲜',500.99, '生鲜商品');
            insert into sort(sname,sprice,sdesc) values('服装',24000, '换季销售');
            insert into sort(sname,sprice,sdesc) values('洗涤',50, '洗发水促销');          
    

    1、JDBC基本操作

    壹)在数据库先创制一张表Student

    CREATE TABLE student(
        id INT AUTO_INCREMENT,
        NAME VARCHAR(20),
        age INT ,
        PRIMARY KEY(id)
    );
    

    2)jdbc实现

    package com.huan.jdbc;
    
    import java.sql.Connection;
    import java.sql.DriverManager;
    import java.sql.ResultSet;
    import java.sql.SQLException;
    import java.sql.Statement;
    
    public class JDBCDemo01 {
        public static void main(String[] args) {
            //声明连接
            Connection connection = null;
            try {
                //加载驱动
                Class.forName("com.mysql.jdbc.Driver");
                //数据库连接信息
                //地址  jdbc:mysql://地址/数据库
                String url = "jdbc:mysql://localhost:3306/huan";
                String user = "root";
                String password = "root";
                //获得连接
                connection = DriverManager.getConnection(url, user, password);
                //语句对象
                Statement st = connection.createStatement();
                String sql = "insert into student (name,age) values ('zhangsan',30)";
                //执行sql  DDL-execute()方法  DML-executeUpdate()方法 DQL-executeQuery()方法
                int n = st.executeUpdate(sql);
                String querySql = "select id,name,age from student";
                ResultSet rs = st.executeQuery(querySql);
                //处理结果
                while(rs.next()){
                    int id = rs.getInt("id");
                    String name = rs.getString("name");
                    int age = rs.getInt("age");
                    System.out.println("id:" id " name:" name " age:" age);
                }
                //释放资源
                rs.close();
                st.close();
    
            } catch (Exception e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }finally {
                //关闭连接
                if(connection != null){
                    try {
                        connection.close();
                    } catch (SQLException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                }
            }
    
        }
    }
    

    上边先进行了一条插入语句,由于主键id是自增的,因而直插入了名字zhangsan和年龄30,然后查询了表的数额

    输出如下:

    id:1 name:zhangsan age:30
    

    1.简介

    JDBC(Java DataBase Connectivity) 是一种可用于推行SQL语句的Java API,是一套面向对象的应用程序接口,

    集结了数据库的拜会方式,数据库厂家提供了得以落成接口的类,称为‘驱动程序’。由此JDBC并不能够直接待上访问数据库,

    亟需依据数据库商家提供的JDBC驱动程序。

    --SQL语言:

    多少定义语言(Data Definition Language,DDL)如:create,alter,drop等

    数码操纵语言(Data Manipulation Language,DML)如update,delete等

    数据查询语言(Data Query language,DQL),查询

    多少调节语言(Data Control Language,DCL),如grant,revoke等

    政工调整语言(Transaction Control Language,TCL),如commit,rollback等

    PrepareStatement

    -好处: 一. 相相比较Statment 代码结构整齐,可读性更加高。 二. 饱含预编译效果,sql语句只编写翻译一遍,然后只须要修改区别的参数就能够,所以进行作用要超越Statment(效果不是太明显) 叁. 带有预编写翻译效果,能够免止SQL注入,因为在预编写翻译的时候曾经把sql逻辑固定,假设替换占位符的内容包罗了和逻辑相关的如:or 会不奏效

    注册登入的sql:

    create table user(id int primary key auto_increment,username varchar(20),password varchar(20));
    
    insert into user values(null,'liudehua','admin'), (null,'zhangxueyou','admin'), (null,'liming','admin'), (null,'zhaosi','admin');
    

     

    课程回想: 1. Properties 读取配置文件的靶子 二. 高级的封装 三. dbcp 连接池

    1. 最后版DBUtils 五. PrepareStatement 6. SQL注入 作业: 1.把 DBUtils最后版会背写 二.领会PrepareStatement的利用

    2. 经过JDBC达成 成立学生表(id,name,age) 插入学生的措施 删除学生的措施 修改学生的措施 查询全数学生的艺术

    07获得数据库的接二连三对象

    * A:获取数据库的连接对象
        * a: 案例代码
            public class JDBCDemo {
                public static void main(String[] args)throws ClassNotFoundException,SQLException{
                    //1.注册驱动 反射技术,将驱动类加入到内容
                    // 使用java.sql.DriverManager类静态方法 registerDriver(Driver driver)
                    // Diver是一个接口,参数传递,MySQL驱动程序中的实现类
                    //DriverManager.registerDriver(new Driver());
                    //驱动类源代码,注册2次驱动程序
                    Class.forName("com.mysql.jdbc.Driver");
    
                    //2.获得数据库连接  DriverManager类中静态方法
                    //static Connection getConnection(String url, String user, String password)  
                    //返回值是Connection接口的实现类,在mysql驱动程序
                    //url: 数据库地址  jdbc:mysql://连接主机IP:端口号//数据库名字
                    String url = "jdbc:mysql://localhost:3296/mybase";
                    //用户名和密码用自己的
                    String username="root";
                    String password="123";
                    Connection con = DriverManager.getConnection(url, username, password);
                    System.out.println(con);                    
                }
            }
    

    3.JDBC的操作

    步骤:

    壹.登记驱动

    二.老是数据库

    叁.创立语句对象,用于实践SQL

    4.执行SQL

    伍.甩卖实践结果

    陆.闭馆连接

    二.预备干活,以Mysql为例

    a.安装了Mysql 数据库

    b.下载mysql驱动包并在类型中程导弹入jar包:mysql-connector-java-伍.壹.4贰-bin.jar 

    二三测试工具类

    * A: 测试工具类
        * a: 案例代码
            public class TestJDBCUtils {
                public static void main(String[] args) {
                    Connection con = JDBCUtilsConfig.getConnection();
                    System.out.println(con);
                }
            }
    

    1.简介

    JDBC(Java DataBase Connectivity) 是壹种可用于施行SQL语句的Java API,是1套面向对象的应用程序接口,

    集合了数据库的拜会情势,数据库商家提供了得以实现接口的类,称为‘驱动程序’。由此JDBC并不可能间接待上访问数据库,

    亟需依据数据库商家提供的JDBC驱动程序。

    --SQL语言:

    数码定义语言(Data Definition Language,DDL)如:create,alter,drop等

    数量垄断(monopoly)语言(Data Manipulation Language,DML)如update,delete等

    多少查询语言(Data Query language,DQL),查询

    数码调节语言(Data Control Language,DCL),如grant,revoke等

    业务调节语言(Transaction Control Language,TCL),如commit,rollback等

    1、JDBC基本操作

    1)在数据库先创设一张表Student

    CREATE TABLE student(
        id INT AUTO_INCREMENT,
        NAME VARCHAR(20),
        age INT ,
        PRIMARY KEY(id)
    );
    

    2)jdbc实现

    package com.huan.jdbc;
    
    import java.sql.Connection;
    import java.sql.DriverManager;
    import java.sql.ResultSet;
    import java.sql.SQLException;
    import java.sql.Statement;
    
    public class JDBCDemo01 {
        public static void main(String[] args) {
            //声明连接
            Connection connection = null;
            try {
                //加载驱动
                Class.forName("com.mysql.jdbc.Driver");
                //数据库连接信息
                //地址  jdbc:mysql://地址/数据库
                String url = "jdbc:mysql://localhost:3306/huan";
                String user = "root";
                String password = "root";
                //获得连接
                connection = DriverManager.getConnection(url, user, password);
                //语句对象
                Statement st = connection.createStatement();
                String sql = "insert into student (name,age) values ('zhangsan',30)";
                //执行sql  DDL-execute()方法  DML-executeUpdate()方法 DQL-executeQuery()方法
                int n = st.executeUpdate(sql);
                String querySql = "select id,name,age from student";
                ResultSet rs = st.executeQuery(querySql);
                //处理结果
                while(rs.next()){
                    int id = rs.getInt("id");
                    String name = rs.getString("name");
                    int age = rs.getInt("age");
                    System.out.println("id:" id " name:" name " age:" age);
                }
                //释放资源
                rs.close();
                st.close();
    
            } catch (Exception e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }finally {
                //关闭连接
                if(connection != null){
                    try {
                        connection.close();
                    } catch (SQLException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                }
            }
    
        }
    }
    

    上边先实行了一条插入语句,由于主键id是自增的,由此直插入了名字zhangsan和年龄30,然后查询了表的数据

    出口如下:

    id:1 name:zhangsan age:30
    

    一五PrepareStatement接口预编写翻译SQL语句推行查询

    * A: PrepareStatement接口预编译SQL语句执行查询
        * a: 案例代码
            /*
             *  PrepareStatement接口实现数据表的查询操作
             */
            public class JDBCDemo1 {
                public static void main(String[] args) throws Exception{
                    Class.forName("com.mysql.jdbc.Driver");
                    String url = "jdbc:mysql://localhost:3296/mybase";
                    String username="root";
                    String password="123";
                    Connection con = DriverManager.getConnection(url, username, password);  
    
                    String sql = "SELECT * FROM sort";
    
                    PreparedStatement pst = con.prepareStatement(sql);
    
                    //调用pst对象的方法,执行查询语句,Select
                    ResultSet rs=pst.executeQuery();
                    while(rs.next()){
                        System.out.println(rs.getString("sid") "  " rs.getString("sname") "  " rs.getString("sprice") "  " rs.getString("sdesc"));
                    }
                    rs.close();
                    pst.close();
                    con.close();
                }
            }
    

    肆、JDBC的批量操作

    PrepareStatement和Statement都提供了能够批量操作SQL的章程

    一.将sql增加至缓存区

    Statement: addBatch(sql)方法,能够将sql直接加多Statement缓存区;

    PrepareStatement:需求先实行setxxx(n,参数)方法将参数赋值,然后调用addBatch(sql)方法

    贰.推行executeBatch()将参数批量发送到数据库,并且实行

    3.足以动用clearBatch()清空缓存区的参数只怕sql

    package com.huan.jdbc;
    
    import java.sql.Connection;
    import java.sql.PreparedStatement;
    import java.sql.SQLException;
    import java.sql.Statement;
    import java.util.Arrays;
    
    import org.junit.Test;
    
    public class JDBCBatchDemo {
    
    
        @Test
        public void testJdbcPrepareBatch(){
    
            Connection connection = null;
            PreparedStatement ps = null;
    
            try {
                connection = JDBCUtil.getConnection();
                String sql  = "insert into student (name,age) values (?,?)";
                ps = connection.prepareStatement(sql);
                ps.setString(1, "ps1");
                ps.setInt(2, 11);
                ps.addBatch();
                ps.setString(1, "ps2");
                ps.setInt(2, 12);
                ps.addBatch();
                int [] n = ps.executeBatch();
                System.out.println(Arrays.toString(n));    
            } catch (SQLException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
    
    
    
    
        }
    
    
        @Test
        public void testJdbcStatementBatch(){
            Connection connection = null;
            Statement st = null;
            try {
                connection = JDBCUtil.getConnection();
                String sql1 = "insert into student(name,age) values('statement1',20)";
                String sql2 = "insert into student(name,age) values('statement2',30)";
                String sql3 = "insert into student(name,age) values('statement3',40)";
    
                st = connection.createStatement();
                //批量添加
                st.addBatch(sql1);
                st.addBatch(sql2);
                st.addBatch(sql3);
                //执行
                int [] n = st.executeBatch();
    
                System.out.println(Arrays.toString(n));
    
            } catch (SQLException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }finally{
                JDBCUtil.close(connection, st, null);
            }
        }
    
    
    }
    

    testJdbcStatementBatch()测试方法完结后翻看数据库,数据成功增添:

    澳门皇家赌场55533网址 1

    testJdbcPrepareBatch()测试方法实施之后查看数据库,数据成功增加:

    澳门皇家赌场55533网址 2

    三 SQL预管理及工作

    SQL预管理:在此前的管理中都是将sql语句发送到数据库,有数据库的sql解释器把sql语句生成底层的中间命令,然后施行命令,达成操作,当前相连的

                      向数据库发送sql语句,会追加数据库sq解释器的承受,影响施行进程。

                      而Connection的prepareStatement(Stirng sql)方法可以对sql语句进行预管理,生成数据底层的一声令下,并封装在PrepareStatement对

                      象中,通过相应的章程施行底层数据库的授命,从而缓慢解决数据库的承担,升高访问速度。

                      并且在此之前的sql都以东拼西凑的,当带参数拼接时便于变成SQL的注入(参数中蕴涵sql成分,改换原来的sql语句逻辑),而PrepareStatement在

                     编写翻译之后,当中的sql施行布署现已规定,当替换参数时不会转移施行安插,由此得以幸免sql注入。

    作业调控:   当大家在编排逻辑的时候,存在多条的插入可能更新语句,前边的sql成功进行之后出现谬误,那时导致业务逻辑中断,而实践成功的多寡现已

                     存入数据库,从而导致数据不完全。为幸免那种业务的发生就必要手动进行业务调节。

                    一.关闭自动提交--connection.setAutoCommit(false);

                    二.政工实践到位后提交-connection.commit();

                    叁.在遇到尤其时回滚-connection.rollback();

    package com.huan.jdbc;
    
    import java.sql.Connection;
    import java.sql.PreparedStatement;
    import java.sql.ResultSet;
    import java.sql.ResultSetMetaData;
    import java.sql.SQLException;
    import java.sql.Statement;
    
    public class PrepareStatementDemo {
        public static void main(String[] args) {
            Connection connection = null;
            //SQL预处理对象
            PreparedStatement ps = null;
            ResultSet rs =null;
    
            try {
                connection = JDBCUtil.getConnection();
                connection.setAutoCommit(false);
                //?代表参数
                String sql = "insert into student (name,age) values(?,?)";
                //编译预执行计划 在数据库上创建执行计划  
                //(第二个参数可以不要-Statement.RETURN_GENERATED_KEYS 代表返回主键,没有的话下面的要去掉ps.getGeneratedKeys()会)
                ps = connection.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS);
                //?的位置 和 替换的值
                ps.setString(1, "lisi");
                ps.setInt(2, 20);
                //n 更新结果的数量
                int n = ps.executeUpdate();
                System.out.println("成功插入" n "条数据");
                //获取插入成功数据的主键
                ResultSet keySet = ps.getGeneratedKeys();
                int key = -1;
                while(keySet.next()){
                    key = keySet.getInt(1);
                }
                System.out.println("插入数据的主键:" key);
                //查询
                String querySql = "select id , name ,age from student";
                ps = connection.prepareStatement(querySql);
                rs = ps.executeQuery();
                //获取结果集的元数据相关信息
                ResultSetMetaData metaData = rs.getMetaData();
                //列数
                int count = metaData.getColumnCount();
                for(int i = 1; i <= count; i  ){
                    System.out.print(metaData.getColumnName(i) " ");
                }
                System.out.println();
                //查询结果打印
                while(rs.next()){
                    int id = rs.getInt("id");
                    String name = rs.getString("name");
                    int age = rs.getInt("age");
                    System.out.println(id " " name " " age);
                }
                //提交
                connection.commit();
            } catch (SQLException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
                if(connection != null){
                    try {
                        //出现异常回滚
                        connection.rollback();
                    } catch (SQLException e1) {
                        // TODO Auto-generated catch block
                        e1.printStackTrace();
                    }
                }
            }finally {
                JDBCUtil.close(connection, ps, rs);
            }
    
        }
    }
    

    出口结果:

    成功插入1条数据
    插入数据的主键:2
    id name age 
    1 zhangsan 30
    2 lisi 20
    

    打响插入了 lisi 那条记下,且重返主键为二.末尾打印了列名和询问获得的数据

    此地用了业务的回滚,假诺保留完之后再查询的中级出现万分,数据是不会存到数据库的,能够动手试下。

    14PrepareStatement接口预编写翻译SQL语句实行修改

    * A: PrepareStatement接口预编译SQL语句执行修改
        * 案例代码
            /*
             *  使用PrepareStatement接口,实现数据表的更新操作
             */
            public class JDBCDemo {
                public static void main(String[] args) throws Exception{
                    Class.forName("com.mysql.jdbc.Driver");
                    String url = "jdbc:mysql://localhost:3296/mybase";
                    String username="root";
                    String password="123";
                    Connection con = DriverManager.getConnection(url, username, password);  
    
                    //拼写修改的SQL语句,参数采用?占位
                    String sql = "UPDATE sort SET sname=?,sprice=? WHERE sid=?";
                    //调用数据库连接对象con的方法prepareStatement获取SQL语句的预编译对象
                    PreparedStatement pst = con.prepareStatement(sql);
                    //调用pst的方法setXXX设置?占位
                    pst.setObject(1, "汽车美容");
                    pst.setObject(2, 49988);
                    pst.setObject(3, 7);
                    //调用pst方法执行SQL语句
                    pst.executeUpdate();
    
                    pst.close();
                    con.close();
                }
            }
    

    二.预备职业,以Mysql为例

    a.安装了Mysql 数据库

    b.下载mysql驱动包并在品种中程导弹入jar包:mysql-connector-java-5.1.4贰-bin.jar 

    3.JDBC的操作

    步骤:

    一.注册驱动

    2.连接数据库

    3.创立语句对象,用于施行SQL

    4.执行SQL

    5.拍卖试行结果

    澳门皇家赌场55533网址,陆.关闭连接

    前几天内容介绍
    1、JDBC
    2、DBUtils

    2、JDBC连接的包裹

    出于三番五次数据库的长河未有分化,为了增长代码的录取,能够将数据库的一而再封装起来:

    先是将数据库的总是新闻放到配置文件中,举例在项目根目录下新建文件db.properties,如下:

    #db.properties
    jdbc.driver=com.mysql.jdbc.Driver
    jdbc.url=jdbc:mysql://localhost:3306/huan
    jdbc.user=root
    jdbc.password=root
    

    JDBCUtil类

    package com.huan.jdbc;
    
    import java.io.FileInputStream;
    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 JDBCUtil {
    
        private static String driverClass;
        private static String url;
        private static String user;
        private static String password;
        //静态块加载数据库配置属性
        static{
            Properties config = new Properties();
            try {
                config.load(new FileInputStream("db.properties"));
            } catch (Exception e) {
                e.printStackTrace();
            }
            driverClass = config.getProperty("jdbc.driver");
            url = config.getProperty("jdbc.url");
            user = config.getProperty("jdbc.user");
            password =config.getProperty("jdbc.password");
        }
    
    
        //获取数据库连接
        public static Connection getConnection() throws SQLException {
    
            try {
                Class.forName(driverClass);
                Connection connection = DriverManager.getConnection(url, user, password);
                return connection;
            } catch (ClassNotFoundException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
                throw new SQLException("没有找到驱动",e);
            }
    
        }
    
        //关闭资源
        public static void close(Connection connection,Statement st,ResultSet rs){
    
            if(connection != null){
                try {
                    connection.close();
                } catch (SQLException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
    
            if(st != null){
                try {
                    st.close();
                } catch (SQLException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
    
            if(rs != null){
                try {
                    rs.close();
                } catch (SQLException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
    
        }
    
    }
    

    测试JDBCUtil

    package com.huan.jdbc;
    
    import java.sql.Connection;
    import java.sql.ResultSet;
    import java.sql.SQLException;
    import java.sql.Statement;
    
    public class JDBCUtilTest {
        public static void main(String[] args) {
            Connection connection = null;
            Statement st = null;
            ResultSet rs =null;
            try {
                connection = JDBCUtil.getConnection();
                String sql = "select id ,name ,age from student" ;
                st = connection.createStatement();
                rs = st.executeQuery(sql);
                while(rs.next()){
                    int id = rs.getInt("id");
                    String name = rs.getString("name");
                    int age = rs.getInt("age");
                    System.out.println("id:" id " name:" name " age:" age);
                }
            } catch (SQLException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }finally {
                JDBCUtil.close(connection, st, rs);
            }
    
    
    
        }
    }
    

    输出:

    id:1 name:zhangsan age:30
    

    2、JDBC连接的包裹

    是因为总是数据库的进度都以一律,为了巩固代码的录取,能够将数据库的连接封装起来:

    首先将数据库的连日音信放到配置文件中,比方在项目根目录下新建文件db.properties,如下:

    #db.properties
    jdbc.driver=com.mysql.jdbc.Driver
    jdbc.url=jdbc:mysql://localhost:3306/huan
    jdbc.user=root
    jdbc.password=root
    

    JDBCUtil类

    package com.huan.jdbc;
    
    import java.io.FileInputStream;
    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 JDBCUtil {
    
        private static String driverClass;
        private static String url;
        private static String user;
        private static String password;
        //静态块加载数据库配置属性
        static{
            Properties config = new Properties();
            try {
                config.load(new FileInputStream("db.properties"));
            } catch (Exception e) {
                e.printStackTrace();
            }
            driverClass = config.getProperty("jdbc.driver");
            url = config.getProperty("jdbc.url");
            user = config.getProperty("jdbc.user");
            password =config.getProperty("jdbc.password");
        }
    
    
        //获取数据库连接
        public static Connection getConnection() throws SQLException {
    
            try {
                Class.forName(driverClass);
                Connection connection = DriverManager.getConnection(url, user, password);
                return connection;
            } catch (ClassNotFoundException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
                throw new SQLException("没有找到驱动",e);
            }
    
        }
    
        //关闭资源
        public static void close(Connection connection,Statement st,ResultSet rs){
    
            if(connection != null){
                try {
                    connection.close();
                } catch (SQLException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
    
            if(st != null){
                try {
                    st.close();
                } catch (SQLException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
    
            if(rs != null){
                try {
                    rs.close();
                } catch (SQLException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
    
        }
    
    }
    

    测试JDBCUtil

    package com.huan.jdbc;
    
    import java.sql.Connection;
    import java.sql.ResultSet;
    import java.sql.SQLException;
    import java.sql.Statement;
    
    public class JDBCUtilTest {
        public static void main(String[] args) {
            Connection connection = null;
            Statement st = null;
            ResultSet rs =null;
            try {
                connection = JDBCUtil.getConnection();
                String sql = "select id ,name ,age from student" ;
                st = connection.createStatement();
                rs = st.executeQuery(sql);
                while(rs.next()){
                    int id = rs.getInt("id");
                    String name = rs.getString("name");
                    int age = rs.getInt("age");
                    System.out.println("id:" id " name:" name " age:" age);
                }
            } catch (SQLException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }finally {
                JDBCUtil.close(connection, st, rs);
            }
    
    
    
        }
    }
    

    输出:

    id:1 name:zhangsan age:30
    

    02JDBC原理

    * A: JDBC原理
        * a: 描述
            * Java提供访问数据库规范称为JDBC,而生产厂商提供规范的实现类称为驱动
            * DBC是接口,驱动是接口的实现,没有驱动将无法完成数据库连接,从而不能操作数据库!
                每个数据库厂商都需要提供自己的驱动,用来连接自己公司的数据库,也就是说驱动一般都由数据库生成厂商提供。
            * 图解见day29_source/JDBC实现原理.JPG
    

    3 SQL预管理及工作

    SQL预处理:在前头的拍卖中都是将sql语句发送到数据库,有数据库的sql解释器把sql语句生成底层的里边命令,然后实践命令,落成操作,当前频频的

                      向数据库发送sql语句,会大增数据库sq解释器的承负,影响推行进度。

                      而Connection的prepareStatement(Stirng sql)方法能够对sql语句实行预处理,生成数据底层的授命,并封装在PrepareStatement对

                      象中,通过相应的点子推行底层数据库的指令,从而缓和数据库的承负,提升访问速度。

                      并且在此以前的sql都是东拼西凑的,当带参数拼接时轻易导致SQL的注入(参数中带有sql成分,改变原来的sql语句逻辑),而PrepareStatement在

                     编写翻译之后,在那之中的sql施行计划现已鲜明,当替换参数时不会退换试行安顿,由此能够制止sql注入。

    事情调控:   当大家在编写逻辑的时候,存在多条的插入或许更新语句,前边的sql成功实行之后出现谬误,那时导致事情逻辑中断,而实践成功的数额现已

                     存入数据库,从而导致数据不完全。为制止那种业务的发出就须求手动进行当务调整。

                    ①.平息自动提交--connection.setAutoCommit(false);

                    贰.事务进行到位后交付-connection.commit();

                    三.在蒙受更加时回滚-connection.rollback();

    package com.huan.jdbc;
    
    import java.sql.Connection;
    import java.sql.PreparedStatement;
    import java.sql.ResultSet;
    import java.sql.ResultSetMetaData;
    import java.sql.SQLException;
    import java.sql.Statement;
    
    public class PrepareStatementDemo {
        public static void main(String[] args) {
            Connection connection = null;
            //SQL预处理对象
            PreparedStatement ps = null;
            ResultSet rs =null;
    
            try {
                connection = JDBCUtil.getConnection();
                connection.setAutoCommit(false);
                //?代表参数
                String sql = "insert into student (name,age) values(?,?)";
                //编译预执行计划 在数据库上创建执行计划  
                //(第二个参数可以不要-Statement.RETURN_GENERATED_KEYS 代表返回主键,没有的话下面的要去掉ps.getGeneratedKeys()会)
                ps = connection.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS);
                //?的位置 和 替换的值
                ps.setString(1, "lisi");
                ps.setInt(2, 20);
                //n 更新结果的数量
                int n = ps.executeUpdate();
                System.out.println("成功插入" n "条数据");
                //获取插入成功数据的主键
                ResultSet keySet = ps.getGeneratedKeys();
                int key = -1;
                while(keySet.next()){
                    key = keySet.getInt(1);
                }
                System.out.println("插入数据的主键:" key);
                //查询
                String querySql = "select id , name ,age from student";
                ps = connection.prepareStatement(querySql);
                rs = ps.executeQuery();
                //获取结果集的元数据相关信息
                ResultSetMetaData metaData = rs.getMetaData();
                //列数
                int count = metaData.getColumnCount();
                for(int i = 1; i <= count; i  ){
                    System.out.print(metaData.getColumnName(i) " ");
                }
                System.out.println();
                //查询结果打印
                while(rs.next()){
                    int id = rs.getInt("id");
                    String name = rs.getString("name");
                    int age = rs.getInt("age");
                    System.out.println(id " " name " " age);
                }
                //提交
                connection.commit();
            } catch (SQLException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
                if(connection != null){
                    try {
                        //出现异常回滚
                        connection.rollback();
                    } catch (SQLException e1) {
                        // TODO Auto-generated catch block
                        e1.printStackTrace();
                    }
                }
            }finally {
                JDBCUtil.close(connection, ps, rs);
            }
    
        }
    }
    

    输出结果:

    成功插入1条数据
    插入数据的主键:2
    id name age 
    1 zhangsan 30
    2 lisi 20
    

    中标插入了 lisi 那条记下,且重返主键为2.谈起底打字与印刷了列名和查询拿到的多少

    此处用了职业的回滚,要是保留完之后再查询的高级中学级出现十分,数据是不会存到数据库的,能够入手试下。

    Java JDBC 操作,javajdbc操作

    本文由68399皇家赌场发布于虚拟主机,转载请注明出处:Java JDBC 操作

    关键词: 68399皇家赌场 Java java基础 java JDBC操作 java JDBC

上一篇:ORACLE_SQL

下一篇:没有了