bin102525561

jdbc连接mysql数据库连接步骤

 

 

2、对数据库进行 增  删  改

 

package cn.itcast.demo2;

 

import java.sql.DriverManager;

import java.sql.SQLException;         

import java.sql.Statement;

 

 

 

 

import org.junit.Test;

 

import com.mysql.jdbc.Connection;

 

 

public class demo2 {

     /*连接数据库,得到Connection就算成功

      * 对数据库进行  增   删   改   

      */

@Test

public void fun1() throws ClassNotFoundException, SQLException{

/*

 *一、 得到Connection

 *  1、准备四大参数

 *  2、加载驱动类

 *  3、得到Connection

 */

//准备四大参数

String driverClassName ="com.mysql.jdbc.Driver";

//对mysql而言,他的子协议结构://主机:端口号/数据库名称

String url = "jdbc:mysql://localhost:3306/mydb";

String usename = "root";

String password = "";

 

//加载驱动类

Class.forName(driverClassName);

//使用DriverManager,以及剩下的3参数得到Connection

Connection con= (Connection) DriverManager.getConnection(url,usename,password);

 

/*对数据库做  增   删   改   

 * 1.通过Connection对象创建Statement

 * >Statement  就是语句发送器,他的功能就是向数据库发送sql语句

 * 调用他的int executeUpdate(String sql),它可以发送DML、DDL

 */

//通过Conncetion得到Statement对象

 

//使用Statement 发送sql语句!!

Statement stmt = con.createStatement();

 

//向表中添加一行数据

//String sql = "INSERT INTO MYTB(NAME,SEX) VALUES(\'ZS\',\'女\' )";

 

//把表中的成员信息进行修改

String sql = "update mytb set name = \'zhangsan\' , sex =\'nv\' where  name=\'zhangsan123\'";

 

//把表中的成员信息进行删除

//String sql = "delete from mytb where name =\'zs\'";

 

int r = stmt.executeUpdate(sql);

System.out.println(r);

   @Test

   public void fun2() throws ClassNotFoundException, SQLException{

       /*

        * 一、得到Connection

        * 二、得到Statement、发送select 语句

        * 三、对查询返回的表格进行解析!

        */

    /*

     * 得到连接

     * 1、准备四大参数

     */

    

     String driverClassName = "com.mysql.jdbc.Driver";

     String url = "jdbc:mysql://localhost:3306/mydb";

     String username = "root";

     String password ="";

    

         /*

          *2、 加载驱动类

          */

     Class.forName(driverClassName);

          /*

           * 通过剩下的3个参数调用DriverManager的getConnection();得到连接

           */

       Connection con= DriverManager.getConnection(url,username,password);

       

          /*

           * 得到statement、执行select语句

           * 得到statement对象,Connection的createStatement()方法

           */

                       Statement stmt = con.createStatement();

                 /*

                  * 调用Statement 的ResultSet rs=executeQuery(String querySql);      

                  */

                          ResultSet rs = stmt.executeQuery("select * from mytb");

              /*

               * 解析ResultSet 

               * 1、把光标先下移动一行、可以调用next()方法来完成,

               */

            while(rs.next()){

             String  na= rs.getString("name");

             System.out.println(na);

           

            }

        /*

         * 四、关闭资源

         * 关闭顺序要后开先关、倒关的方式关闭

         */

            //这个资源一定要记得关闭、不然容易死!!

            rs.close();

            stmt.close();

            con.close();

   }

}

 

}

规范化代码

所谓规范化代码就是无论是否出现异常,都要关闭ResultSetStatement,以及Connection,如果你还记得IO流的规范化代码,那么下面的代码你就明白什么意思了。

 

@Test

public void query() {

Connection con = null;

Statement stmt = null;

ResultSet rs = null;

try {

con = getConnection();

stmt = con.createStatement();

String sql = "select * from user";

rs = stmt.executeQuery(sql);

while(rs.next()) {

String username = rs.getString(1);

String password = rs.getString(2);

System.out.println(username + ", " + password);

}

} catch(Exception e) {

throw new RuntimeException(e);

} finally {

try {

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

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

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

} catch(SQLException e) {}

}

}

 

JDBC对象介绍

 

1 JDBC中的主要类(接口)

JDBC中常用的类有:

l DriverManager

l Connection

l Statement

l ResultSet

 

2 DriverManager

