美文网首页java
Java连接SQLServer2008的方法(含jdk7和jdk

Java连接SQLServer2008的方法(含jdk7和jdk

作者: yichen_china | 来源:发表于2021-09-28 09:23 被阅读0次

    工具
    如果是 jdk7 和 jdk7 以前的版本,用 jdbc.jar
    如果是 JDK8,用 jdbc4.jar 下载地址 https://pan.baidu.com/s/1kWZzzCz
    把jdbc4.jar 复制到java 目录 D:\Program Files\Java\jdk1.8.0_301\jre\lib\ext\jdbc4.jar
    然后启动应用类测试

    public class BeiyaoZtErpApplication {
        public static void main(String[] args)
        {
    
            SpringApplication.run(BeiyaoZtErpApplication.class, args);
            String driverName="com.microsoft.sqlserver.jdbc.SQLServerDriver";
            String dbURL="jdbc:sqlserver://192.168.2.222:1433;DatabaseName=bylsn";
            String userName="mg";
            String userPwd="mg";
            try
            {
                Class.forName(driverName);
                Connection dbConn= DriverManager.getConnection(dbURL,userName,userPwd);
                Statement stmt = dbConn.createStatement();
                String sql ="SELECT * FROM [dbo].[MG_ACCOUNT] WHERE name = '管宏喜'";
                ResultSet rs = stmt.executeQuery(sql);
                while(rs.next()){  //循环遍历查询结果集
    
                    System.out.println(rs.getString("*"));
                }
            }
            catch(Exception e)
            {
                e.printStackTrace();
                System.out.print("fail!");
            }
        }
    
    }
    

    如果链接报错,om.microsoft.sqlserver.jdbc.SQLServerException: 驱动程序无法通过使用安全套接字层(SSL)加密与 SQL Server 建立安全连接。错误:“The server selected protocol version TLS10 is not accepted by client preferences [TLS12]”。

    需要改下面这个文件几个禁用字符去掉
    D:\Program Files\Java\jdk1.8.0_301\jre\lib\security\java.security


    image.png

    将TLSv1、TLSv1.1、3DES_EDE_CBC从禁止名单中剔除:
    然后启动就可以了

    修改jre中的这个文件:

    /java/jdk1.8/jre/lib/security/java.security

    全局搜文件

    find / -name "java.security"
    

    jdk.tls.legacyAlgorithms 直接改成下面的这个:

    jdk.tls.legacyAlgorithms=SSLv3, RC4, DES, MD5withRSA, \
    DH keySize < 1024, EC keySize < 224, anon, NULL, \
    include jdk.disabled.nameCurves
    

    如果还报错,有可能是有多个java.security 文件
    用rm 命令尝试删除多余的,只保留一个,就可用了。
    我删除这个好了

    rm /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.312.b07-2.el8_5.x86_64/jre/lib/security/java.security
    

    配置文件配置如下

    datasource:
          username: mg
          password: mg
          url: jdbc:sqlserver://192.168.2.222:1433;DatabaseName=bylsn
          driver-class-name: com.microsoft.sqlserver.jdbc.SQLServerDriver
    

    下面一些使用方法可以参考

    步骤

    1. 加载数据库驱动
      Class.forName(驱动全类名);

    假如是JDK7和JDK7以前的版本,驱动全类名=sun.jdbc.odbc.JdbcOdbcDriver
    如果是JDK8,驱动全类名= com.microsoft.sqlserver.jdbc.SQLServerDriver
    比如 jdk8(常用):

    Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
    

    注意:如果这里写错会报DriverClassNotFound之类的异常

    2.获取数据库连接

    DriverManager.getConnection(url, user, password);
    
    url :
    jdk 7 的url写法 :jdbc : odbc : 数据库名称 ,但是要配置数据源(查看配置数据源方法)
    jdbc:odbc:MyDB
    

    jdk 8的url写法:协议 : 子协议: // 主机名 : 数据库端口号 ; databaseName=数据库名称
    协议:总是以jdbc开头(Java和数据库开发方双方约定好的规范)
    子协议:数据库开发方(谁来实现Java的接口)
    主机名:本机即localhost,假如连接其它计算机中数据库需要对方IP地址
    数据库端口号:SQLServer默认占用计算机的端口号为1433,可以更改。实际开发中最好更改,因为众所周知的东西容易被利用和攻击。练习不用改。

    jdbc:sqlserver://localhost:1433;databaseName=MyDB
    user : 数据库登录名(默认sa)
    password : 数据库登录密码
    

    3.创建Statement会话
    方法一:

    Statement stmt = conn.createStatement();
    

    方法二:

    PreparedStatement ps = ps = conn.prepareStatement(sql);
    

    4.执行sql语句(以查询操作为例)
    对应3中方法一:

    ResultSet rs = stmt.executeQuery(sql);
    

    对应3中方法二:

    ResultSet rs = ps.executeQuery();
    
    1. 从结果集中取得记录并在控制台打印
    1. . 由于ResultSet 中的 rs.next() 默认指向数据库表中第一条记录的前面(可以理解为指向了表头),因此rs.next()刚好是表中第一条记录。
    2. . rs.getXXX() 是获取表中字段,XXX对应数据库中的字段类型(varchar对应Java中的String, decimal对应Java中的double等)。
    3. . rs.getXXX() 中的参数可以是数据库中的列名(用字符串表示),也可以是列名的索引。但是一般使用前者,因为能够更加直观地使人理解Java代码语义而不用到数据库查看表中字段。
    rs.getString("id");
    rs.getString(1);//表中第一列字段是id,2就是获取name,以此类推
    
    System.out.println("--------------------员工信息列表-------------------");
        System.out.println("\tID\t姓名\t工资\t性别");
        while(rs.next()) {
            id = rs.getInt("id");   
            name = rs.getString("name");
            salary = rs.getDouble("salary");
            gender = rs.getString("gender");
            System.out.println("\t"+id+"\t"+name+"\t"+salary+"\t"+gender);
    
                    }
    

    关闭资源
    像Connection conn 、Statement 、PreparedStatement、ResultSet 等这些跟连接的使用完都应该关闭,以免浪费计算机内存资源导致垃圾过多或者内存溢出等。
    应当倒序关闭(后赋值的先关闭)。
    关闭顺序

    1. 关闭记录集
    rs.close();
    
    1. 关闭声明
    ps.close();//Statement 、PreparedStatement用哪个就关闭哪个
    
    1. 关闭连接对象
    conn.close();
    

    完整代码(只包含数据库连接,不包含增删改查操作)

    package Utils;
    
    import java.sql.Connection;
    import java.sql.DriverManager;
    import java.sql.SQLException;
    
    public class ConnectionDemo {
        public static void main(String[] args) {
    
            Connection conn = null;
            // 1.加载数据库驱动
            try {
                // 参数填写驱动的全类名(即包名+类名)
                Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
            } catch (ClassNotFoundException e) {
                e.printStackTrace();
                System.out.println("找不到驱动类");
            }
    
            // 2.获取数据库连接
            // 2.1) 连接的数据库的路径
            String url  = "jdbc:sqlserver://localhost:1433;databaseName=MyDB";
            // 2.2) 登录数据库的用户名
            String user = "sa";
            // 2.2) 登录数据库的密码
            String password = "sa";
            try {
                // 2.3) 获取连接
                conn = DriverManager.getConnection(url, user, password);
                System.out.println("数据库连接成功!");
            } catch (SQLException e) {
                e.printStackTrace();
                System.out.println("数据库连接失败!");
            }
    
            // 关闭资源
            try {
                conn.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }       
        }
    }
    

    优化
    1.在操作数据库时,常常需要获取数据库的连接,但是每个地方都写一遍上述代码会造成代码冗余,因此我们可以将它封装到一个工具类中,需要的时候直接调用即可。优化代码如下:

    package Utils;
    
    import java.sql.Connection;
    import java.sql.DriverManager;
    import java.sql.SQLException;
    
    
    public class DBUtil {
        private static Connection conn = null;
    
        // 加载数据库驱动,为提高效率应当写在static中随着类的加载而加载
        static {        
            try {
                // 参数填写驱动的全类名(即包名+类名)——告诉数据库,你的驱动在哪
                Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
            } catch (ClassNotFoundException e) {
                e.printStackTrace();
                System.out.println("找不到驱动类");
            }
        }
    
        public static Connection getConnection() {
            String url  = "jdbc:sqlserver://localhost:1433;databaseName=MyDB";
            String user = "sa";
            String password = "sa";
            try {
                // 获取连接
                conn = DriverManager.getConnection(url, user, password);
                System.out.println("数据库连接成功!");
            } catch (SQLException e) {
                e.printStackTrace();
                System.out.println("数据库连接失败!");
            }
            return conn;
        }
    
    
    }
    

    但是只获取连接是不够的,我们经常需要关闭连接,因此可以将其代码提取封装成方法,代码如下:

     public void close(ResultSet rs, PreparedStatement ps, Connection conn) {  
            if(rs!=null){  
                try{  
                    rs.close();  
                    rs=null;  
                }catch(SQLException e){  
                    e.printStackTrace();  
                    System.out.println("关闭ResultSet失败");  
                }  
            }  
            if(ps!=null){  
                try{  
                    ps.close();  
                    ps=null;  
                }catch(SQLException e){  
                    e.printStackTrace();  
                    System.out.println("关闭PreparedStatement失败");  
                }  
            }  
            if(conn!=null){  
                try{  
                    conn.close();  
                    conn=null;  
                }catch(SQLException e){  
                    e.printStackTrace();  
                    System.out.println("关闭Connection失败");  
                }  
            }  
        }  
    

    相关文章

      网友评论

        本文标题:Java连接SQLServer2008的方法(含jdk7和jdk

        本文链接:https://www.haomeiwen.com/subject/wsycbltx.html