java——jdbc数据库连接

所需jar包mysql-connector-java-5.1.7-bin.jar
Statement实例分为以下3 【下面案例只演示了前面两种】
种类型:
1、执行静态SQL语句。通常通过Statement实例实现。
2、执行动态SQL语句。通常通过PreparedStatement实例实现。
3、执行数据库存储过程。通常通过CallableStatement实例实现


package com.sd.test;

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


/**
 * @author Administrator 2017年3月23日
 *
 * 
 */
public class JDBCutil {
    /*
     连接URL定义了连接数据库时的协议、子协议、数据源标识。   
    书写形式:协议:子协议:数据源标识   
    协议:在JDBC中总是以jdbc开始   
    子协议:是桥连接的驱动程序或是数据库管理系统名称。   
    数据源标识:标记找到数据库来源的地址与连接端口。
    */
    //private static String url ="jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf-8";
    private static String url="jdbc:mysql://localhost:3306/test";
    private static String username="root";
    private static String password="123456";

    public static Connection mysqlConnect(){
        Connection con=null;
        try {
            Class.forName("com.mysql.jdbc.Driver");//成功加载后,会将Driver类的实例注册到DriverManager类中。
        } catch (ClassNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        try {
            con=DriverManager.getConnection(url,username,password);
        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return con;
    }
    //statment
    /*
        常用的几种查询
        ResultSet rs = stmt.executeQuery("SELECT * FROM ...") ;  // 返回ResultSet对象。当希望得到一个结果集使用此方法,就像使用一个SELECT语句。
        int rows = stmt.executeUpdate("INSERT INTO ...") ;  //返回受影响的SQL语句执行的行数。使用此方法来执行,而希望得到一些受影响的行的SQL语句 - 例如,INSERT,UPDATE或DELETE语句。
        boolean flag = stmt.execute(String sql) ;  //返回一个布尔值true,如果ResultSet对象可以被检索,否则返回false。使用这个方法来执行SQL DDL语句,或当需要使用真正的动态SQL。
     */
    public static void statment_query(int id){

        String sql_query="select * from a where id="+id+";";
        String sql_update="insert into a (id,username) values (1234,'sdf'),(1234,'sssss')";
        Connection con=mysqlConnect();
        Statement stmt=null;
        try {
            stmt=con.createStatement();
            ResultSet rs=stmt.executeQuery(sql_query);
            while(rs.next()){
                int prim_id=rs.getInt("id");
                String username=rs.getString("username");
                System.out.println("executeQuery:"+prim_id+"---"+username);
            }
            /*Boolean isSuccess= stmt.execute(sql_update);
            System.out.println("execute:"+isSuccess);*/
            /*int insertCount=stmt.executeUpdate(sql_update);
            System.out.println("executeUpdate:"+insertCount);*/
            if(rs!=null){
                rs.close();
            }
        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        if(stmt!=null){
            try {
                stmt.close();
            } catch (SQLException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
        if(con!=null){
            try {
                con.close();
            } catch (SQLException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }

    }

    //PreparedSatement方法同上
    public static void preparedSatement_query(int id,String username){
        String sql="select * from a where id=? and username=?";
        Connection con=mysqlConnect();
        PreparedStatement ps= null;
        try {
            ps=con.prepareStatement(sql);
            ps.setInt(1, id);
            ps.setString(2, username);
            ResultSet rs=ps.executeQuery();
            while(rs.next()){
                int prim_id=rs.getInt("id");
                String un=rs.getString("username");
                System.out.println("PreparedSatement:"+prim_id+"----"+un);
            }
        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
    public static void main(String args[]){
        statment_query(1234);
        preparedSatement_query(1234,"DJ");
    }
}
/*
      1、执行静态SQL语句。通常通过Statement实例实现。
      2、执行动态SQL语句。通常通过PreparedStatement实例实现。
      3、执行数据库存储过程。通常通过CallableStatement实例实现。【了解】
 */

/*
    PreparedStatement 和 statement;
    1.PreparedSatement可以写动态参数化查询如上
    2.PrepareStatement比statemnt更快,使用PrepareStatement SQL语句会预编译在数据库系统中
    执行计划同样会被缓存起来,它允许数据库做参数化查询。使用预处理语句比普通的查询更快,因为它做的工作更少
    (数据库对SQL语句的分析,编译,优化已经在第一次查询前完成了)
    【如果仅仅执行了一次的话,它应该和普通的对象毫无差异,体现不出它预编译的优越性。PrepareStatement只需
    DBMS运行SQL语句,而不必先编译执行许多SQL语句的JDBC程序产生大量的Statement和PreparedStatement
    对象。通常认为PreparedStatement对象比Statement对象更有效,特别是如果带有不同参数的同一SQL语句被多
    次执行的时候。PreparedStatement对象允许数据库预编译SQL语句,这样在随后的运行中可以节省时间并增加代码
    的可读性】
     sql1:prestmt = conn.prepareStatement("select * from a where id=" + id);
     sql2:PreparedStatement prestmt = conn.prepareStatement("select * from a where id=?");
          prestmt.setInt(1,id);
     sql1用追加方式是错误的使用方法;
    3.防止sql注入式攻击
     sql1="select * from a where id='"+id+"' and username='"+usernsme+"';"
     恶意填入 :id = "1' OR '1'='1";
            username = "1' OR '1'='1";
     最终sql1变为"select * from a where id='1' OR '1'='1' and username='1' OR '1'='1';"
     使得sql1中的where条件恒等。可以达到无账号密码登录网站。
      防爬:将参数里的单引号替换掉id.replace("'",",")【连续2个单引号字符在SQL数据库中会视为字符中的一个单引号字符】
     PrepareStatement不是已追加方式处理所以可防止sql注入攻击
*/
/*
DDL(data definition language):数据定义语言
DDL主要是用在定义或改变表(TABLE)的结构,数据类型,表之间的链接和约束等初始化工作上,他们大多在建立表时使用。
常用的语句关键字包括:
(1)CREATE
(2)ALTER
(3)DROP

2、DML(data manipulation language):数据库操纵语言
用于添加、删除、更新和查询数据库记录,并检查数据完整性。SQL中处理数据等操作统称为数据操纵语言 。
常用的语句关键字包括:
(1)SELECT
(2)UPDATE
(3)INSERT
(4)DELETE

3、DCL(Data Control Language):数据控制语言
用来授予或回收访问数据库的某种特权,并控制数据库操纵事务发生的时间及效果,对数据库实行监视等 。
常用的语句关键字包括:
(1)COMMIT 提交 
(2)SAVEPOINT  保存点 
(3)ROLLBACK    回滚 
(4)SET TRANSACTION   设置当前事务的特性,它对后面的事务没有影响
*/
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值