云顶集团用户登录「官方网站」

热门关键词: 云顶集团用户登录,云顶集团登录网站
来自 关于我们 2020-01-05 19:20 的文章
当前位置: 云顶集团用户登录 > 关于我们 > 正文

云顶集团用户登录       Java语言访问数据库的

       众所周知数据库连接的过程,但是最近面试的人(菜面菜),都说用的SSM框架,但是我问了一下,mybatis是怎么连接上mysql的,基本上都会说:配置好的,直接用了,今天我来抛砖引玉一下,欢迎拍砖!

原文链接:

       什么是JDBC?

什么是JDBC?

       Java语言访问数据库的一种规范,是一套API。JDBC (Java Database Connectivity) API,即Java数据库编程接口,是一组标准的Java语言中的接口和类,使用这些接口和类,Java客户端程序可以访问各种不同类型的数据库。JDBC规范采用接口和实现分离的思想设计了Java数据库编程的框架。接口包含在java.sql及javax.sql包中,其中java.sql属于JavaSE,javax.sql属于JavaEE。为了使客户端程序独立于特定的数据库驱动程序,JDBC规范建议开发者使用基于接口的编程方式,即尽量使应用仅依赖java.sql及javax.sql中的接口和类。

Java语言访问数据库的一种规范,是一套API

        JAVA使用JDBC访问数据库的步骤:

JDBC (Java Database Connectivity) API,即Java数据库编程接口,是一组标准的Java语言中的接口和类,使用这些接口和类,Java客户端程序可以访问各种不同类型的数据库。比如建立数据库连接、执行SQL语句进行数据的存取操作。

        1.得到数据库驱动程序

 

        2.创建数据库连接

   JDBC规范采用接口和实现分离的思想设计了Java数据库编程的框架。接口包含在java.sql及javax.sql包中,其中java.sql属于JavaSE,javax.sql属于JavaEE。这些接口的实现类叫做数据库驱动程序,由数据库的厂商或其它的厂商或个人提供。

        3.执行SQL语句

 

        4.得到结果集

   为了使客户端程序独立于特定的数据库驱动程序,JDBC规范建议开发者使用基于接口的编程方式,即尽量使应用仅依赖java.sql及javax.sql中的接口和类。

        5.对结果集做相应的处理(增,删,改,查)

云顶集团用户登录 1

        6.关闭资源:这里释放的是DB中的资源

 

        mysql的驱动包提供了java.sql.Driver这个SPI的实现,实现类是com.mysql.jdbc.Driver,在mysql-connector-java-5.1.6.jar中,我们可以看到有一个META-INF/services目录,目录下有一个文件名为java.sql.Driver的文件,其中的内容是com.mysql.jdbc.Driver。
在运行DriverManager.getDriver并传入参数“com.mysql.jdbc.Driver”时,DriverManager会从mysql-connector-java-5.1.6.jar中找到com.mysql.jdbc.Driver并实例化返回一个com.mysql.jdbc.Driver的实例。而SPI(Service Provider Interface)是指一些提供给你继承、扩展,完成自定义功能的类、接口或者方法。

JDBC驱动程序:

云顶集团用户登录 2

什么是JDBC驱动程序?

       SPI是一种回调的思想,回调是指我们在使用api时,我们可以向API传入一个类或者方法,API在合适的时间调用类或者方法。SPI是在一些通用的标准中,为标准的实现产商提供的扩展点。标准在上层提供API,API内部使用了SPI,当API被客户使用时,会动态得从当前运行的classpath中寻找该SPI的实现,然后使用该SPI的实现来完成API的功能。

这些是各个数据库厂家根据JDBC的规范制作的JDBC实现类

       SPI的实现方式是:提供实现的实现类打包成Jar文件,这个Jar文件里面必须有META-INF目录,其下又有services目录,其下有一个文本文件,文件名即为SPI接口的全名,文件的内容该jar包中提供的SPI接口的实现类名。

JDBC驱动程序的四种类型:

       大家看项目中Mybaits的jar包会发现:

1.       第一种类型的驱动程序的实现是通过将JDBC的调用全部委托给其它编程接口来实现的,比如ODBC。这种类型的驱动程序需要安装本地代码库,即依赖于本地的程序,所以便携性较差。比如JDBC-ODBC桥驱动程序

