一、JDBC是什么?
JDBC(java database connectivity)Java数据库连接。是Java语言中用来规范客户端程序如何来访问数据库的应用程序接口,提供了诸如查询和更新数据库中数据的方法。
我们通常说的JDBC是面向关系型数据库的。
二、JDBC访问数据库需要用到的类、接口、方法?
2.1 java.sql包DriverManager类--负责加载各种不同驱动程序(Driver),并根据不同的请求,向调用者返回相应的数据库连接。 驱动程序,会将自身加载到DriverManager中去。
2.1.1数据驱动程序(Driver)— 根据所连接的数据库不同需要下载对应数据库的驱动程序。
例如:MySQL数据库----数据库驱动程序下载
mysql-connector-java-5.1.38-bin.jar
通过java的反射机制,来给DriverManager,提供被加载的数据库驱动名称。
Class.forName(“数据库驱动名称【包名+类名】”);
数据库驱动名称来自mysql-connector-java-5.1.38-bin.jar中Driver的java类的全名称。
Class.forName(“com.mysql.jdbc.Deiver”);
2.1.2向调用者返回相应的数据库连接
DriverManager类中的静态方法getConnection(url,username,password)向调用者返回相应的数据库连接
static Connection getConnection(url,username,password)
参数url —> 指定被连接的数据库位置
【jdbc:mysql://数据库服务器IP:端口/数据库名称】
参数username —> 登陆数据库服务器的用户名
参数password —> 登陆数据库服务器的密码
2.2 java.sql包Connection接口 ---> 数据库连接,负责与进行数据库间通讯,SQL执行以及事务处理都是在某个特定Connection环境中进行的。可以产生用以执行SQL的Statement。
(1) 产生用以执行SQL的Statement。
用以执行SQL查询和更新(针对静态SQL语句和单次执行)]
Statement createStatement()
select * from t_user where uid=12;[需要给sql拼接参数值]
(2) 产生用以执行SQL的PreparedStatement。
用以执行包含动态参数的SQL查询和更新(在服务器端编译,允许重复执行以提高效率)
PreparedStatement prepartatement(Sql)
参数sql—包含动态参数的SQL语句
select * from t_user where uid=?;【需要给sql动态传递参数值】
?表示 ---占位符
2.3 java.sql包Statement接口---用以执行SQL查询和更新(针对静态SQL语句和单次执行)
(1) 以执行SQL更新【insert / update /delete】
int executeUpdate(SQL)
参数SQL---[insert / update /delete]字符串类型的sql语句。
(2) 以执行SQL查询【select】
ResultSet executeQuery(SQL)
参数SQL---[select]字符串类型的sql语句。
2.4 java.sql包PreparedStatement接口 ---> 用以执行包含动态参数的SQL查询和更新(在服务器端编译,允许重复执行以提高效率) 以执行SQL更新【insert / update /delete】
int executeUpdate()
以执行SQL查询【select】
ResultSet executeQuery()
注意:PreparedStatement需要执行的sql语句
以执行SQL更新【insert / update /delete】
int executeUpdate()
以执行SQL查询【select】
ResultSet executeQuery()
注意:PreparedStatement需要执行的sql语句
(1) sql语句是在创建PreparedStatement对象的时候传入执行,不是在调用executeUpdate()/executeQuery()的时候传入。
(2) PreparedStatement对象所执行的sql语句中有“?【占位符】”
有一组填补sql语句占位符的方法
setInt(参数1,参数2) int--int
setLong(参数1,参数2) long---bigint
setDouble(参数1,参数2) double--double
setString(参数1,参数2) String--varchar/char
.....................
参数1---SQL语句中“?”的位置【从1开始】
参数2---SQL语句中“?”具体数据值
2.5.java.sql包ResultSet接口 --- 数据库结果集的数据表,通常通过执行查询数据库的语句生成。
ResultSet 对象具有指向其当前数据行的指针。最初,指针被置于第一行之前。next 方法将指针移动到下一行;因为该方法在 ResultSet 对象中没有下一行时返回 false,所以可以在 while 循环中使用它来迭代结果集。
默认的 ResultSet 对象不可更新,仅有一个向前移动的指针。因此,只能迭代它一次,并且只能按从第一行到最后一行的顺序进行。
boolean next() —> 将指针移动到下一行;因为该方法在 ResultSet 对象中没有下一行时返回 false。在 while 循环中使用它来迭代结果集。
由于通过next方法将指针移动到下一行,我们现在就可以取出指针指向的当前行的数据值。要获取当前行中保存的数据值,就需要一列一列的取出数据值,所以ResultSet会有一组获取指定列数据的方法。
getXXXX(int colindex)—int colindex[当前需要获取数据值的列在当前行中的位置【从0开始】]
getXXXX(String colname)–String colname[当前需要获取数据值的列名称]
1 [int]–[id] | Zhangsan [varchar]–[name] | 23 [int]–[age] |
---|---|---|
2[int]–[id] | Lisi [varchar]–[name] | 24 [int]–[age] |
3[int]–[id] | Wangwu [varchar]–[name] | 25 [int]–[age] |
int id=ResultSet对象.getInt(0);
int id=ResultSet对象.getInt(“id”);
//id==1
String name=ResultSet对象.getString(1);
String name=ResultSet对象.getString(“name”);
//name==zhangsan
int age=ResultSet对象.getInt(2);
int age=ResultSet对象.getInt(“age”);
//age==23
3.JDBC访问数据库的流程
实例1:实现信息的增删改查【Statement】
- 创建数据库表
create table t_user(
user_id int primary key auto_increment,
user_name varchar(20),
user_age int,
user_sex bit,
user_address varchar(30),
user_day datetime
);
- 创建一个java工程
- 导入数据库驱动包
- 创建java实体类
package com.wangxing.bean;
import java.util.Date;
/**
* 保存用户信息的java实体类
* @author Administrator
*
*/
public class UserBean {
private int userid;
private String username;
private int userage;
private boolean usersex;
private String useraddress;
private Date userday;
public int getUserid() {
return userid;
}
public void setUserid(int userid) {
this.userid = userid;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public int getUserage() {
return userage;
}
public void setUserage(int userage) {
this.userage = userage;
}
public boolean isUsersex() {
return usersex;
}
public void setUsersex(boolean usersex) {
this.usersex = usersex;
}
public String getUseraddress() {
return useraddress;
}
public void setUseraddress(String useraddress) {
this.useraddress = useraddress;
}
public Date getUserday() {
return userday;
}
public void setUserday(Date userday) {
this.userday = userday;
}
}
- 创建连接数据库的java类
package com.wangxing.db;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
/**
* 数据库连接类
* @author Administrator
*
*/
public class DBConnection {
//定义数据库驱动名称
private static final String DRIVER_NAME="";
//定义数据库url
private static final String URL="jdbc:mysql://127.0.0.1:3306/test";
//定义数据库用户名
private static final String USERNAME="root";
//定义数据库密码
private static final String PASSWORD="123456";
//通过静态代码块加载数据库驱动
static {
try {
Class.forName(DRIVER_NAME);
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
/**
* 得到数据库连接
*/
public static Connection getConnection() {
Connection conn=null;
try {
conn=DriverManager.getConnection(URL, USERNAME, PASSWORD);
} catch (SQLException e) {
e.printStackTrace();
}
return conn;
}
}
6.创建数据库访问类
package com.wangxing.dbacsess;
import java.sql.Connection;
import java.sql.Date;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;
import com.wangxing.bean.UserBean;
import com.wangxing.db.DBConnection;
/**
* 数据库用户信息的访问类
* @author Administrator
*
*/
public class UserAcesess {
/**
* 添加用户信息
*/
public boolean insertUser(UserBean userbean) {
boolean flag=false;
try {
Connection conn=DBConnection.getConnection();
String insertsql="insert into t_user values(null,'"+userbean.getUsername()+
"',"+userbean.getUserage()+","+userbean.isUsersex()+
",'"+userbean.getUseraddress()+"','"+userbean.getUserday()+"');";
Statement statement=conn.createStatement();
int temp=statement.executeUpdate(insertsql);
if(temp>0) flag=true;
statement.close();
conn.close();
}catch(Exception e){
e.printStackTrace();
}
return flag;
}
/**
* 修改用户信息
*/
public boolean updateUser(UserBean userbean) {
boolean flag=false;
try {
Connection conn=DBConnection.getConnection();
String updatesql="update t_user set user_name='"+userbean.getUsername()+
"',user_age="+userbean.getUserage()+
",user_sex="+userbean.isUsersex()+
",user_address='"+userbean.getUseraddress()+
"',user_day='"+userbean.getUserday()+
"' where user_id="+userbean.getUserid()+";";
Statement statement=conn.createStatement();
int temp=statement.executeUpdate(updatesql);
if(temp>0) flag=true;
statement.close();
conn.close();
}catch(Exception e){
e.printStackTrace();
}
return flag;
}
/**
* 删除用户信息
*/
public boolean deleteUser(int userid) {
boolean flag=false;
try {
Connection conn=DBConnection.getConnection();
String deletesql="delete from t_user where user_id="+userid+";";
Statement statement=conn.createStatement();
int temp=statement.executeUpdate(deletesql);
if(temp>0) flag=true;
statement.close();
conn.close();
}catch(Exception e){
e.printStackTrace();
}
return flag;
}
/**
* 查询所有用户信息
*/
public List<UserBean> selectUser() {
List<UserBean> userlist=null;
try {
Connection conn=DBConnection.getConnection();
String selectsql="select * from t_user;";
Statement statement=conn.createStatement();
ResultSet rs=statement.executeQuery(selectsql);
userlist=new ArrayList<UserBean>();
while(rs.next()) {
int userid=rs.getInt("user_id");
String username=rs.getString("user_name");
int userage=rs.getInt("user_age");
boolean usersex=rs.getBoolean("user_sex");
String useraddress=rs.getString("user_address");
Date userday=rs.getDate("user_day");
UserBean user=new UserBean();
user.setUserid(userid);
user.setUsername(username);
user.setUserage(userage);
user.setUsersex(usersex);
user.setUseraddress(useraddress);
user.setUserday(userday);
userlist.add(user);
}
rs.close();
statement.close();
conn.close();
}catch(Exception e){
e.printStackTrace();
}
return userlist;
}
/**
* 根据userid查询用户信息
*/
public UserBean selectUserById(int userid) {
UserBean user=null;
try {
Connection conn=DBConnection.getConnection();
String selectsql="select * from t_user where user_id="+userid+";";
Statement statement=conn.createStatement();
ResultSet rs=statement.executeQuery(selectsql);
if(rs.next()) {
int id=rs.getInt("user_id");
String username=rs.getString("user_name");
int userage=rs.getInt("user_age");
boolean usersex=rs.getBoolean("user_sex");
String useraddress=rs.getString("user_address");
Date userday=rs.getDate("user_day");
user=new UserBean();
user.setUserid(id);
user.setUsername(username);
user.setUserage(userage);
user.setUsersex(usersex);
user.setUseraddress(useraddress);
user.setUserday(userday);
}
rs.close();
statement.close();
conn.close();
}catch(Exception e){
e.printStackTrace();
}
return user;
}
}
实例2:实现信息的增删改查【PreparedStatement】
package com.wangxing.dbacsess;
import java.sql.Connection;
import java.sql.Date;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;
import com.wangxing.bean.UserBean;
import com.wangxing.db.DBConnection;
/**
* 数据库用户信息的访问类
* @author Administrator
*
*/
public class UserAcesess {
/**
* 添加用户信息
*/
public boolean insertUser(UserBean userbean) {
boolean flag=false;
try {
Connection conn=DBConnection.getConnection();
String insertsql="insert into t_user values(null,?,?,?,?,?);";
PreparedStatement statement=conn.prepareStatement(insertsql);
statement.setString(1, userbean.getUsername());
statement.setInt(2, userbean.getUserage());
statement.setBoolean(3, userbean.isUsersex());
statement.setString(4, userbean.getUseraddress());
statement.setDate(5, userbean.getUserday());
int temp=statement.executeUpdate();
if(temp>0) flag=true;
statement.close();
conn.close();
}catch(Exception e){
e.printStackTrace();
}
return flag;
}
/**
* 修改用户信息
*/
public boolean updateUser(UserBean userbean) {
boolean flag=false;
try {
Connection conn=DBConnection.getConnection();
String updatesql="update t_user set user_name=?,user_age=?,user_sex=?,user_address=?,user_day=? where user_id=?;";
PreparedStatement statement=conn.prepareStatement(updatesql);
statement.setString(1, userbean.getUsername());
statement.setInt(2, userbean.getUserage());
statement.setBoolean(3, userbean.isUsersex());
statement.setString(4, userbean.getUseraddress());
statement.setDate(5, userbean.getUserday());
statement.setInt(6, userbean.getUserid());
int temp=statement.executeUpdate();
if(temp>0) flag=true;
statement.close();
conn.close();
}catch(Exception e){
e.printStackTrace();
}
return flag;
}
/**
* 删除用户信息
*/
public boolean deleteUser(int userid) {
boolean flag=false;
try {
Connection conn=DBConnection.getConnection();
String deletesql="delete from t_user where user_id=?;";
PreparedStatement statement=conn.prepareStatement(deletesql);
statement.setInt(1,userid);
int temp=statement.executeUpdate();
if(temp>0) flag=true;
statement.close();
conn.close();
}catch(Exception e){
e.printStackTrace();
}
return flag;
}
/**
* 查询所有用户信息
*/
public List<UserBean> selectUser() {
List<UserBean> userlist=null;
try {
Connection conn=DBConnection.getConnection();
String selectsql="select * from t_user;";
PreparedStatement statement=conn.prepareStatement(selectsql);
ResultSet rs=statement.executeQuery();
userlist=new ArrayList<UserBean>();
while(rs.next()) {
int userid=rs.getInt("user_id");
String username=rs.getString("user_name");
int userage=rs.getInt("user_age");
boolean usersex=rs.getBoolean("user_sex");
String useraddress=rs.getString("user_address");
Date userday=rs.getDate("user_day");
UserBean user=new UserBean();
user.setUserid(userid);
user.setUsername(username);
user.setUserage(userage);
user.setUsersex(usersex);
user.setUseraddress(useraddress);
user.setUserday(userday);
userlist.add(user);
}
rs.close();
statement.close();
conn.close();
}catch(Exception e){
e.printStackTrace();
}
return userlist;
}
/**
* 根据userid查询用户信息
*/
public UserBean selectUserById(int userid) {
UserBean user=null;
try {
Connection conn=DBConnection.getConnection();
String selectsql="select * from t_user where user_id=?;";
PreparedStatement statement=conn.prepareStatement(selectsql);
statement.setInt(1, userid);
ResultSet rs=statement.executeQuery();
if(rs.next()) {
int id=rs.getInt("user_id");
String username=rs.getString("user_name");
int userage=rs.getInt("user_age");
boolean usersex=rs.getBoolean("user_sex");
String useraddress=rs.getString("user_address");
Date userday=rs.getDate("user_day");
user=new UserBean();
user.setUserid(id);
user.setUsername(username);
user.setUserage(userage);
user.setUsersex(usersex);
user.setUseraddress(useraddress);
user.setUserday(userday);
}
rs.close();
statement.close();
conn.close();
}catch(Exception e){
e.printStackTrace();
}
return user;
}
}
Statement与PreparedStatement的区别
Statement接口 | PreparedStatement接口 | |
---|---|---|
继承关系 | 无 | 是Statement接口的子接口 |
使用范围 | 当执行相似SQL(结构相同,具体值不同)语句的次数比较少 | 当执行相似sql语句的次数比较多(例如用户登陆,对表频繁操作…)语句一样,只是具体的值不一样,被称为动态SQL |
优点 | 语法简单 | 语句只编译一次,减少编译次数。提高了安全性(阻止了SQL注入) |
缺点 | 采用硬编码效率低,安全性较差 | 执行非相似SQL语句时,速度较慢 |
原理 | 硬编码,每次执行时相似SQL都会进行编译 | 相似SQL只编译一次,减少编译次数 |