欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

框架前连接数据库的准备:通过JDBC连接MySQL

程序员文章站 2022-05-18 09:27:32
...

在java中连接数据库有多种方法,但是基本都需要对应的驱动jar包。其实万法不离其宗,学会一种,其他也就基本会了

今天主要讲通过JDBC连接MySQL,其余的后续有机会会详细讲

开发环境: eclipse+MySQL

JDBC简介:

JDBC(Java DataBase Connectivity, java数据库连接)是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,它由一组用Java语言编写的类和接口组成。JDBC提供了一种基准,据此可以构建更高级的工具和接口,使数据库开发人员能够编写数据库应用程序。有了JDBC,可以方便的在Java语言中使用SQL语言,从而使Java应用程序或Java Applet可以实现对分布在网络上的各种关系数据库的访问。

1. 导入jdbc驱动

①下载jdbc驱动 官网和网上或者学长都有,可以自己去找,一定要找对应的版本,因为在后续开发中,jar包的版本很重要 ②驱动导入工程直接把下载的jar包拖动到工程src文件夹里面 然后再把jar包添加到库里面

框架前连接数据库的准备:通过JDBC连接MySQL

框架前连接数据库的准备:通过JDBC连接MySQL

然后就可以在这里看到导入的jar包

框架前连接数据库的准备:通过JDBC连接MySQL

 

2. 数据库管理

连接数据库的方法单独封装成类,这里提供了三种连接方法 先看一下目录结构

框架前连接数据库的准备:通过JDBC连接MySQL

DBConfig.properties

driver=com.mysql.jdbc.Driver
url=jdbc:mysql://127.0.0.1:3306/jdbc_test
username=root
pwd=1234

DBUtil.java

package connect;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.Properties;

public class DBUtil {
    //直连数据库
    public Connection getConnection(){
        try{
            Class.forName("com.mysql.jdbc.Driver");
          return DriverManager.getConnection("jdbc:mysql://localhost:3306/jdbc_test","root","1234");
        }catch(ClassNotFoundException e){
            e.printStackTrace();
        }catch(SQLException e){
            e.printStackTrace();
        }
        return null;
    }

    //通过参数连接数据库
    public Connection getConnection(String url,String username,String pwd){
            try{

                Class.forName("com.mysql.jdc.Driver");
                return DriverManager.getConnection(url,username,pwd);
            } catch(ClassNotFoundException e){
                e.printStackTrace();
            }catch(SQLException e){
                e.printStackTrace();
            }
            return null;
    }   

    //通过配置文件DBConfig.properties连接数据库
    public Connection openConnection(){
          Properties prop=new Properties();
          String driver=null;
          String username=null;
          String url=null;
          String pwd=null;

        try{
         prop.load(this.getClass().getClassLoader().getResourceAsStream("DBConfig.properties"));
             driver=prop.getProperty("driver");
             url=prop.getProperty("url");
             username=prop.getProperty("username");
             pwd=prop.getProperty("pwd");
            Class.forName(driver);
            return DriverManager.getConnection(url,username,pwd);
        }catch(ClassNotFoundException e){
            e.printStackTrace();
        }catch(SQLException e){
            e.printStackTrace();
        }catch(Exception e){
            e.printStackTrace();
        }
        return null;
    }   

    //关闭数据库
    public void closeConn(Connection conn){     
         try {
            conn.close();
          } catch (SQLException e) {
            // TODO Auto-generated catch block
            System.out.println("数据库关闭异常");
            e.printStackTrace();
          }
    }

}

3. 增删改查

Mysql数据库表

create table Users(
    id          int     primary key AUTO_INCREMENT,
    name        varchar(100),
    age         int,
    birthday    date    default '1994-5-6',
    money       int
)AUTO_INCREMENT = 1 ;

UserBean.java

package connect;

//封装userbean,并且定义接口
public class UserBean {

        private int id ;
        private String name ;
        private int age;
        private String birthday;
        private int money;


        public int get_id(){
            return id;
        }
        public void set_id(int id){
            this.id=id;
        }

        public String get_name(){
            return name;
        }
        public void set_name(String name){
            this.name=name;
        }

        public int get_age(){
            return age;
        }
        public void set_age(int age){
            this.age=age;
        }

        public String get_birthday(){
            return birthday;
        }
        public void set_birthday(String birthday){
            this.birthday=birthday;
        }

        public int get_money(){
            return money;
        }
        public void set_money(int money){
            this.money=money;
        }
}

UserDAO.java

package connect;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

public class UserDAO {
        //创建insert方法
        public int insert(UserBean users)
        {
                int i=0;
                DBUtil util = new DBUtil();
                Connection  conn=util.openConnection();//创建数据库连接
                String sql = "insert into Users (id , name, age, birthday, money) values(?,?,?,?,?)";//定义sql语句
                PreparedStatement pstmt;
                try {
                    pstmt = (PreparedStatement) conn.prepareStatement(sql);
                    pstmt.setInt(1, users.get_id());
                    pstmt.setString(2, users.get_name());
                    pstmt.setInt(3, users.get_age());
                    pstmt.setString(4, users.get_birthday());
                    pstmt.setInt(5, users.get_money());
                    i = pstmt.executeUpdate();
                    pstmt.close();
                    conn.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                    try{
                        conn.rollback();
                    }catch(SQLException el){
                        el.printStackTrace();
                    }
                }finally{
                    util.closeConn(conn);
                }
                return i;

        }

