4.3 Java连接数据库


首先下载mysql的java驱动:mysql-connector-java-8.0.21.jar
然后在eclipse项目中加入此jar文件。
步骤如下:
把上面下载的文件,复制到WEB-INF的lib文件夹下,如图所示:
然后在JAR文件上右键点击,选择“构建路径”,然后点击“添加至构建路径”:
此时项目会增加一个目录“引用的库”,点开如图所示,这样就添加JAR成功了,接下来就可以使用JDBC的类连接mysql数据库了。
首先来看一个简单的例子,这是类配置了数据库的地址、账号、密码,然后提供了一个函数getCon,进行数据库连接。getCon的操作就好像网站登录输入网址、账号、密码一样。
在Java Resources里面的src文件夹创建一个包,叫做db(或者自己定义),然后在此包内创建类DBConfig
package db;

import java.sql.Connection;
import java.sql.SQLException;
public class DBConfig{
    public static String DB_URL="jdbc:mysql://119.23.27.100:3306/develop"
        +"?characterEncoding=utf-8&serverTimezone=GMT";
    public static String DB_USER="tester";
    public static String DB_PSW="codessp";
    public static Connection getCon(){
        try{
            Class.forName("com.mysql.cj.jdbc.Driver").newInstance();
        }
        catch(ClassNotFoundException e){
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        catch(InstantiationException e){
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        catch(IllegalAccessException e){
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        Connection con=null;
        try{
            con=java
                .sql
                .DriverManager
                .getConnection(DBConfig
                .DB_URL,DBConfig.DB_USER,DBConfig.DB_PSW);
        }
        catch(SQLException e){
            System.out.println("连接失败");
            e.printStackTrace();
        }
        return con;
    }
}
先来看看地址jdbc:mysql://localhost/testDB?characterEncoding=utf-8,这里面mysql是要连接的数据库类型,如果连的是oracle,那前面就是jdbc:oracle。
接下来是数据库所在的域名或ip地址,localhost表面数据库在本机。
然后是数据库的名字testDB,最后的characterEncoding=utf-8是为了支持数据库里的中文,没有它可能会导致乱码。 数据库的账号和密码不多讲,这三个静态属性,在getCon里面会被使用到。 至于getCon() 方法内部,现在完全可以不深究。只需要知道这个方法会得到一个Connection对象,这个对象表示和数据库的一个连接。
接下来,我们在使用这个连接,执行一个sql查询语句,创建类UserData:
package db;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.*;
public class UserData{
    /**
    根据用户名和密码验证是否能登录 *
    @param userName 用户名
    @param psw密码
    @return 如果可以登录返回true,否则返回false
     */
    public static boolean userValidate(String userName,String psw){
        String pswFromDB="";
        // 要执行的sql语句,通过字符串拼接出来
        String SQLTEXT="select password from user where userName = '"+userName+"'";
        try{
            //使用上面的DBConifg类的getCon方法,建立一个连接
            Connection con=DBConfig.getCon();
            //准备执行sql的实体
            Statement stmt=con.createStatement();
            //执行sql,并把查询结果赋给rst
            ResultSet rst=stmt.executeQuery(SQLTEXT);
            while(rst.next()){
                //查询结果,在这里是查询字段为password的值
                pswFromDB=rst.getString("password");
            }
            //后使用先关闭原则,关闭各个对象,特别是con如果不关闭,会造成连接泄露
            rst.close();
            stmt.close();
            con.close();
        }
        catch(SQLException e){
            e.printStackTrace();
        }
        if(pswFromDB.equals(psw)){
            //比较数据库查到的密码和参数传进来的密码是否相等
            return true;
        }
        return false;
    }
    /**
    通过用户名查找昵称
    @userName 账号
    return 返回此账号对于的昵称
     */
    public static String getNicknameByUsername(String userName){
        String result="";
        // 要执行的sql语句,通过字符串拼接出来
        String SQLTEXT="select nickname from user where userName='"+userName+"'";
        try{
            // 使用上面的DBConifg类的getCon方法,建立一个连接
            Connection con=DBConfig.getCon();
            // 准备执行sql的实体
            Statement stmt=con.createStatement();
            // 执行sql,并把查询结果赋给rst
            ResultSet rst=stmt.executeQuery(SQLTEXT);
            while(rst.next()){
                // 查询结果,在这里是查询字段为password的值
                result=rst.getString("nickname");
            }
            // 后使用先关闭原则,关闭各个对象,特别是con如果不关闭,会造成连接泄露
            rst.close();
            stmt.close();
            con.close();
        }
        catch(SQLException e){
            e.printStackTrace();
        }
        return result;
    }
    public static void runSQL(String sql){
        String pswFromDB="";
        try{
            Connection con=DBConfig.getCon();
            Statement stmt=con.createStatement();
            ResultSet rst=stmt.executeQuery(sql);
            for(int i=1;i < rst.getMetaData().getColumnCount();i++)
                System.out.print(rst.getMetaData().getColumnName(i)+"\t");
            System.out.println();
            while(rst.next()){
                for(int i=1;i <= rst.getMetaData().getColumnCount();i++)
                    System.out.print(rst.getString(i)+"\t");
                System.out.println();
            }
            rst.close();
            stmt.close();
            con.close();
        }
        catch(SQLException e){
            e.printStackTrace();
        }
    }
    public static void main(String[]args){
        boolean bb=userValidate("abcd","12345");
        System.out.println(bb);
        runSQL("select * from user where username='abcd'");
    }
}

UserData类有两个函数,
第一个userValidate,根据用户名和密码验证是否能登录,返回true表示可以登录,false为不能登录(用户名或密码错误)
第二个函数getNicknameByUsername,根据用户名返回用户昵称

下面是根据账号更新昵称的函数:
/**
  * 根据账号更新昵称
  * @param username 要更新的账号
  * @param nickname 新昵称
  */
 public static void updateNickName(String username,String nickname) {
  String result = "";
  // 要执行的sql语句,通过字符串拼接出来
  String SQLTEXT = "update user set nickname='"+nickname+"' where  userName='" + username + "'";
  try {
   // 使用上面的DBConifg类的getCon方法,建立一个连接
   Connection con = DBConfig.getCon();
   // 准备执行sql的实体
   Statement stmt = con.createStatement();
   // 执行sql,并把查询结果赋给rst
   stmt.executeUpdate(SQLTEXT);

   // 后使用先关闭原则,关闭各个对象,特别是con如果不关闭,会造成连接泄露
   
   stmt.close();
   con.close();
  } catch (SQLException e) {
   e.printStackTrace();
  }
  
 }