目录
1.增、删、改
CRUD是最常见的数据库操作,即增删改查
C 增加(Create)
R 读取查询(Retrieve)
U 更新(Update)
D 删除(Delete)
在JDBC中增加,删除,修改的操作都很类似,只是传递不同的SQL语句就行了。
但是查询就不一样。
String sql = "insert into hero values(null," + "'提莫'" + "," + 313.0f + "," + 50 + ")";
基本都是这句话。
但是sql的具体内容不一样。
String sql = "delete from hero where id = 5";
String sql = "update hero set name = 'name 5' where id = 3";
之后执行:
s.execute(sql);
完整代码:
package jdbc;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
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/how2java?characterEncoding=UTF-8",
"root", "admin");
Statement s = c.createStatement();
)
{
String sql = "insert into hero values(null," + "'提莫'" + "," + 313.0f + "," + 50 + ")";
s.execute(sql);
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
2.查询
executeQuery 执行SQL查询语句
注意: 在取第二列的数据的时候,用的是rs.get(2) ,而不是get(1). 这个是整个Java自带的api里唯二的地方,即2就代表第二个。
要是查询第三列,就get(3) . 但是类型要一致。
String sql="select * from hero limit "+start+","+count;
ResultSet rs=s.executeQuery(sql);
while(rs.next())
{
int id=rs.getInt("id");
String name=rs.getString(2);
float hp=rs.getFloat(3);
int damage=rs.getInt(4);
System.out.printf("%d\t%s\t%f\t%d\n",id,name,hp,damage);
}
3.使用PreparedStatement
和 Statement一样,PreparedStatement也是用来执行sql语句的
与创建Statement不同的是,需要根据sql语句创建PreparedStatement
除此之外,还能够通过设置参数,指定相应的值
注: 这是JAVA里唯二的基1的地方。
所以,不能从0开始。
PreparedStatement有预编译机制,性能比Statement更快
PreparedStatement的优点3-防止SQL注入式攻击
而PreparedStatement使用的是参数设置,就不会有SQL注入式攻击
String name = "'盖伦' OR 1=1";
// 使用预编译Statement就可以杜绝SQL注入
ps.setString(1, name);
ResultSet rs = ps.executeQuery();
// 查不出数据出来
while (rs.next()) {
String heroName = rs.getString("name");
System.out.println(heroName);
}
4.execute与executeUpdate的区别
4.1相同点
execute与executeUpdate的相同点:都可以执行增加,删除,修改
4.2不同点:
不同1:
execute可以执行查询语句
然后通过getResultSet,把结果集取出来
executeUpdate不能执行查询语句
不同2:
execute返回boolean类型,true表示执行的是查询语句,false表示执行的是insert,delete,update等等
executeUpdate返回的是int,表示有多少条数据受到了影响
package jdbc_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;
public class jdbcteset {
public static void main(String[] args) {
// TODO Auto-generated method stub
try {
Class.forName("com.mysql.jdbc.Driver");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
String sql="insert into hero values(null,?,?,?)";
try (Connection c = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/sqltest?characterEncoding=UTF-8","root", "123456");
// 根据sql语句创建PreparedStatement
PreparedStatement s = c.prepareStatement(sql);)
{
// 不同1:execute可以执行查询语句
// 然后通过getResultSet,把结果集取出来
String sqlSelect = "select * from hero";
s.execute(sqlSelect);
ResultSet rs = s.getResultSet();
while (rs.next()) {
System.out.println(rs.getInt("id"));
}
// executeUpdate不能执行查询语句
// s.executeUpdate(sqlSelect);
// 不同2:
// execute返回boolean类型,true表示执行的是查询语句,false表示执行的是insert,delete,update等等
boolean isSelect = s.execute(sqlSelect);
System.out.println(isSelect);
// executeUpdate返回的是int,表示有多少条数据受到了影响
String sqlUpdate = "update Hero set hp = 300 where id < 100";
int number = s.executeUpdate(sqlUpdate);
System.out.println(number);
} catch ( SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}