        //创建delete方法通过name删除记录
        public int delete(String name) {
            DBUtil util = new DBUtil();
            Connection conn = util.openConnection();
            int i = 0;
            String sql = "delete from Users where Name='" + name + "'";
            PreparedStatement pstmt;
            try {
                pstmt = (PreparedStatement) conn.prepareStatement(sql);
                i = pstmt.executeUpdate();
                System.out.println("resutl: " + i);
                pstmt.close();
                conn.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
            return i;
        }

        //创建update方法
        public int update(UserBean users) {
            DBUtil util = new DBUtil();
            Connection conn = util.openConnection();
            int i = 0;
            String sql = "update Users set age='" + users.get_age() + "' where name='" + users.get_name() + "'";
            PreparedStatement pstmt;
            try {
                pstmt = (PreparedStatement) conn.prepareStatement(sql);
                i = pstmt.executeUpdate();
                System.out.println("resutl: " + i);
                pstmt.close();
                conn.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
            return i;
        }

        //创建list方法
        public Integer list() {
            DBUtil util = new DBUtil();
            Connection conn = util.openConnection();
            String sql = "select * from Users";
            PreparedStatement pstmt;
            try {
                pstmt = (PreparedStatement)conn.prepareStatement(sql);
                ResultSet rs = pstmt.executeQuery();
                int col = rs.getMetaData().getColumnCount();//列数
                System.out.println("============================");
                System.out.println("id\tname\tage\tbirthday\t\tmoney");
                while (rs.next()) {//一行一行输出
                    for (int i = 1; i <= col; i++) {
                        System.out.print(rs.getString(i) + "\t");//输出
                        if ((i == 2) && (rs.getString(i).length() < 8)) {//输出制表符
                            System.out.print("\t");
                        }
                     }
                    System.out.println("");
                }
                    System.out.println("============================");
            } catch (SQLException e) {
                e.printStackTrace();
            }
            return null;
        }
}

4. 测试

DBUtilTest.java

package connect;

public class DBUtilTest{

    public static void main(String args []){
        UserBean u = new UserBean();
        UserDAO  op= new UserDAO();

        u.set_id(3);
        u.set_name("asdf");
        u.set_age(66);
        u.set_birthday("2018-10-1");
        u.set_money(100);

        //增加
        op.insert(u);
        op.list();

        //修改
        u.set_age(99);
        op.update(u);
        op.list();

        //删除
        op.delete("asdf");
        op.list();
    }
}

5.IDEA使用JDBC连接数据库(MySQL)

下面再来看下导入jar的步骤(对应版本同上获取),网上此类资料很多,不详细赘述了

框架前连接数据库的准备:通过JDBC连接MySQL
写代码
//导入包
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

/*
 * 数据库连接
 */
public class Conn {
    public static void main(String[] args) {
        Connection con;
        //jdbc驱动
        String driver="com.mysql.cj.jdbc.Driver";
        //这里我的数据库是cxxt
        String url="jdbc:mysql://localhost:3306/demo?&useSSL=false&serverTimezone=UTC";
        String user="root";
        String password="1234";
        try {
            //注册JDBC驱动程序
            Class.forName(driver);
            //建立连接
            con = DriverManager.getConnection(url, user, password);
            if (!con.isClosed()) {
                System.out.println("数据库连接成功");
            }
            con.close();
        } catch (ClassNotFoundException e) {
            System.out.println("数据库驱动没有安装");

        } catch (SQLException e) {
            e.printStackTrace();
            System.out.println("数据库连接失败");
        }
    }
}
 

6.总结

JDBC的结构和特点

简单地说,JDBC能完成下列三件事:与一个数据库建立连接;向数据库发送SQL语句;处理数据库返回的结果。

JDBC是一种底层API,这意味着它将直接调用SQL命令。JDBC完全胜任这个任务,而且比其他数据库互联更加容易实现。同时它也是构造高层API和数据库开发工具的基础。高层API和数据库开发工具应该是用户界面更加友好,使用更加方便,更易与理解的。但所有这样的API将最终被翻译为底层API,如JDBC。目前两种基于JDBC的高层API正处在开发阶段。一个是SQL语言嵌入Java的预处理器;另一个是实现从关系数据库到Java类的直接映射。

JDBC包含两部分与数据库独立的API:面向程序开发人员的JDBC API和面向底层的JDBC Driver API。

  1. java.sql.DriverManager:处理驱动的调入并且对产生新的数据库连接提供支持;
  2. java.sql.Connection:代表对特定数据库的连接;
  3. java.sql.Statement:代表一个特定的容器,来对一个特定的数据库执行SQL语句;
  4. java.sql.ResultSet:控制对一个特定语句的行数据的存取。

其中java.sql.Statement又有两个子类型:java.sql.PreparedStatement用于执行预编译的SQL语句;java.sql.CallableStatement用于执行对一个数据库内嵌过程的调用。

面向地层的JDBC Driver API主要是针对数据库厂商开发数据库底层驱动程序使用的,一般情况下用于开发应用程序用不到这些类库。Java通过SQL包中定义的一系列抽象类对数据库进行操作,而实现这些抽象类并完成实际操作,则是由数据库驱动器Driver运行的。JDBC的Driver可分为以下4中类型:

  1. JDBC-ODBCBridge和ODBC Driver
  2. Native-API partly-Java Driver
  3. JDBC-Net All-Java Driver
  4. Native-protocol All-Java Driver

JDBC优缺点

  1. 可以对所以主流数据库进行统一访问(ACCESS,MySQL,Sql Server,Oracle);
  2. 极大地减少了程序操作数据库的复杂性;
  3. jdbc使用面向对象的方式操作数据,能更好的和Java语言衔接;
  4. jdbc可以直接调用数据库存储过程;
  5. jdbc操作数据库的效率很高; 
  6. 缺点就是不安全,因为你会把数据库的用户名和密码写入代码里,别人可以反编译便可以获取你的数据库信息。