其实我们今后只需要会用DriverManagergetConnection()方法即可:

  1. Class.forName(“com.mysql.jdbc.Driver”);//注册驱动
  2. String url = “jdbc:mysql://localhost:3306/mydb1”;
  3. String username = “root”;
  4. String password = “123”;
  5. Connection con = DriverManager.getConnection(url, username, password);

 

注意,上面代码可能出现的两种异常:

  1. ClassNotFoundException:这个异常是在第1句上出现的,出现这个异常有两个可能:

l 你没有给出mysqljar包;

l 你把类名称打错了,查看类名是不是com.mysql.jdbc.Driver

 

  1. SQLException:这个异常出现在第5句,出现这个异常就是三个参数的问题,往往usernamepassword一般不是出错,所以需要认真查看url是否打错。

 

对于DriverManager.registerDriver()方法了解即可,因为我们今后注册驱动只会Class.forName(),而不会使用这个方法。

 

3 Connection

Connection最为重要的方法就是获取Statement

l Statement stmt = con.createStatement(); 

 

后面在学习ResultSet方法时,还要学习一下下面的方法:

l Statement stmt = con.createStatement(int,int);

4 Statement

Statement最为重要的方法是:

l int executeUpdate(String sql):执行更新操作,即执行insertupdatedelete语句,其实这个方法也可以执行create tablealter table,以及drop table等语句,但我们很少会使用JDBC来执行这些语句;

l ResultSet executeQuery(String sql):执行查询操作,执行查询操作会返回ResultSet,即结果集。

 

  boolean execute()

Statement还有一个boolean execute()方法,这个方法可以用来执行增、删、改、查所有SQL语句。该方法返回的是boolean类型,表示SQL语句是否有结果集!。

如果使用execute()方法执行的是更新语句,那么还要调用int getUpdateCount()来获取insertupdatedelete语句所影响的行数。

如果使用execute()方法执行的是查询语句,那么还要调用ResultSet getResultSet()来获取select语句的查询结果。

 

5 ResultSet之滚动结果集(了解)

下一行:默认只能使用它,其他的方法存在,但不能使用!默认的结果集不可滚动!

上一行

N

N

N行!

ResultSet表示结果集,它是一个二维的表格!ResultSet内部维护一个行光标(游标),ResultSet提供了一系列的方法来移动游标:

l void beforeFirst():把光标放到第一行的前面,这也是光标默认的位置;

l void afterLast():把光标放到最后一行的后面;

l boolean first():把光标放到第一行的位置上,返回值表示调控光标是否成功;

l boolean last():把光标放到最后一行的位置上;

l boolean isBeforeFirst():当前光标位置是否在第一行前面;

l boolean isAfterLast():当前光标位置是否在最后一行的后面;

l boolean isFirst():当前光标位置是否在第一行上;

l boolean isLast():当前光标位置是否在最后一行上;

l boolean previous():把光标向上挪一行;

l boolean next():把光标向下挪一行;

l boolean relative(int row):相对位移,当row为正数时,表示向下移动row行,为负数时表示向上移动row行;

l boolean absolute(int row):绝对位移,把光标移动到指定的行上;

l int getRow():返回当前光标所有行。

 

 

获取结果集元数据!

l 得到元数据:rs.getMetaData(),返回值为ResultSetMetaData

l 获取结果集列数:int getColumnCount()

l 获取指定列的列名:String getColumnName(int colIndex)

 

结果集特性:当使用ConnectioncreateStatement时,已经确定了Statement生成的结果集是什么特性。

l 是否可滚动

l 是否敏感

l 是否可更新

 

con.createSttement():生成的结果集:不滚动、不敏感、不可更新!

con.createStatement(int,int)

第一个参数:

l ResultSet.TYPE_FORWARD_ONLY:不滚动结果集;

l ResultSet.TYPE_SCROLL_INSENSITIVE:滚动结果集,但结果集数据不会再跟随数据库而变化;

l ResultSet.TYPE_SCROLL_SENSITIVE:滚动结果集,但结果集数据不会再跟随数据库而变化;

第二个参数:

CONCUR_READ_ONLY:结果集是只读的,不能通过修改结果集而反向影响数据库;

l CONCUR_UPDATABLE:结果集是可更新的,对结果集的更新可以反向影响数据库。

 

 

 

上面方法分为两类,一类用来判断游标位置的,另一类是用来移动游标的。如果结果集是不可滚动的,那么只能使用next()方法来移动游标,而beforeFirst()afterLast()first()last()previous()relative()方法都不能使用!!!

