2019北京培训:JDBC(基础)

一、jdbc学习:

       问题:

               在学习了数据库之后,我们可以使用数据库的客户端书写SQL语句

               完成对数据的操作。但是数据库只是帮助我们将数据合理的进行存储。

               而我们的最终目的是将数据库中的数据和java代码联系起来。那么怎么办呢?

       方案:

               使用java代码实现类似数据库客户端的功能即可。

       细节:

               首先数据库厂商是不会将其底层的代码给我们看的,也就说

               我们没有办法自己声明数据库链接的工具类。数据库厂商为了

               让java代码可以对数据库进行操作,对外提供了操作的工具包。

       实现:

               jdbc驱动包

       注意:

               jdbc驱动包由数据库厂商提供。

               用来链接以及操作数据库。

               新创建的项目中是没有数据库操作相关的类文件的。

使用

 1、导入jar包

jar包:jar是class文件的压缩包,能够被jdk虚拟机直接使用。

 流程:                

1)选择项目右键新建文件夹,命名为lib.

2)将mysql的jar包放入到lib文件夹中

作用:

1)可以书写java代码, 并在自己的代码中调用jdbc中的类文件完成数据库操作。

2)使用jdbc中的类完成增加

3)使用jdbc中的类完成更新

4)使用jdbc中的类完成删除

5)使用jdbc中的类完成查询

注意:

           IDE工具在我们创建项目时,会自动的将jdk的相关jar包,自动导入进来。

二、获取数据库连接

 Class. forName ( "com.mysql.jdbc.Driver" );
Connection conn =DriverManager. getConnection 
( "jdbc:mysql://localhost:3306/505" , "root" , "1234" );

505为需要连接的数据库的名字,root为用户名,1234为密码。

对于新版本的mysql的driver,需要设置为

driver="com.mysql.cj.jdbc.Driver"

三、对数据库的增删改

package com.bjsxt.test;

import java.sql.Connection;

import java.sql.DriverManager;

import java.sql.SQLException;

import java.sql.Statement;

/**

* jdbc 学习之增加数据:

*        1 、加载驱动

*        2 、获取链接对象

*        3 、创建 SQL 命令对象

*        4 、创建 SQL 命令

*        5 、执行。

* @author Administrator

*

*/

public class TestAdd {

        public static void main(String[] args ) throws ClassNotFoundException , SQLException {

                // 加载驱动

                       Class. forName ( "com.mysql.jdbc.Driver" );

                //1 、链接数据库 --- 桥

                       Connection conn =DriverManager. getConnection ( "jdbc:mysql://localhost:3306/505" , "root" , "1234" );

                //2 、创建 SQL 命令对象 -- 车

                       Statement stmt = conn .createStatement();

                //3 、创建 SQL 命令 --- 货物

                       String sql = "insert into person values (default,' 赵丽颖 ','28','2')" ;

                //4 、将 SQL 命令放到命令对象中 , 并执行 --- 装车并发货

                        int i = stmt .executeUpdate( sql );

                //5 、打印结果

                       System. out .println( " 执行结果 :" + i );

       }

}

除sql语句不一样,其他都一样。

四、对数据库的查询

package com.bjsxt.test;

import java.sql.Connection;

import java.sql.DriverManager;

import java.sql.ResultSet;

import java.sql.SQLException;

import java.sql.Statement;

import java.util.ArrayList;

import java.util.List;

import com.bjsxt.pojo.Person;

/**

*         问题 :

*                 查询所有的用户信息到 java 代码中

*         实现:

*                 jdbc 查询

*         流程:

*                //1 、加载驱动

               //2 、获取链接

               //3 、创建 Sql 命令对象

               //4 、创建 Sql 命令

               //5 、执行查询

               //6 、遍历

*         问题:

*                 如果在循环体中直接将数据获取并打印,这样每次循环的数据都会丢失,怎么办?

*         解决:

*                 每条数据应该使用对象进行存储。需要创建和数据库表构造类似的 java 类。

*                 该类的一个实例化对象,存储一条数据。最终将该类的实例化对象存储到集合中。

*                 完成数据的查询。

*         实现:

*                 在 java 项目专门创建一个包,该包中专门用来声明和数据库表相对应的实体类。

*                 包的命名规则为 :

*                        XXX.XXX.XXX.pojo

*                         示例:

*                        com.bjsxt.pojo

*                 类的命名规则:

*                         原则上尽量保证类目和表名一致。

*                 属性的命名规则

*                         属性名原则上和字段名一致。

*                 属性的类型

*                         类型原则上和字段类型一致。

*

*         总结 :

*                 使用 jdbc 的查询, stmt.executeQuery(String sql ); 该方法返回 ResultSet 结果集对象

*                 而该对象是一个指向了要查询的数据的流对象。 使用流读取将数据读到 java 代码中,该流对象是基于指针的

*                 每次指向一条数据。每循环一次读取一条数据到 java 代码中。

*

*/

public class TestSelect2 {