private class SqlSessionInterceptor implements InvocationHandler {
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
      SqlSession sqlSession = getSqlSession(
          SqlSessionTemplate.this.sqlSessionFactory,
          SqlSessionTemplate.this.executorType,
          SqlSessionTemplate.this.exceptionTranslator);
      try {
        Object result = method.invoke(sqlSession, args);
        if (!isSqlSessionTransactional(sqlSession, SqlSessionTemplate.this.sqlSessionFactory)) {
          // force commit even on non-dirty sessions because some databases require
          // a commit/rollback before calling close()
          sqlSession.commit(true);
        }
        return result;
      } catch (Throwable t) {
        Throwable unwrapped = unwrapThrowable(t);
        if (SqlSessionTemplate.this.exceptionTranslator != null && unwrapped instanceof PersistenceException) {
          // release the connection to avoid a deadlock if the translator is no loaded. See issue #22
          closeSqlSession(sqlSession, SqlSessionTemplate.this.sqlSessionFactory);
          sqlSession = null;
          Throwable translated = SqlSessionTemplate.this.exceptionTranslator.translateExceptionIfPossible((PersistenceException) unwrapped);
          if (translated != null) {
            unwrapped = translated;
          }
        }
        throw unwrapped;
      } finally {
        if (sqlSession != null) {
          closeSqlSession(sqlSession, SqlSessionTemplate.this.sqlSessionFactory);
        }
      }
    }
  }

2.       第二种类型的驱动程序的实现是部分基于Java语言的。即该驱动程序一部分是用Java语言编写,其它部分委托本地的数据库的客户端代码来实现。同类型1的驱动一样,该类型的驱动程序也依赖本地的程序,所以便携性较差

      sqlSessionTemplate.SqlSessionInterceptor源码,有没有一种很熟悉的感觉?至于getConnection自己去看;用过ElasticSearch和Redis的童鞋,细心的童鞋会发现连接字符串都大同小异,连接都是类似的,标准的连接方式,提高效率,有效控制连接;

3.       第三种类型的驱动程序的实现是全部基于JAVA语言的。该类型的驱动程序通常由某个中间件服务器提供,这样客户端程序可以使用数据库无关的协议和中间件服务器进行通信,中间件服务器再将客户端的JDBC调用转发给数据库进行处理

      ElasticSearch的连接字符串:

4.       第四种类型的驱动程序的实现是全部基于JAVA语言的。该类型的驱动程序中包含了特定数据库的访问协议,使得客户端可以直接和数据库进行通信

protected SearchResponse getSearchResponse(String fieldName, String indexName) {
    client = null;
    SearchResponse response = null;
    try {
        getClient();
        MaxAggregationBuilder aggregation =
                AggregationBuilders
                        .max("agg")
                        .field(fieldName);
        SearchRequestBuilder request = client.prepareSearch(indexName).addAggregation(aggregation);
        response = request.execute().actionGet();
    } catch (Exception ex) {
        logger.error("getSearchResponse", ex);
    } finally {
        if (client != null) {
            client.close();
        }
        return response;
    }
}

 

     Jedis连接字符串:

JDBC类结构:

执行命令如下:
Jedis jedis = null;
try {
    jedis = jedisPool.getResource();
    //具体的命令
    jedis.executeCommand()
} catch (Exception e) {
    logger.error("op key {} error: " + e.getMessage(), key, e);
} finally {
    //注意这里不是关闭连接,在JedisPool模式下,Jedis会被归还给资源池。
    if (jedis != null) 
        jedis.close(); 
}

                           DriverManager

       拦截器的实现都是基于代理的设计模式实现的,简单的说就是要创造一个目标类的代理类,在代理类中执行目标类的方法并在方法之前执行拦截器代码,拦截器一般有登陆拦截器——验证会话信息,权限拦截器——验证权限信息,那么SqlSessionInterceptor是干什么的?

 

       Mybatis拦截器设计的一个初衷就是为了供用户在某些时候可以实现自己的逻辑而不必去动Mybatis固有的逻辑。打个比方,对于Executor,Mybatis中有几种实现:BatchExecutor、ReuseExecutor、SimpleExecutor和CachingExecutor。
