使用JDBC连接数据库执行sql语句,创建数据库连接池

JDBC俗称java数据库连接(java database connectivity)

我们使用IDEA开发工具,准备工作如下:
pom.xml配置mysql:
               
                   mysql
                   mysql-connector-java
                   8.0.27
               
完成以上配置即可在.java文件中进行操作了

首先我们应该清楚知道java开发工具连接数据库有什么好处
    1、将数据放数据库能更好的保存数据,数据库里的数据也更好操作管理
    2、可以用java语言操纵sql语句去调用数据库数据到程序中
    3、JDBC是有SUM提供的一套API,是使用java连接数据的一套标准API接口,各个数据库提供上都实现了这一条接口提供了
      连接其提供的数据库产品的实现类(以jar包形式,又称为连接该数据库的驱动包)

使用JDBC连接数据库分为以下三步:
        1、加载驱动: Class.forName("数据库包名")
        2、连接数据库:DriverManager.getConnection("数据库url(每种数据库有指定格式)",用户名,密码);
        3、获取执行对象:有两种方式,一种是预编译执行对象prepareStatement(sql语句);还有一种是直接编译创建createStatement(sql语句);

前两步是固定操作(随着数据库的改变而改变),我们重点学习第3步骤
    首先我们介绍执行sql语句的方法有:
                execute是执行DDL(create、drop、alter)语句;
                executeUpdate是执行DML(delete、update、insert)语句; 返回int数据,插入N条数据成功返回值就返回成功值N
                executeQuery是执行DQL(select)语句;返回结果集ResultSet,可以查询表中get对应字段信息。
    1、createStatement用法:
                Statement st = Connection连接对象.createStatement();
                int num = st.executeUpdate(sql语句);
                ResultSet rs = st.executeQuery(sql语句);
                while(ResultSet返回值结果集.next()){
                    字段类型 name = get[字段类型](字段名/字段位置);
                    ...
                };

     执行方法:① 创建Statement执行对象。
              ② 执行Statement执行对象方法execute(传入拼接好的sql语句)。
              ③ 多次执行同一条语句每次执行的是将整个执行对象发送给数据库服务器(耗性能)
              ④ 判断返回值要是碰到DQL语句executeQuery的话返回ResultSet结果集还需要进行操作。
              ⑤ ResultSet结果集拿取数据首先要获取下一个行next()(这是mysql的操作,一次只能拿取一行信息,数据库不同拿取操作和内容也不径相同)。
              ⑥ 可以通过next()拿取一行数据来获取字段信息。当然我们可加个while循环判断就可以拿取查询的全部行信息了。
              ⑦ 在next拿到数据行之后,使用get字段类型("字段名"/字段位置)来获取当前一行中某个字段(相当于指定行指定列找到单元格一样),不同的字段需要不同的类型接收。


    2、prepareStatement用法:
                String sql = "sql语句 可变参数用?表示[不能代表字段或表来使用,只能做一                                  个参数变量]"
                PreparedStatement ps = Connection连接对象.prepareStatement(sql);
                ps.set[字段类型](第几个?号位置,传入字段数据);
                ...
                int返回值 = ps.execteUpdate();

                ResultSet返回值结果集 = ps.execteQuery();
                while(ResultSet返回值结果集.next()){
                    字段类型 name = get[字段类型](字段名/字段位置);
                    ...
                };
     执行方式:① 先将带参(占位符?)的sql语句prepareStatement预处理(同条sql语句只执行一次,在不断变化的是参数值)
              ② 将参数用set方式给?占位符传递,可以不同的位置多次传递,传递对象是判断条件中的字面量或者字段值,但是不能将占位符看做表来使用。
              ③ 用不同的execte执行方法执行不同的sql语句,预编译时传了sql语句,且返回值也不同。
              ④ 判断返回值要是碰到DQL语句executeQuery的话返回ResultSet结果集还需要进行操作。
              ⑤ ResultSet结果集拿取数据首先要获取下一个行next()(这是mysql的操作,一次只能拿取一行信息,数据库不同拿取操作和内容也不径相同)。
              ⑥ 可以通过next()拿取一行数据来获取字段信息。当然我们可加个while循环判断就可以拿取查询的全部行信息了。
              ⑦ 在next拿到数据行之后,使用get字段类型("字段名"/字段位置)来获取当前一行中某个字段(相当于指定行指定列找到单元格一样),不同的字段需要不同的类型接收。

    如此我们可以两者区分得出以下结论:
            1、PreparedStatement的sql语句可通过?占位来传参。Statement是通过字符串拼接的方式传递参数。
                两者最大的区别是什么呢?
            2、?占位传参的话是需要指定?号位置和传入对应参数指定字段类型的。而字符串拼接是连sql句都可以传入进去(易被sql注入风险)直接更改执行语句。
            3、在执行性能上,如果执行N条相同的sql语句时Statement(传n条执行语句)执行效率是比不上PreparedStatement(传n条语句的每个占位符实参)的。
            4、多次执行同一条[传参]sql语句的话不建议使用Statement,无论从语法可读性、安全考虑还是性能考虑都应该使用预编译执行方式PreparedStatement。




数据库连接池
pom配置:
          
              com.alibaba
              druid
              1.1.21
          

Druid是阿里提供的数据库连接池。
连接池的主要作用:
    1、控制连接数量
    2、重用连接
常用操作语法: DruidDataSource dds = new DruidDataSource(); //设置连接池
            //设置连接池数据库的基本信息:
            dds = new DruidDataSource(); //实例化连接池对象
            dds.setUrl(数据库Url地址(不同的数据库有不同的地址));
            dds.setUsername(数据库用户名);
            dds.setPassword(数据库密码);
            dds.setInitialSize(初始线程数);
            dds.setMaxActive(最大连接数(当初始线程数不够用时才使用));
          //就可以开始连接数据库了
          Connection connection = dds.getConnection(可以设置连接超时间隔时间);

你可能感兴趣的:(数据库,mysql,sql,java,idea)