JDBC简介
Java DataBase Connectivity是Java和数据库之间的一个桥梁,是规范而不是实现。
实例详解
相对简单,用实例的方式进行解释。
1.首先创建工具类,进行JDBC连接。
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
public class DbUtil{
public static final String URL = "jdbc:mysql://localhost:3306/member";
public static final String USER = "user";
public static final String PASSWORD = "123456";
private static Connection conn = null;
static{
try{
//1.加载驱动程序
Class.forName("com.mysql.jdbc.Driver");
//2.获得数据库连接
conn = DriverManager.getConnection(URL, USER, PASSWORD);
}catch (ClassNotFoundException e){
e.printStackTrace();
}catch (SQLException e){
e.printStackTrace();
}
}
public static Connection getConnection(){
return conn;
}
}
2.创建实体类
public class Member {
private Long id;
private String name;
private Integer sex; //0女,1男
private Date birthday;
private String email;
private String mobile;
private Long create_user;
private Long update_user;
private Date create_date;
private Date update_date;
private Integer is_deleted;
//get、set方法
}
3.JDBC进行ACID操作
注:1)PreparedStatement和Statement的区别?
PreparedStatement通过Connection对象的prepareStatement(String sql)方法实例化,允许用?表示可变动参数,后续通过PreparedStatement对象的setString(int index, String value)(不止setString,int、date、Long等均可,后面的value类型相应变化)。
Statement通过Connection对象的createStatement()方法实例化,语句及参数固定不可变。
注:与Statement相比,①PreparedStatement 接口代表预编译的语句,它主要的优势在于可 以减少 SQL 的编译错误并增加 SQL 的安全性(减少 SQL 注射攻击的可能性);②PreparedStatement 中的 SQL 语句是可以带参数的,避免了用字符串连接拼接 SQL 语句的麻烦和不安全;③当批量处理 SQL 或频繁执行相同的查询时,PreparedStatement 有明显的性 能上的优势,由于数据库可以将编译优化后的 SQL 语句缓存起来,下次执行相同结构的语句时就会很快(不用再次编译和生成执行计划)。
2)execute和executeUpdate方法的区别?
两者均可执行更新、插入、删除,但是execute可以执行查询(executeUpdate不可以执行查询)
execute的结果类型是boolean,true表示执行select,false表示执行的是insert、update、delete。可以通过getResult把结果取出来。
executeUpdate的返回值是int,表示有多少条数据受到了影响。
//用户_DAO层(ACID)
public class MemberDAO {
/**
* 增加
* @param member
* @throws SQLException
*/
public void addMember(Member member) throws SQLException {
//获取连接
Connection conn = DbUtil.getConnection();
//SQL语句
String sql = "INSERT INTO member(`name`,sex,birthday,email,mobile," +
"create_user,update_user,create_date,update_date,is_deleted)" +
" VALUES(?,?,?,?,?,?,?, now(), now(), ?)";
//预编译
PreparedStatement ptmt = conn.prepareStatement(sql);
//传参(索引是从1开始的)
ptmt.setString(1, member.getName());
ptmt.setInt(2, member.getSex());
ptmt.setDate(3, new Date(member.getBirthday().getTime())); //java.util.Date需要转为java.sql.Date
ptmt.setString(4, member.getEmail());
ptmt.setString(5, member.getMobile());
ptmt.setLong(6, member.getCreate_user());
ptmt.setLong(7, member.getUpdate_user());
ptmt.setInt(8, member.getIs_deleted());
//执行
ptmt.execute();
}
/**
* 更新
*/
public void updateMember(Member member) throws SQLException {
//获取连接
Connection conn = DbUtil.getConnection();
//SQL语句
String sql = "UPDATE member " +
"set name=?,sex=?,birthday=?,email=?,mobile=?," +
"update_user=?,update_date=now(),is_deleted=?" +
" where id=?";
//预编译
PreparedStatement ptmt = conn.prepareStatement(sql);
//传参
ptmt.setString(1, member.getName());
ptmt.setInt(2, member.getSex());
ptmt.setDate(3, new Date(member.getBirthday().getTime())); //java.util.Date需要转为java.sql.Date
ptmt.setString(4, member.getEmail());
ptmt.setString(5, member.getMobile());
ptmt.setLong(6, member.getUpdate_user());
ptmt.setInt(7, member.getIs_deleted());
ptmt.setLong(8, member.getId());
//执行
ptmt.execute(); //execute中,true表示执行select,false表示执行的是insert、update、delete
//可以通过getResult把结果取出来
//executeUpdate的返回值是int,表示有多少条数据受到了影响
}
/**
* 查询
* @return
* @throws SQLException
*/
public List<Member> query() throws SQLException{
Connection conn = DbUtil.getConnection();
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery("SELECT `name`,sex FROM member");
List<Member> members = new ArrayList<>();
Member member = null;
while(rs.next()){
member = new Member();
member.setName(rs.getString("name"));
member.setSex(rs.getInt("sex"));
members.add(member);
}
return members;
}
}