java连接数据库 JDBC MySQL

另:准备工作 

电脑安装MySQL,安装MySQL可视化操作工具Workbench,创建好数据库。

一:连接数据库

--1--导入mysql相关jar包 :mysql-connector-jar(手动导包过程在另一文章)

--2--加载驱动

--3--通过Connection类,填写待连接数据库的基本信息

package jdbc;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;

/**
 * Created by Seadragon on 2019-12-26.
 */
public class JdbcConnect {
    public static void main(String[] args) throws ClassNotFoundException {
        Connection connection = null;
        Statement statement = null;
        try {
            //初始化驱动,加载驱动
            Class.forName("com.mysql.jdbc.Driver");


            //Connection对象的连接,填写待连接数据库的信息。连接相关数据库
            connection = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/ksea?characterEncoding=UTF-8",
                    "root","root");
            System.out.println("连接成功:"+connection.toString());


            //创建sql语句相关对象 Statement
            statement = connection.createStatement();
            System.out.println("获取sql语句对象:"+statement);


            //准备相关sql语句
            //自增主键的位置用NULL代替即可
            String sql = "INSERT INTO hero VALUES (NULL ,'男枪', 3150)";
            int i = 100;
            while (i!=0) {
                statement.execute(sql);
                i--;
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }finally {
            //关闭连接,释放资源
            //先关statement,再关Connection
            if(statement!=null){
                try {
                    statement.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
            if (connection!=null)
            {
                try {
                    connection.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
            System.out.println("关闭:"+statement+"----"+connection);
        }
    }
}
jdbc-mysql-connect

二:数据库操作

Connection对象用于连接数据库

--1--调用方法为调用mysql驱动类,DriverManager.getConnection(url)

Statement对象用于对sql语句操作,

--1--创建:connection.createStatement

--2--执行:executeQuery()【执行查询,返回的是ResultSet对象】;execute【增删更新,可以通过getResultSet进行查询,返回的是Boolean】;executeUpdate【不可查询,返回数据是受影响的数据条数】

ps:sql语句中自增长用null代替即可

PreparedStatement为Statement的升级版,sql的语句可简写,预编译机制速度快,可以预防sql注入式攻击

--1--sql注入攻击:改变sql语句结构,例如:拼接 "sql"+"or 1=1",使得语句无限次执行

--2--PreparedStatement只可设置值,分为预编译和执行两个阶段,且不可改变sql结构,故能防御注入

package jdbc;

import java.sql.*;

/**
 * Created by Seadragon on 2019-12-26.
 */
public class JdbcPreparedStatemen {
    public static void main(String[] args) throws ClassNotFoundException, SQLException {
        Class.forName("com.mysql.jdbc.Driver");
        Connection connection = null;
        Statement statement = null;

        String sql_preState = "insert into hero values(null,?,?)";
        String sql_state = "insert into hero VALUES (null,"+"'提莫',"+12+")";

        //执行sql语句的两种方式
        connection = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/ksea?","root","root");
        statement = connection.createStatement();
        PreparedStatement preparedStatement = connection.prepareStatement(sql_preState);
        statement.execute(sql_state);
        preparedStatement.setString(1,"提莫pre");
        preparedStatement.setInt(2,1233);
        preparedStatement.execute();


    }
}
Statement and PreparedStatement

三:数据库元数据

即数据库名称,有哪些表等一些的基本数据,通过DatabaseMetaData对象获取,调用getMetaData方法

package jdbc;

import java.sql.*;

/**
 * Created by Seadragon on 2019-12-27.
 */
public class getMetaData {
    public static void main(String[] args) throws SQLException, ClassNotFoundException {
        Class.forName("com.mysql.jdbc.Driver");
        Connection connection = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/ksea?","root","root");
        DatabaseMetaData databaseMetaData = connection.getMetaData();
        System.out.println(databaseMetaData.getDatabaseProductName());
        System.out.println(databaseMetaData.getDatabaseProductVersion());
    }
}
getMeta

四:事务

即把几个sql语句的执行打包在一起,若全都成功执行才执行,若有一条失败则全都不执行。处理方法为关闭自动提交改为手动提交。

--1---

connection.setAutoCommit(false)

{sql}

connection.commit()

package jdbc;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;

/**
 * Created by Seadragon on 2019-12-27.
 */
public class JdbcTransaction {
    public static void main(String[] args) throws ClassNotFoundException, SQLException {
        Class.forName("com.mysql.jdbc.Driver");
        Connection connection = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/ksea?","root","root");
        Statement statement =  connection.createStatement();
        connection.setAutoCommit(false);
        String sql = "insert into user values(NULL,"+"'kkk',"+"'12345'"+")";
        String sql_false = "insert into rrrr values(NULL,"+"'kkk',"+"'12345'"+")";
        statement.execute(sql);
        statement.execute(sql_false);
        connection.commit();

        System.out.println("你是否要删除该数据");

    }
}
jdbc-mysql-transaction

五:ORM

对象映射数据,即把数据库的每条数据与一对象映射,我愿理解为数据库在java中的封装

package jdbc;
import hero.Hero;
import jdbc.*;

import java.security.PublicKey;
import java.sql.*;

/**
 * Created by Seadragon on 2019-12-27.
 */
public class JdbcORM {
    public static void main(String[] args) throws ClassNotFoundException, SQLException {
       Hero hero =  get(3);
       Hero hero_add = new Hero("男枪",12);
       add(hero_add);
       delete("男枪");
       update(1);
        System.out.println(hero.getName()+":"+hero.getPrice());
    }

    public static Connection connectMysql() throws ClassNotFoundException, SQLException {
        Class.forName("com.mysql.jdbc.Driver");
        Connection connection = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/ksea?","root","root");
        return connection;
    }

    //ID查询
    public static Hero get(int id) throws ClassNotFoundException, SQLException {
        Hero hero = null;
        Connection connection = connectMysql();
        Statement statement = connection.createStatement();
        String sql = "select * from hero where idHero = "+id;
        ResultSet resultSet = statement.executeQuery(sql);
        while (resultSet.next()){
            hero = new Hero();
            String name = resultSet.getString("name");
            int price = resultSet.getInt("price");
            hero.setName(name);
            hero.setPrice(price);
        }
        return hero;
    }

    //add方法
    public static void add(Hero hero) throws ClassNotFoundException, SQLException {
        Connection connection = connectMysql();
        String sql = "insert into hero values(null,?,?)";
        PreparedStatement preparedStatement = connection.prepareStatement(sql);
        preparedStatement.setString(1,hero.getName());
        preparedStatement.setInt(2,hero.getPrice());
        preparedStatement.execute();
    }

    //delete方法
    public static void delete(String heroname) throws SQLException, ClassNotFoundException {
        Connection connection = connectMysql();
        String sql = "DELETE FROM hero WHERE NAME = ?";
        PreparedStatement preparedStatement = connection.prepareStatement(sql);
        preparedStatement.setString(1,heroname);
        preparedStatement.execute();
    }

    //update
    public static void update(int id) throws SQLException, ClassNotFoundException {
        Connection connection = connectMysql();
        String sql = "UPDATE hero SET name = ?,price = ? WHERE idHero = ?";
        PreparedStatement preparedStatement = connection.prepareStatement(sql);
        preparedStatement.setString(1,"修改的英雄名称");
        preparedStatement.setInt(2,1234);
        preparedStatement.setInt(3,id);
        preparedStatement.execute();
    }
}
jdbc-mysql-ORM

六:连接池

减少创建数据库创建连接和关闭连接的时间,创建连接池,里面开启n条连接永不关闭。

若需要连接数据库,则往连接池中申请,若连接池有空闲连接,则给它;使用完连接后不直接关闭而是返还到连接池中处于空闲状态。

涉及多线程相关

package jdbc;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

/**
 * Created by Seadragon on 2019-12-28.
 */
public class JdbcConnectionPool {
    List<Connection> connections = new ArrayList<Connection>();
        int size;
        public JdbcConnectionPool(int size) throws SQLException, ClassNotFoundException {
                this.size=size;
                init();
        }
        public void init() throws ClassNotFoundException, SQLException {
            Class.forName("com.mysql.jdbc.Driver");
            for (int i = 0;i<size;i++) {
                Connection connection = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/ksea?", "root", "root");
                connections.add(connection);
            }
        }
        public synchronized Connection getConnection() throws InterruptedException {
            while (connections.isEmpty()){
                this.wait();
            }
            Connection connection = connections.remove(0);
            return connection;
        }
        public synchronized void returnConnection(Connection connection){
            connections.add(connection);
            this.notifyAll();
        }

}
jdbc-mysql-connectionPool

猜你喜欢

转载自www.cnblogs.com/KSea/p/12095970.html