statement和prepareedStatement两者之间的问题
statement:利用statement进行sql数据传输时,往往会造成sql注入问题,但是使用prepareedStatement可以防止sql注入问题,并且prepareedStatement继承statement接口。
prepareedStatement:
1.防止sql注入问题。
2.对于频繁变化的sql语句,Statement要进行频繁的编译,有可能造成缓冲区溢出。
3.输入参数的值在 SQL 语句创建时未被指定。并且该语句为每个 输入 参数保留一个问号(“?”)作为占位符。每个问号的值必须在该语句执行之前,通过适当的setXXX 方法来提供。
4.数据库和驱动可以对PreparedStatement进行优化(只有在相关联的数据库连接没有关闭的情况下有效)。所以PreparedStatement的执行效率要比Statement的高
日期类型的操作
数据库中用的是DateTime或其他日期类型,实体类中,对应的是java.util.Date 类型
在Statement 中,用的是 java.sql.Date 把实体类中的日期类型,传给 Statement 的时候,要把 util.Date 转成 sql.Datestm.setDate(4, new java.sql.Date(stu.getBirthday().getTime()));
java.sql.Time 包含时间,又不包含日期在存的时候这么写: 型stm.setTime(4, new java.sql.Time(stu.getBirthday().getTime()));在取的时候这么写:user.setBirthday(rs.getTime("birthday"));
即想要时间,又要日期 可以使用java.sql.Timestamp 类在存的时候这么写:stm.setTimestamp(4, new java.sql.Timestamp(stu.getBirthday().getTime()));在取的时候这么写:stu.setBirthday(rs.getTimestamp("birthday"));
上例子:首先来个工具类:
package Practise;
import static org.hamcrest.CoreMatchers.nullValue;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
/**
* jdbc工具类:
* @author 曹
*
*/
public class JdbcUtil {
//驱动类名称
private static String driver="java.sql.DriverManager";
//数据库的路径jdbc:mysql://137.0.0.1:3306/数据库名称
private static String url="jdbc:mysql://127.0.0.1:3306/blog";
//数据库用户名
private static String userName="root";
//数据库密码
private static String password="root";
/**
* 类加载时加载驱动,高版本可以省略
*/
static {
try {
Class.forName(driver);
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
/**
* 创建连接并且获取连接
* @return:返回一个数据库连接对象
*/
public static Connection conn() {
Connection conn=null;
try {
conn=DriverManager.getConnection(url, userName, password);
} catch (SQLException e) {
e.printStackTrace();
}
return conn;
}
/**
* 数据库关闭
* @param conn:连接对象
* @param st:传输数据集
* @param rs:返回结果集
*/
public static void close(Connection conn,Statement st,ResultSet rs) {
if(conn!=null) {
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}else {
conn=null;
}
if(st!=null) {
try {
st.close();
} catch (SQLException e) {
e.printStackTrace();
}
}else {
st=null;
}
if(rs!=null) {
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
}else {
rs=null;
}
}
/**
* 数据库关闭
* @param conn:连接对象
* @param st:传输数据集
*/
public static void close(Connection conn,Statement st) {
if(conn!=null) {
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}else {
conn=null;
}
if(st!=null) {
try {
st.close();
} catch (SQLException e) {
e.printStackTrace();
}
}else {
st=null;
}
}
}
其次:一个简单的实体类:
package Practise;
import java.io.Serializable;
import java.util.Date;
/**
* 这是一个Javabeen类
* @author 曹
*
*/
public class Student implements Serializable {
private int sno;
private String sname;
private int age;
private String sex;
private String password;
private String birthday;
public Student() {
}
public Student(int sno, String sname, int age, String sex, String password, String birthday) {
this.sno = sno;
this.sname = sname;
this.age = age;
this.sex = sex;
this.password = password;
this.birthday = birthday;
}
public int getSno() {
return sno;
}
public void setSno(int sno) {
this.sno = sno;
}
public String getSname() {
return sname;
}
public void setSname(String sname) {
this.sname = sname;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getBirthday() {
return birthday;
}
public void setBirthday(String birthday) {
this.birthday = birthday;
}
@Override
public String toString() {
return "Student [sno=" + sno + ", sname=" + sname + ", age=" + age + ", sex=" + sex + ", password=" + password
+ ", birthday=" + birthday + "]";
}
}
最后:查询所有:
package Practise;
import static org.hamcrest.CoreMatchers.nullValue;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
public class JdbcPractise {
public static void main(String[] args) {
List<Student> list =selectAll();
if(list.size()>0) {
for(int i=0;i<list.size();i++) {
System.out.println(list.get(i));
}
}else {
System.out.println("数据不存在");
}
}
/**
* 查询所有:
* @return:返回一个list集合
*/
public static List<Student> selectAll(){
List<Student> list = new ArrayList<Student>();
Connection conn=JdbcUtil.conn();
Statement st = null;
ResultSet rs = null;
Student stu=null;
try {
st=conn.createStatement();
rs=st.executeQuery("select * from student");
while(rs.next()) {
stu=new Student();
int sno = rs.getInt("sno");
String sname = rs.getString("sname");
String password = rs.getString("password");
int age=rs.getInt("age");
String sex = rs.getString("sex");
String birth = rs.getString("birth");
stu.setSno(sno);
stu.setSname(sname);
stu.setAge(age);
stu.setSex(sex);
stu.setPassword(password);
stu.setBirthday(birth);
list.add(stu);
}
} catch (SQLException e) {
e.printStackTrace();
}finally {
JdbcUtil.close(conn, st, rs);
}
return list;
}
插入:
package Practise;
import static org.hamcrest.CoreMatchers.nullValue;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
public class JdbcPractise {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.println("请输入姓名:");
String name = scanner.nextLine();
System.out.println("请输入性别");
String sex = scanner.nextLine();
System.out.println("请输入密码:");
String password = scanner.nextLine();
System.out.println("请输入出生日期");
String birth = scanner.nextLine();
System.out.println("请输入学号");
int sno = scanner.nextInt();
System.out.println("请输入年龄:");
int age = scanner.nextInt();
Student stu = new Student();
stu.setSno(sno);
stu.setSname(name);
stu.setAge(age);
stu.setSex(sex);
stu.setPassword(password);
stu.setBirthday(birth);
int result = add(stu);
if (result > 0) {
System.out.println("添加成功");
} else {
System.out.println("添加失败");
}
}
/**
* 插入:
*
* @param stu
* @return
*/
public static int add(Student stu) {
Connection conn = null;
PreparedStatement st = null;
int result = 0;
try {
conn = JdbcUtil.conn();
// 防止sql注入
st = conn.prepareStatement("insert into student(sno,sname,age,sex,password,birth) values(?,?,?,?,?,?)");
st.setInt(1, stu.getSno());
st.setString(2, stu.getSname());
st.setInt(3, stu.getAge());
st.setString(4, stu.getSex());
st.setString(5, stu.getPassword());
st.setString(6, stu.getBirthday());
result = st.executeUpdate();
} catch (SQLException e) {
e.printStackTrace();
} finally {
JdbcUtil.close(conn, st);
}
return result;
}