结果集是否支持滚动,要从Connection类的createStatement()方法说起。也就是说创建的Statement决定了使用Statement创建的ResultSet是否支持滚动。

Statement createStatement(int resultSetType, int resultSetConcurrency)

resultSetType的可选值:

l ResultSet.TYPE_FORWARD_ONLY:不滚动结果集;

l ResultSet.TYPE_SCROLL_INSENSITIVE:滚动结果集,但结果集数据不会再跟随数据库而变化;

l ResultSet.TYPE_SCROLL_SENSITIVE:滚动结果集,但结果集数据不会再跟随数据库而变化;

 

可以看出,如果想使用滚动的结果集,我们应该选择TYPE_SCROLL_INSENSITIVE!其实很少有数据库驱动会支持TYPE_SCROLL_SENSITIVE的特性!通常我们也不需要查询到的结果集再受到数据库变化的影响。

 

resultSetConcurrency的可选值:

CONCUR_READ_ONLY:结果集是只读的,不能通过修改结果集而反向影响数据库;

l CONCUR_UPDATABLE:结果集是可更新的,对结果集的更新可以反向影响数据库。

 

通常可更新结果集这一“高级特性”我们也是不需要的! 

 

获取滚动结果集的代码如下:

Connection con = …

Statement stmt = con.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, CONCUR_READ_ONLY);

String sql = …//查询语句

ResultSet rs = stmt.executeQuery(sql);//这个结果集是可滚动的

 

PreparedStatement介绍以及sql防攻击

 

 

package cn.itcast.demo3;

 

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
/*
* preapredStatement
* 防 SQL 攻击
* @author cxf
*/
import java.sql.ResultSet;
import java.sql.Statement;

 

import org.junit.Test;

 


/*
* preapredStatement
* 防 SQL 攻击
* @author cxf
*/
public class demo3 {
/*
* 登录
* 使用username和password 去查询数据库
* 若查不出结果,说明用户名或密码错误,返回false
*/
public boolean login(String username, String passwords ) throws Exception{
/*
* 1、得到Connection对象
* 2、得到Statmetement
* 3、得到ResultSet
* 4、rs.next()发挥的是什么。我们就返回什么
*/
//准备四大参数
String driverClassName = "com.mysql.jdbc.Driver";
String url = "jdbc:mysql://localhost:3306/mydb";
String mysqlUsername="root";
String mysqlPassword="";
//加载驱动类
Class.forName(driverClassName);
//得到connection 对象(
Connection con = (Connection) DriverManager.getConnection(url,mysqlUsername,mysqlPassword);
//得到Statement
Statement stmt = con.createStatement();
//给出sql语句,调用Stmt的executeQuery()得到ResultSet
String sql = "select * from t_eser where username =\'" + username + "\' and passwords = \'"+ passwords +"\'";

ResultSet rs = stmt.executeQuery(sql);
return rs.next();

}
@Test
public void fun1() throws Exception {
boolean bool = login("wangwu","123");
System.out.println(bool);
}

 

/*
*
* sql防攻击
*
*
*/
public boolean login2(String username, String passwords ) throws Exception{
/*
* 1、得到Connection对象
* 2、得到Statmetement
* 3、得到ResultSet
* 4、rs.next()发挥的是什么。我们就返回什么
*/
//准备四大参数
String driverClassName = "com.mysql.jdbc.Driver";
String url = "jdbc:mysql://localhost:3306/mydb";
String mysqlUsername="root";
String mysqlPassword="";
//加载驱动类
Class.forName(driverClassName);
//得到connection 对象(
Connection con = (Connection) DriverManager.getConnection(url,mysqlUsername,mysqlPassword);

///////////////////////////////////////////////////////
///////////////////////////////////////////////////////

/*
* 得到PreparedStatement
* 给出sql模版:所有的参数 使用?来替代
* 调用Connection方法得到preparedStatement
*/
String sql = "select * from t_eser where username = ? and passwords = ?";
PreparedStatement pstmt = con.prepareStatement(sql);
/*
* 为参数赋值
*/
pstmt.setString(1, username);//给第一个问号赋值。值为username
pstmt.setString(2, passwords); //给第一个问号赋值。值为password
ResultSet rs = pstmt.executeQuery();
return rs.next();

}
@Test
public void fun2() throws Exception {
String username ="zhangsan";
String passwords ="123";
boolean bool= login2(username,passwords);
System.out.println(bool);

 

}
}

 

分类:

技术点:

相关文章: