zoukankan      html  css  js  c++  java
  • jdbc连接mysql数据库

    最近复习了一下Java的基础,包括封装、继承、多态、IO、多线程、反射等等,但我感觉JDBC是个大块,花了半天时间实践总结了一下,顺带记录一波。主要是模板,在以后编程中大概率会用到,尤其是下学期的《数据库编程》课程。

    就记录一下基础的,至于游标、触发器、存储过程以后有机会了再详细写吧。


    JDBC

    JDBC是Java和数据库之间的一个桥梁。Java代码需要连接数据库,就可以通过JDBC来连接。

    首先是应用模板,因为我每次来看博客,都是因为某段代码忘记则么敲了。需要看具体原理实现的请往下拉。

    以下所有代码纯手打,我都亲自试过好几遍,复制即可用。


    使用前提:

    1.  导入一个jar包,包全名是mysql-connector-java-5.1.22-bin.jar
    2.  mysql数据库名称为test,表名为dbtable,账户名为root,密码为123456    当然也可以自行修改
    3.  test数据库中,有dbtable表,三个字段:a_id (int),a_name(String),a_password(String)   可自行修改

    第1/3步:新建一个 JdbcUtils 类,该类作用只是连接上mysql数据库,仅仅如此。

    getConnection()方法用来获取连接,static静态,执行一次即可

    import java.sql.*;
    
    public class JdbcUtils {
    
        static {
            try {
                Class.forName("com.mysql.jdbc.Driver");
            } catch (ClassNotFoundException e) {
                e.printStackTrace();
            }
        }
        
        public static Connection getConnection() throws SQLException {
            Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/test",
                    "root","123456");
            return conn;
        }
        
        public static void close(ResultSet rs, Statement st,Connection conn){
            if (rs != null){
                try {
                    rs.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
            if(st != null){
                try {
                    st.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
            if (conn != null){
                try {
                    conn.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
        }
    }
    

    第2/3步:新建一个 JdbcDao 类,该类是用来对数据库进行增删改查的,在测试函数内可以直接调用insert(),等方法使用。

    import java.sql.Connection;
    import java.sql.PreparedStatement;
    import java.sql.ResultSet;
    import java.sql.SQLException;
    
    public class JdbcDao {
    
        private JdbcUtils jdbcUtils = new JdbcUtils();
        private String TableName = "dbtable";
    
        public int insert(User user) throws SQLException {
            Connection conn = jdbcUtils.getConnection();
            String sql = "insert into " + TableName +" values(?,?,?)";
            PreparedStatement ps = conn.prepareStatement(sql); // 预编译
    
            int a_id = user.getId();
            String a_name = user.getName();
            String a_password = user.getPassword();
    
            ps.setInt(1,a_id);
            ps.setString(2,a_name);
            ps.setString(3,a_password);
    
            int ans = ps.executeUpdate();
            return ans;
        }
        public int update(String name,String password) throws SQLException {
            Connection conn = jdbcUtils.getConnection();
            String sql = "update " + TableName + " set a_password = ? where a_name = ?";
            PreparedStatement ps = conn.prepareStatement(sql); // 预编译
    
            ps.setString(1,password);
            ps.setString(2,name);
    
            int ans = ps.executeUpdate();
            return ans;
        }
        public int delete(int id) throws SQLException {
            Connection conn = jdbcUtils.getConnection();
            String sql = "delete from "+ TableName +" where a_id = ?";
            PreparedStatement ps = conn.prepareStatement(sql); // 预编译
            ps.setInt(1,id);
            int ans = ps.executeUpdate();
            return ans;
        }
        public void findPassword(String name) throws SQLException {
            Connection conn = jdbcUtils.getConnection();
            String sql = "select a_password from "+ TableName + " where a_name = ?";
            PreparedStatement ps = conn.prepareStatement(sql); // 预编译
            ps.setString(1,name);
            ps.execute();
            ResultSet rs = ps.executeQuery();
            while(rs.next()){
                System.out.println("密码为  " +  rs.getString("a_password"));
            }
        }
    }
    

    第3/3步:新建测试函数 DbMain ,分别对 JdbcDao 的增删改查方法进行测试。

    import java.sql.SQLException;
    
    public class DbMain {
        public static void main(String[] args) throws SQLException {
            JdbcDao jdbcDao = new JdbcDao();
            jdbcDao.insert(new User(1,"zwz","123"));
            jdbcDao.update("zwz","123456789");
            jdbcDao.findPassword("zwz");
            jdbcDao.delete(1);
        }
    }

    以上是实际编程的时候,经常需要用到的模板。 


    接着来好好总结一下这几天看的JDBC

    第一步:首先最最基础的,就是连接上mysql

        Class.forName("com.mysql.jdbc.Driver");
        String URL = "jdbc:mysql://localhost:3306/test";
        String USER = "root";
        String PASS = "123456";
        Connection conn = DriverManager.getConnection(URL,USER,PASS);

    代码第一行 Class.forName()的用途,是利用Java的反射机制,加载mysql的驱动。就好比有了声卡驱动,才有可能有声音;有了打印机驱动,你的打印机才可能正常运行。

    第五行 DriverManager.getConnection方法,是用来创建一个对象和mysql数据库(以mysql为例)进行连接,并返回这个Collection对象。是数据库编程中最重要的一个对象,就好比一个信使,客户端与数据库所有交互都是通过connection对象完成的。


    第二步:连接mysql成功之后,就是利用sql代码进行一系列操作

    这里有两个类供我们选择,一个是Statement,另外一个是PreparedStatement(前者的子类)。他们都是用于向数据库发送SQL语句。但是Statement只能发送静态的SQL语句,比如“select * from admin where name = 'zwz' ”,其中的属性不能修改,而且存在SQL注入等安全性问题,所以我推荐使用PreparedStatement,一者是安全性高,再者是功能强大。

    我们先用Statement试一下,Statement 对象 st 获取用于向数据库发送sql语句。

    ResultSet 对象 rs 用于接受数据库返回的查询结果。

        Statement st = conn.createStatement();
        String sql = "select * from admin";
        ResultSet rs =  st.executeQuery(sql);

    接着,我们可以对查询结果进行输出显示

        while(rs.next()){
            String id = rs.getString("a_id");
            String user = rs.getString("a_name");
            String passwd = rs.getString("a_password");
            System.out.println(id + " " + user + " " + passwd);
        }

    Statement的最大缺点就是只能静态,而PreparedStatement类可以弥补这个缺陷。PreparedStatement也是一样,是一个缓存中转站,用于向数据库发送SQL语句。

        String sql = "select * from admin where a_id = ?";
        int idd = 1;
        PreparedStatement ps = conn.prepareStatement(sql);//预编译
        ps.setInt(1,idd);
        ps.executeQuery();
        ResultSet rs = ps.executeQuery();
        while(rs.next()){
            String id = rs.getString("a_id");
            String name = rs.getString("a_name");
            String passwd = rs.getString("a_password");
            System.out.println(id + " " + name + " " + passwd);
        }

    以上代码,可以实现where字句对查询结果的筛选。一个很明显的语法格式,就是预编译

    其中SQL语句有若干个问号,代表某个值我等下要放进去,等PreparedStatement预编译完成之后,再通过set方法插入刚刚缺少的值,最后提交到数据库。

    不管是什么SQL语句,某个字段需要动态改变的,都预先放一个问号,然后再set导入即可。


    第三步 释放对象

    养成良好的习惯,new了什么,就关闭什么。

    if(conn != null)   conn.close();

    游标、触发器、存储过程也用成功了,有点小复杂,以后再补充

  • 相关阅读:
    电商框架
    激光推送
    requirejs的用法(二)
    requirejs(一)
    AngularJs表单验证
    angularjs学习资料
    AngularJS内置指令
    angularjs 指令详解
    ASP.NET MVC5 + EF6 入门教程 (5) Model和Entity Framework
    EF框架step by step(9)—Code First Fluent API
  • 原文地址:https://www.cnblogs.com/yyzwz/p/13393243.html
Copyright © 2011-2022 走看看