发表于: 2017-06-13 21:01:19

2 1220




java




我今天学习了executeexecuteUpdate用了两种办法来实习增删改查,其中executeUpdate不能实现查询工作。

还学习了 StatementPreparedStatement

 Statement一样,PreparedStatement也是用来执行sql语句的
与Statement不同的是,需要根据sql语句创建PreparedStatement,PreparedStatement还能社参数指定值,可读性高,防SQL注入

以下用Statement实现的增删改查

添加数据

package jdbc;

import java.sql.*;

/**
* Created by PC on 2017/6/13.
*/
public class affair {
public static void main(String[] args){
try{
Class.forName( "com.mysql.jdbc.Driver" );
} catch(ClassNotFoundException e){
e.printStackTrace();
}
try (Connection c = DriverManager.getConnection( "jdbc:mysql://127.0.0.1:3306/db1?characterEnconding=UTF-8&useSSL=false","root","luozeying" );
Statement s = c.createStatement();) {


String sql1 = "insert into table1 VALUES (null,null,null,null,null,null,null,null,null,null,null,null,null)";
s.execute( sql1 );

}catch (SQLException e){
e.printStackTrace();
}

}
}

删除数据只要更改sql语句即可实现了

String sql = "delete from table1 where id = 22";

更改数据也是一样的

String sql = "update from table1 where id = 22";//这里我在实现的时候经常把update打成updata导致语句错误,无法run



接下来是查询语句,查询语句和增删改查不一样

package jdbc;

import java.sql.*;

public class TestJDBC {
public static void main(String[] args) {

try {
Class.forName( "com.mysql.jdbc.Driver" );
} catch (ClassNotFoundException e) {
e.printStackTrace();
}

try (
Connection c = DriverManager.getConnection(
"jdbc:mysql://127.0.0.1:3306/db1?characterEncoding=UTF-8&useSSL=false", "root", "luozeying"
               );
Statement s = c.createStatement();
) {
String sql = "SELECT * from table1";
ResultSet rs = s.executeQuery( sql );
while (rs.next()){
String id = rs.getString( "id" );
long updata_at = rs.getLong( 2);
String carate_ay = rs.getString( 3 );
String name = rs.getString( 4 );
String qq = rs.getString(5);
String jobs = rs.getString( 6 );
String join_time = rs.getString(7);
String school = rs.getString(8);
String online_time = rs.getString(9);
String data_url = rs.getString(10);
String declaration = rs.getString(11);
String teacher = rs.getString(12);
String sources = rs.getString( 13 );
System.out.printf("t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s", id,updata_at,
carate_ay,name,qq,jobs,join_time,school,online_time,
data_url,declaration,teacher,sources);

//在这里发现输出数据的时候发现自己的对应的字段选择关系一直错误,无法run,在这里纠结了很长时间。最后师兄告诉我是字段不对应无法识别导致的。修改后成功

           }


s.execute( sql );

} catch (SQLException e) {
e.printStackTrace();
}
}
}

预编译PreparedStatement

package jdbc;

import java.sql.*;

/**
* Created by PC on 2017/6/13.
*/
public class test4 {
public static void main(String [] args) {

try {
           Class.forName( "com.mysql.jdbc.Driver" );
       } catch (ClassNotFoundException e ){
           e.printStackTrace();
       }

       String sql = "insert into table1 values(null,?,?,?,?,?,?,?,?,?,?,?,?)";
try (Connection c = DriverManager.getConnection( "jdbc:mysql://127.0.0.1:3306/db1?characterEncoding=UTF-8&useSSL=false" +
"","root","luozeying" );
            Statement s = c.createStatement();
            PreparedStatement ps = c.prepareStatement( sql );
       ){
           String sql0 = "insert into table1 VALUES (null,null,null,null,null,null,null,null,null,null,null,null,null)";
           s.execute( sql0 );

           ps.setString( 1,null );   //这里最难的是是插入语句的时候不知道怎么插入,我插入语句的时候VALUES打成VALUSE,导致一致不
           ps.setString( 2,null );   //能run成功,还一直在改null加单引号,以为这是字符串,还去修改表字段类型,最后对照别人   
           ps.setString( 3,null);     //代码才发现是这个字打错了
           ps.setString( 4,null );
           ps.setString( 5,null );
           ps.setString( 6,null );
           ps.setString( 7,null );
           ps.setString( 8,null );
           ps.setString( 9,null );
           ps.setString( 10, null );
           ps.setString( 11,null );
           ps.setString( 12,null );
           ps.execute();



       } catch (SQLException e) {
           e.printStackTrace();
       }
   }
}

executeexecuteUpdate

package jdbc;

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

/**
* Created by PC on 2017/6/13.
*/
public class TestExecute {
public static void main(String [] args){
try{
Class.forName( "com.mysql.jdbc.Driver" );
} catch (ClassNotFoundException e){
e.printStackTrace();
}
try(Connection c = DriverManager.getConnection( "jdbc:mysql://127.0.0.1:3306/db1?achracterEncoding=UTF-8&useSSL=false","root","luozeying" );
Statement s = c.createStatement();){

String sqlInsert = "insert into table2 values(null,'的','的','的','的','的','的','的','的','的','的','的','的')";


s.execute(sqlInsert );

s.executeUpdate( sqlInsert );//在这段代码执行后并没有错,但是一开始发现一个奇怪的问题,执行了两次添加


}catch (SQLException e){
e.printStackTrace();
}
}
}


明天计划的事情学习ORM和在复习一次DAO编写


遇到的问题:


         1:数据库与java字段对应类型问题

在图中,我试图把表中的数据全部打印出来,run的时候开始是下面System.out.printf ("t%s");不知道什么意思,以为随便填就好了,但是run不成功。并且的我的String teacher = rs.gerString(2);也是错的。因为我的表里是出了ID,基本是varcher类型的字段,我用的是long型去格式化输出。

Long teacher = rs.gerLong(12); 所以一直报错,两个错误点都报出sql语句错误的信息。

      最后在师兄群里面把我的代码,和表里字段类型发出去,师兄们就告诉我字段类型不对应的原因才会这样。所以我吧Long型修改为String就成功了。

    2:在想看executeexecuteUpdate 区别的时候,发现执行下面的添加语句时,表里面会有两条数据,怎么样都弄不好。不知道什么原因。

最后无法搞定,询问师兄得知executeexecuteUpdate 是执行了两次命令,要删除一条就可以。一个s.execute(sqlInsert);是执行一次sql添加数据的意识,然后在代码里面我有另外一个s.executeUpdate(sqlInsert);所以会执行两次,导致我在表中不管怎么样都会添加两条数据的原因


     3:System.out.printf和System.out.println的区别,把printf想象成println,程序无法run

 


 最后在百度找到原因,我那样的是叫格式化输出,不叫打印,所以错误了。不能成功,更改后就可以






返回列表 返回列表
评论

    分享到