这个时候如果你觉得这几种实现对于Executor接口的query方法都不能满足你的要求,那怎么办呢?是要去改源码吗?当然不。我们可以建立一个Mybatis拦截器用于拦截Executor接口的query方法,在拦截之后实现自己的query方法逻辑,之后可以选择是否继续执行原来的query方法。允许你在已映射语句执行过程中的某一点进行拦截调用。有的用Mybatis拦截器统封装分页,有的用它实现读写分离等,如果读写分离还是建议配置多数据源;

Driver                               Driver

       spring整合mybatis之后,通过动态代理的方式,使用SqlSessionTemplate持有的sqlSessionProxy属性来代理执行sql操作,由spring管理的sqlSeesion在sql方法(增删改查等操作)执行完毕后就自行关闭了sqlSession,不需要我们对其进行手动关闭。

 

       愿你有情人终成眷属,愿你有个有趣的灵魂,愿你拍我一砖!

Connection                         Connection

 

Statement                                  Statement

 

Resultset                                    Resultset

 

DriverManager:这个是一个实现类,它是一个工厂类,用来生产Driver对象的

这个类的结构设计模式为工厂方法

Driver:这是驱动程序对象的接口,它指向一个实实在在的数据库驱动程序对象,那么这个数据库驱动程序对象是从哪里来的呢?

DriverManager工厂中有个方法:getDriver(String URL),通过这个方法可以得到驱动程序对象,这个方法是在各个数据库厂商按JDBC规范设计的数据库驱动程序包里的类中静态实现的,也就是在静态块中

Connection:这个接口可以制向一个数据库连接对象,那么如何得到这个连接对象呢?

是通过DriverManager工厂中的getConnection(String URL)方法得到的

Statement:用于执行静态的SQL语句的接口,通过Connection中的createStatement方法得到的

Resultset:用于指向结果集对象的接口,结果集对象是通过Statement中的execute等方法得到的

 

JAVA使用JDBC访问数据库的步骤:

1.     得到数据库驱动程序

2.     创建数据库连接

3.     执行SQL语句

4.     得到结果集

5.     对结果集做相应的处理(增,删,改,查)

6.     关闭资源:这里释放的是DB中的资源

云顶集团用户登录 3 

  

设置classpath:

1.     在java文件中起的包名一定要是工程基目录下的子目录,classpath:基目录

2.     .jar包,需要将这个.jar包的路径包括这个文件的全名添加到classpath中来

Oracle连接字符串的书写格式:

“oracle:jdbc:thin:@ip:1521: 数据库名”,”数据库用户名”,”数据库密码”

 

简单的例子:

云顶集团用户登录 4

package moudule1.first;



import java.sql.*;



public class FirstJdbc

{

      public static void main(String[] args)

      {

                 String sql="select * from yuchen_user";

                 Connection con=null;

                 Statement st=null;

                 ResultSet rs=null;



       try

       { 

                 Class.forName("oracle.jdbc.driver.OracleDriver");

                 con=DriverManager.getConnection("jdbc:oracle:thin:@127.0.0.1:1521:name", "scott","tiger");

                 st=con.createStatement();

                 rs=st.executeQuery(sql);

                 while(rs.next())

                 {

                            System.out.println(rs.getInt("id"));

                            System.out.println(rs.getString("name"));

                 }

       }catch(Exception e)

       {

                 e.printStackTrace();

       }finally

       {

                 try

                 {

                      con.close();

                 }catch(Exception e)

                 {}



                 try

                 {

                      st.close();

                 }catch(Exception e)

                 {

                 }



                 try

                 {

                      rs.close();

                 }catch(Exception e)

                 {

                 }



       }





      }



}

云顶集团用户登录 5

 

 

常用数据库的驱动程序及JDBC URL:

Oracle数据库:

驱动程序包名:ojdbc14.jar

 驱动类的名字:oracle.jdbc.driver.OracleDriver

 JDBC URL:jdbc:oracle:thin:@dbip:port:databasename

 说明:驱动程序包名有可能会变

       JDBC URL中黑色字体部分必须原封不动的保留,为该驱动识别的URL格式。红色字体部分需要根据数据库的安装情况填写。其中各个部分含义如下:

        dbip –为数据库服务器的IP地址,如果是本地可写:localhost或127.0.0.1。

        port –为数据库的监听端口,需要看安装时的配置,缺省为1521。

        databasename –为数据库的SID,通常为全局数据库的名字。

        举例如果要访问本地的数据库allandb,端口1521,那么URL写法如下:

       jdbc:oracle:thin:@localhost:1521:allandb 下载地址如下:

 

SQL Server数据库

   驱动程序包名:msbase.jar mssqlserver.jar msutil.jar

   驱动类的名字:com.microsoft.jdbc.sqlserver.SQLServerDriver

   JDBC URL:jdbc:microsoft:sqlserver://dbip:port;DatabaseName=databasename

   说明:驱动程序包名有可能会变

        JDBC URL中黑色字体部分必须原封不动的保留,为该驱动识别的URL格式。红色字体部需要根据数据库的安装情况填写。其中各个部分含义如下:

       dbip –为数据库服务器的IP地址,如果是本地可写:localhost或127.0.0.1。

        port –为数据库的监听端口,需要看安装时的配置,缺省为1433。

       databasename –数据库的名字。

       举例如果要访问本地的数据库allandb,端口1433,那么URL写法如下:

       jdbc: microsoft: sqlserver:@localhost:1433; DatabaseName =allandb

       下载地址:

 

 MySQL数据库

   驱动程序包名:mysql-connector-java-3.1.11-bin.jar

   驱动类的名字:com.mysql.jdbc.Driver

   JDBC URL:jdbc:mysql://dbip:port/databasename

   说明:驱动程序包名有可能会变

        JDBC URL中黑色字体部分必须原封不动的保留,为该驱动识别的URL格式。红色字体部需要根据数据库的安装情况填写。其中各个部分含义如下:

        dbip –为数据库服务器的IP地址,如果是本地可写:localhost或127.0.0.1。

        port –为数据库的监听端口,需要看安装时的配置,缺省为3306。

        databasename –数据库的名字。

        举例如果要访问本地的数据库allandb,端口1433,那么URL写法如下:

       jdbc:mysql://localhost:3306/allandb

   下载地址:

 

Access数据库

   驱动程序包名:该驱动程序包含在JavaSE中,不需要额外安装。

   驱动类的名字:sun.jdbc.odbc.JdbcOdbcDriver

   JDBC URL:jdbc:odbc:datasourcename

   说明:该驱动只能工作在Windows系统中,首先需要在操作系统中建立一个可以访问Access数据库的本地数据源(ODBC),如果名字为allandb,那么URL写法如下:

        jdbc:odbc:allandb

 

PreparedStatement接口:

预编译的sql语句对象

作用: 解决了书写sql语句时一些特殊的字符与sql保留字符冲突的问题,非常方便

云顶集团用户登录 6

/**

*知识点:

*PreparedStatement接口及方法的使用

*程序目标:

*java文件:

*PreparedInsert.java:连接数据库,插入一条数据

*JdbcUtil.java:实现一个工具类,功能:1.连接数据库 2.关闭资源

*/



package moudule1.preparedstatement;



import java.sql.*;

import moudule1.com.*;



public class PreparedInsert

{

      public static void main(String[] args)

      {

           String sql="insert into yuchen_user (id,name) values (?,?)";

           System.out.println(sql);



           Connection con=null;

           PreparedStatement ps=null;



           try{

                 con=JdbcUtil.getConnection();

                 ps=con.prepareStatement(sql);



                 ps.setInt(1,2);

                 ps.setString(2,"zhangsan");

                 ps.executeUpdate();



                 ps.setInt(1,3);

                 ps.setString(2,"lisi");

                 ps.executeUpdate();



           }catch(Exception e){

                 e.printStackTrace();

           }finally{

                 JdbcUtil.close(con,ps);

                 }

           }

      }

云顶集团用户登录 7

 

 

云顶集团用户登录 8

package moudule1.com;



import java.sql.*;



public class JdbcUtil{



      public static Connection getConnection() throws Exception{

           Class.forName("oracle.jdbc.driver.OracleDriver");

       return DriverManager.getConnection("jdbc:oracle:thin:@127.0.0.1:1521:name", "scott","tiger");

           }



      public static void close(Connection con,Statement st){



           close(con);

           close(st);



           }



      public static void close(Connection con,Statement st,ResultSet rs){





           close(con,st);

           close(rs);



           }



      public static void close(Connection con){

           try{



                 con.close();



           }catch(Exception e){





                 }



           }



      public static void close(Statement st){



           try{



                 st.close();



           }catch(Exception e){



                 }

           }



      public static void close(ResultSet rs){



           try{



                 rs.close();



           }catch(Exception e){



                 }



           }



      }

云顶集团用户登录 9

 

数据库的增删改查的例子:

云顶集团用户登录 10

/**

*知识点:

*JDBC+SQL+ORACLE

*程序目标:

*UserDao.java:实现了数据库的增删改查

*JdbcUtil.java:工具类,有连库和关闭资源的方法

*/



package moudule1.idus;



import java.sql.*;

import moudule1.com.*;



public class UserDao{



      private String sql;

      private Connection con;

      private Statement st;

      private ResultSet rs;



      public UserDao(){

           sql=null;

           con=null;

           st=null;

           rs=null;

           }



      public void insert(){



           sql="insert into yuchen_user (id,name) values(";

           sql+="4,'zhouwu')";

           System.out.println(sql);



           try{



           con=JdbcUtil.getConnection();

           st=con.createStatement();

           st.executeUpdate(sql);



           }catch(Exception e){



                 e.printStackTrace();



           }finally{



                 JdbcUtil.close(con,st);



                 }



           }





      public void delete(){



           sql="delete from yuchen_user where id=2";

           System.out.println(sql);



           try{



                 con=JdbcUtil.getConnection();

            st=con.createStatement();

            st.executeUpdate(sql);



           }catch(Exception e){



                 e.printStackTrace();



           }finally{



                 JdbcUtil.close(con,st);



                 }

           }





      public void update(){



           sql="update yuchen_user set name='liumang' where id=1";

           System.out.println(sql);



           try{



                 con=JdbcUtil.getConnection();

            st=con.createStatement();

            st.executeUpdate(sql);



           }catch(Exception e){



                 e.printStackTrace();



           }finally{



                 JdbcUtil.close(con,st);



                 }

           }





      public void select(){



           sql="select * from yuchen_user";

           System.out.println(sql);



           try{



                 con=JdbcUtil.getConnection();

            st=con.createStatement();

             rs=st.executeQuery(sql);



            while(rs.next()){



               System.out.println(rs.getInt(1));

               System.out.println(rs.getString(2));



               }



           }catch(Exception e){



                 e.printStackTrace();



           }finally{



                 JdbcUtil.close(con,st,rs);



                 }



           }





      public static void main(String[] args){



           UserDao ud=new UserDao();

           ud.select();

           ud.insert();

           ud.select();

           ud.update();

           ud.select();

           ud.delete();

           ud.select();

           }

      }

云顶集团用户登录 11

 

一些常用的方法:

云顶集团用户登录 12

/**

*知识点:

*execute方法,getResultSet(),getUpdateCount()

*程序目标:

*JdbcUtil.java:工具类,连接数据库,关闭资源

*sqlExecutor.java:命令行参数输入sql语句,并执行该语句

*/

package moudule1.fangfa;



import java.sql.*;

import moudule1.com.*;



public class sqlExecutor{



      public static void main(String[] args){



           Connection con=null;

           Statement st=null;



           try{



                 con=JdbcUtil.getConnection();

                 st=con.createStatement();

                 boolean str=st.execute(args[0]);



                 if(str){



                      ResultSet rs=st.getResultSet();



                      while(rs.next()){

                            System.out.println(rs.getInt("id")+":"+rs.getString("name"));

                            }



                            rs.close();



                 }else{

                      int row=st.getUpdateCount();

                      System.out.println(row);

                      }



           }catch(Exception e){



                 e.printStackTrace();



           }finally{



                 JdbcUtil.close(con,st);



                 }

           }

      }

云顶集团用户登录 13

 

  1. 补充
      JDBC连接MySQL

加载及注册JDBC驱动程序

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

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

JDBC URL 定义驱动程序与数据源之间的连接

标准语法:

<protocol(主要通讯协议)>:<subprotocol(次要通讯协议,即驱动程序名称)>:<data source identifier(数据源)>

MySQL的JDBC URL格式:

jdbc:mysql//[hostname][:port]/[dbname][?param1=value1][¶m2=value2]….

 

示例:jdbc:mysql://localhost:3306/sample_db?user=root&password=your_password

 

常见参数:

本文由云顶集团用户登录发布于关于我们,转载请注明出处:云顶集团用户登录       Java语言访问数据库的

关键词: