JDBC
一、statemnet
会存在sql注入问题
会涉及到安全问题,一般情况下不会使用
除非一些需要sql注入的业务
第一步 建立驱动 运用反射机制加载
Class.forName("com.mysql.cj.jdbc.Driver");//不同的mysql版本对应括号的内容的不相同
//该驱动只需要加载一次,在Java测试代码中,我们可以加@Before注解,让它执行在所有test代码之前
第二步 建立连接
Connection connection = DriverManager.getConnection(
"jdbc:mysql://localhost:3306/wyp",
"root", //mysql账号
"12345678" //mysql密码
);
此时建立java 到数据库的连接,连接的通道已经打开了
第三步 执行sql语句 //此处statement preparestatement不太一样
prepare代表预先的意思
statemen对象用于Java向mysql发送一个sql
当然,我们应该先创建一个statemnet对象
Statement statement = connection.createStatement();
insert例子
String sql="INSERT INTO t_jdbc(name,password) VALUE ('nmsl','wsnd')";
//在字符串中拼接字符串要加单引号
int rows=statement.executeUpdate(sql,Statement.RETURN_GENERATED_KEYS);//rows代表修改的条数
//Statement.RETURN_GENERATED_KEYS,加这个的原因,是要返回一个自增长的primary key,必须自增长,不然无效
此时sql已经成功执行,当然你的sql必须正确
那么为了验证Statement.RETURN_GENERATED_KEYS
我们可以获得查询结果集来看看
//4.处理结果集
// if (rows>0){
// ResultSet rs = statement.getGeneratedKeys();//因为dml语句很少使用查询结果集,我们就采用获取主键的方法
// while(rs.next()){
// Integer id =rs.getInt(1); //这个1代表的是第一个字段的意思
//
// }
select 例子
String sql = "SELECT id, name, password FROM t_jdbc";
ResultSet rs = statement.executeQuery(sql);
while (rs.next()) {//4.处理结果集
Integer id =rs.getInt(1);//代表第一个字段,代表的sql select后面的顺序
String name=rs.getString("name");//代表name字段
String password=rs.getString("password");//password
System.out.println("id="+id+",name="+name+",password="+password);
}
5.关闭资源
先开的后关
So,firstly,we close rs,secondly,we close statement,finally,we close connection.
//jdk 1.7之后 try(){} 当在括号里面打开资源的时候,可以不用关闭,因为他实现的接口中有自动关闭资源的方法
二、prepareStatement
使用的比较多,效率高,安全性高
String sql = "SELECT id, name, password FROM t_jdbc WHERE id=?";//?代表占位符
PreparedStatement ps = connection.prepareStatement(sql);//预先准备,创建的时候就会传入sql
ps.setInt(1,1);//1代表第一个?,后面的1代表值
rs = ps.executeQuery();//得到结果集
while (rs.next()) {//4.处理结果集
String name=rs.getString("name");//获取name字段
String password= rs.getString("password");
System.out.println("name="+name+",password="+password);
}
其他相同
//insert
ResultSet rs =null;
String sql = "INSERT INTO t_jdbc(name,password) VALUES(?,?),(?,?) ";//?代表占位符
try (Connection connection = DriverManager.getConnection( //2.建立连接 实现了closeable接口可以关闭
"jdbc:mysql://127.0.0.1:3306/wyp",
"root",
"12345678"
);
PreparedStatement ps = connection.prepareStatement(sql,Statement.RETURN_GENERATED_KEYS);//预先准备此处跟statement不同
) { //pre预处理 创建连接的时候加入sql语句 //Statement.RETURN_GENERATED_KEYS增长id,不是自增的还获取不到
ps.setString(1,"好的");//1代表第一个问好 set后面类型要一致
ps.setString(2,"hello");//2代表第二个问号
ps.setString(3,"hello");
ps.setString(4,"world");
int rows = ps.executeUpdate();//执行sql语句
System.out.println(rows);
if (rows>0){
rs = ps.getGeneratedKeys();//得到结果集
while (rs.next()) {//4.处理结果集
Integer id =rs.getInt(1);
System.out.println("id="+id);
}
}