        public static void main(String[] args ) throws ClassNotFoundException, SQLException {

                // 创建 List 集合

               List<Person> list = new ArrayList<>();

                //1 、加载驱动

               Class. forName ( "com.mysql.jdbc.Driver" );

                //2 、获取链接

                       Connection conn = DriverManager. getConnection ( "jdbc:mysql://localhost:3306/505" , "root" , "1234" );

                //3 、创建 Sql 命令对象

                       Statement stmt = conn .createStatement();

                //4 、创建 Sql 命令

                       String sql = "select * from person" ;

                //5 、执行查询

                       ResultSet rs = stmt .executeQuery( sql );

                //6 、遍历

                        while ( rs .next()){

                                // 创建实体类对象存储数据,每个对象存储一条数据

                               Person p = new Person();

                                // 将数据存储到实体类对象中

                                p .setUid( rs .getInt( "uid" ));

                                p .setUname( rs .getString( "uname" ));

                                p .setAge( rs .getInt( "age" ));

                                p .setClassid( rs .getInt( "classid" ));

                                // 将对象存储到 list 集合中

                                list .add( p );        

                       }

               System. out .println( list );

       }

       

       

       

}

五、使用PreparedStatement预处理进行增删改查

package com.bjsxt.test;

import java.sql.Connection;

import java.sql.DriverManager;

import java.sql.PreparedStatement;

import java.sql.SQLException;

import java.sql.Statement;

/**

* 问题:

*                 在使用 statement 对象发送和执行 Sql 语句到数据库时发现,如果连续多次执行相同的 Sql 语句,只有数据不同时

*                 例如:连续增加三条用户数据到数据库, Sql 语句会被多次发送。

* 方案:

*                 希望 Sql 语句只被解析发送一次。

* 实现:

*                 使用 PreparedStatement 对象

* 特点:

*        PreparedStatement 是 statement 的子类        

* 使用 :

*                1 、加载驱动

*                2 、获取链接

*                3 、创建 Sql 命令

*                         在 Sql 语句中使用 ? 对数据进行占位

*                         示例 :

*                                String sql ="insert into person values(default,?,?,?)";

*                4 、创建 Sql 命令对象 (prepareStatement)

*                                PreparedStatement ps = conn.prepareStatement( sql );

*                         注意:在通过 conn 对象获取 ps 对象时就已经将 sql 语句赋值给了 ps 对象。

*                5 、给占位符赋值

*                         注意:占位符从左至右数,角标从 1 开启

*                         示例:

*                                ps.setObject( 角标 , 数据 );

*                6 、执行

*                                ps.executeUpdate()// 增加,删除,修改     返回 int

*                                ps.executeQuery()// 查询                           返回 ResultSet

*         能力:

*                 使用 Statement 对象完成对数据库的增删改查

*                 使用 preparedStatement 对象完成对数据库的增删改查

* @author Administrator

*

*/

public class TestPrepareStatement {

        public static void main(String[] args ) throws ClassNotFoundException, SQLException {

               

                // 传统方式之使用 statement 对象操作数据库

                        //operByStatement();

                // 使用 PreparedStatement 对象操作数据库

                        operByPreparedStatement ();

       

       }

        //PreparedStatement 对象

        private static void operByPreparedStatement() throws ClassNotFoundException, SQLException {

                //1 、加载驱动

                       Class. forName ( "com.mysql.jdbc.Driver" );

                //2 、获取链接

                       Connection conn =DriverManager. getConnection ( "jdbc:mysql://localhost:3306/505" , "root" , "1234" );

                //3 、创建 Sql 命令

                       String sql = "insert into person values(default,?,?,?)" ;

                //4 、创建 Sql 命令对象

                       PreparedStatement ps = conn .prepareStatement( sql );

                //5 、给占位符赋值

                        // 增加一条

                        ps .setString(1, " 周周 " );

                        ps .setInt(2, 18);

                        ps .setInt(3, 2);

                //6 、执行

                        ps .executeUpdate();

               

               

                       

                       

                        //5 、给占位符赋值

                        // 增加一条

                        ps .setString(1, " 周周 2" );

                        ps .setInt(2, 18);

                        ps .setInt(3, 2);

                        //6 、执行

                        ps .executeUpdate();

                       

                       

                        //5 、给占位符赋值

                        // 增加一条

                        ps .setString(1, " 周周 3" );

                        ps .setInt(2, 18);

                        ps .setInt(3, 2);

                        //6 、执行

                        ps .executeUpdate();

               

               

       }

        //Statement 对象

        private static void operByStatement() throws ClassNotFoundException, SQLException {

                //1 、加载驱动

                       Class. forName ( "com.mysql.jdbc.Driver" );

                //2 、获取链接

                       Connection conn =DriverManager. getConnection ( "jdbc:mysql://localhost:3306/505" , "root" , "1234" );

                //3 、创建 sql 命令对象

                       Statement stmt = conn .createStatement();

                //4 、创建 Sql 命令

                       String sql = "insert into person values(default,' 赵六 ',18,2)" ;

                       String sql1 = "insert into person values(default,' 赵六 1',18,2)" ;

                       String sql2 = "insert into person values(default,' 赵六 2',18,2)" ;

                //5 、执行        

                        int i = stmt .executeUpdate( sql );

                        int i2 = stmt .executeUpdate( sql1 );

                        int i3 = stmt .executeUpdate( sql2 );

                       System. out .println( " 执行增加结果为 :" +( i + i2 + i3 ));

       }        

}

六、事务管理

package com.bjsxt.test;

import java.sql.Connection;

import java.sql.DriverManager;

import java.sql.PreparedStatement;

import java.sql.SQLException;

import java.sql.Statement;

/**

* 问题:

*                 在使用 statement 对象发送和执行 Sql 语句到数据库时发现,如果连续多次执行相同的 Sql 语句,只有数据不同时

*                 例如:连续增加三条用户数据到数据库, Sql 语句会被多次发送。

* 方案:

*                 希望 Sql 语句只被解析发送一次。

* 实现:

*                 使用 PreparedStatement 对象

* 特点:

*        PreparedStatement 是 statement 的子类        

* 使用 :

*                1 、加载驱动

*                2 、获取链接

*                3 、创建 Sql 命令

*                         在 Sql 语句中使用 ? 对数据进行占位

*                         示例 :

*                                String sql ="insert into person values(default,?,?,?)";

*                4 、创建 Sql 命令对象 (prepareStatement)

*                                PreparedStatement ps = conn.prepareStatement( sql );

*                         注意:在通过 conn 对象获取 ps 对象时就已经将 sql 语句赋值给了 ps 对象。

*                5 、给占位符赋值

*                         注意:占位符从左至右数,角标从 1 开启

*                         示例:

*                                ps.setObject( 角标 , 数据 );

*                6 、执行

*                                ps.executeUpdate()// 增加,删除,修改     返回 int

*                                ps.executeQuery()// 查询                           返回 ResultSet

*         能力:

*                 使用 Statement 对象完成对数据库的增删改查

*                 使用 preparedStatement 对象完成对数据库的增删改查

* @author Administrator

*

*/

public class TestPrepareStatement {

        public static void main(String[] args ) throws ClassNotFoundException, SQLException {

               

                // 传统方式之使用 statement 对象操作数据库

                        //operByStatement();

                // 使用 PreparedStatement 对象操作数据库

                        operByPreparedStatement ();

       

       }

        //PreparedStatement 对象

        private static void operByPreparedStatement() throws ClassNotFoundException, SQLException {

                //1 、加载驱动

                       Class. forName ( "com.mysql.jdbc.Driver" );

                //2 、获取链接

                       Connection conn =DriverManager. getConnection ( "jdbc:mysql://localhost:3306/505" , "root" , "1234" );

                //3 、创建 Sql 命令

                       String sql = "insert into person values(default,?,?,?)" ;

                //4 、创建 Sql 命令对象

                       PreparedStatement ps = conn .prepareStatement( sql );

                //5 、给占位符赋值

                        // 增加一条

                        ps .setString(1, " 周周 " );

                        ps .setInt(2, 18);

                        ps .setInt(3, 2);

                //6 、执行

                        ps .executeUpdate();

               

               

                       

                       

                        //5 、给占位符赋值

                        // 增加一条

                        ps .setString(1, " 周周 2" );

                        ps .setInt(2, 18);

                        ps .setInt(3, 2);

                        //6 、执行

                        ps .executeUpdate();

                       

                       

                        //5 、给占位符赋值

                        // 增加一条

                        ps .setString(1, " 周周 3" );

                        ps .setInt(2, 18);

                        ps .setInt(3, 2);

                        //6 、执行

                        ps .executeUpdate();

               

               

       }

        //Statement 对象

        private static void operByStatement() throws ClassNotFoundException, SQLException {

                //1 、加载驱动

                       Class. forName ( "com.mysql.jdbc.Driver" );

                //2 、获取链接

                       Connection conn =DriverManager. getConnection ( "jdbc:mysql://localhost:3306/505" , "root" , "1234" );

                //3 、创建 sql 命令对象

                       Statement stmt = conn .createStatement();

                //4 、创建 Sql 命令

                       String sql = "insert into person values(default,' 赵六 ',18,2)" ;

                       String sql1 = "insert into person values(default,' 赵六 1',18,2)" ;

                       String sql2 = "insert into person values(default,' 赵六 2',18,2)" ;

                //5 、执行        

                        int i = stmt .executeUpdate( sql );

                        int i2 = stmt .executeUpdate( sql1 );

                        int i3 = stmt .executeUpdate( sql2 );

                       System. out .println( " 执行增加结果为 :" +( i + i2 + i3 ));

       }        

}

——————————————————————————————————————————

关于jdbc详细笔记见https://blog.csdn.net/m2606707610/article/category/7681555

猜你喜欢

转载自blog.csdn.net/m2606707610/article/details/86599232
今日推荐