1.JDBC是什么?
JDBC(java database connectivity)Java数据库链接。是Java语言中来贵方客户单程序如何访问数据的【关系型数据库】的应用程序接口,提供了查询更新数据库的方法。
图解:
2.JDBC访问数据库的需要用到类、接口、方法
1)java.sql包DriverManger类:
负责加载各种不同驱动程序(Driver),并根据不同的请求,向调用者返回响应的数据库链接。确定程序会将自身加载到DriverManager中去。
(1)数据驱动程序(Driver)
根据所连接的数据库不同需要下载不同对应的数据库驱动程序。
例如:mysql数据库:MySQL :: Download MySQL Connector/J (Archived Versions)
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)向调用者返回相应的数据库连接
DriverManager类中的静态方法getConnection(url,username,password)向调用者返回相应的数据库连接
static Connection getConnection(url,username,password)
参数url : 指定被连接的数据库位置
【jdbc:mysql://数据库服务器IP:端口/数据库名称】
参数username : 登陆数据库服务器的用户名
参数password : 登陆数据库服务器的密码
2)java.sql包Connection接口
数据库链接,负责与数据库间通讯,SQL执行以及事务处理都是在某个滕丁Connection环境中进行的。可以负责产生用以执行SQL的Statement。
(1)产生用以执行SQL的Statement。
用以执行SQL查询和更新(针对静态SQL语句和单次执行)
Statement createStatement()
selection * from t_user where uid = 12;[拼接字符串]
(2)产生可以执行SQL的PreparedStatement。
用以执行包含动态参数的SQL查询和更新(在服务器端编译,允许重复执行以提高效率)
PreparedStatement preparetment(sql);
参数sql :包含动态参数的SQL语句
select * from t_user where uid =?;(需要给sql动态传递参数值)
?:为占位符
(3)Java.sql包Statement接口
用以执行SQL查询和更新(针对静态SQL语句和单次执行)
int executeUpdate(sql)
参数sql:执行更新SQL【insert/delete/update】
RreusltSet executeQuery(sql)
参数sql:用于执行查询的SQL
(4)java.sql包PreparedStatement接口
用以执行包含动态参数的SQL查询和更新(在服务器端编译,允许重复执行提高效率)。
以执行SQL更新【insert/update/delete】
int executeUpdate()
执行SQL查询【select】
RreusltSet executeQuery()
注意 : PreparedStatement需要执行的sql语句
- sql语句是在创建PreparedStatement对象的时候传入执行,不是在调用executeUpdate()/executeQuery()的时候传入。
- 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语句中“?”具体数据值
(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]
通过ResultSet对象得到第一行数据值
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访问数据库的流程
例子:
SQL语句:
创建t_user表
create table t_user(
stu_id int primary key auto_increment,
stu_name varchar(10),
stu_sex bit,
stu_age int,
stu_city varchar(20)
)
Java代码:
1.创建ContentSQL类得到Conection对象
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
public class ContentSQL {
private final static String JDBCNAME = "com.mysql.jdbc.Driver"; //数据库驱动名称
private final static String MYSQLHOST = "jdbc:mysql://127.0.0.1:3306/teststudent";
private final static String SQLNAME = "root";
private final static String SQLPASS = "root";
static {
try {
Class.forName(JDBCNAME);//通过反射机制加载数据库驱动
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
public static Connection getContnet(){
Connection connection = null;
try {
connection = DriverManager.getConnection(MYSQLHOST, SQLNAME, SQLPASS);
} catch (SQLException e) {
e.printStackTrace();
}
return connection;
}
}
2.通过Connection对象执行sql语句
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
public class DBControl {
//添加数据 到 数据库
public boolean add(UserInfo stu){
boolean flag = false;
Connection connection = ContentSQL.getContnet();
try {
Statement statement = connection.createStatement();
String sql = "insert into t_user values(null,'"
+stu.getStuname()+ "',"
+stu.isIsnv()+ ","+
stu.getAge() + ",'" +
stu.getStucity()+"')";
int i = statement.executeUpdate(sql);
if (i > 0) {
flag =true;
}
statement.close();
connection.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return flag;
}
//修改数据库中的数据
public boolean updata(UserInfo stu){
boolean flag = false;
Connection connection = ContentSQL.getContnet();
try {
Statement statement = connection.createStatement();
String sql = "update t_user set stu_name='" + stu.getStuname() +"',stu_sex=" +
stu.isIsnv() + ",stu_age="+stu.getAge() +
",stu_city='" +stu.getStucity() +
"' where stu_id=" + stu.getStuid();
int i = statement.executeUpdate(sql);
if (i>0) {
flag = true;
}
statement.close();
connection.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return flag;
}
//删除数据库中的数据
public boolean detele(int stuId){
boolean flag = false;
Connection connection = ContentSQL.getContnet();
try {
Statement statement = connection.createStatement();
String sql = "delete from t_user where stu_id=" + stuId;
int i = statement.executeUpdate(sql);
if (i > 0) {
flag = true;
}
} catch (SQLException e) {
e.printStackTrace();
}
return flag;
}
//拿到数据库的信息(查询数据库)
public ArrayList<UserInfo> seleteAll(){
ArrayList<UserInfo> infos = null;
Connection connection = ContentSQL.getContnet();
try {
Statement statement = connection.createStatement();
String sql = "select * from t_user";
ResultSet resultSet = statement.executeQuery(sql);
infos = new ArrayList<UserInfo>();
while (resultSet.next()) {
int stuId = resultSet.getInt("stu_id");
String stuName = resultSet.getString("stu_name");
boolean stuSex = resultSet.getBoolean("stu_sex");
int stuAge = resultSet.getInt("stu_age");
String city = resultSet.getString("stu_city");
UserInfo stuinfo = new UserInfo(stuId, stuName, stuSex, stuAge, city);
infos.add(stuinfo);
}
statement.close();
connection.close();
} catch (SQLException e) {
e.printStackTrace();
}
return infos;
}
//查询一个学生的学生信息
public UserInfo selectOne(int id){
UserInfo info = null;
Connection connection = ContentSQL.getContnet();
try {
Statement statement = connection.createStatement();
String sql = "select * from t_user where stu_id=" + id;
ResultSet resultSet = statement.executeQuery(sql);
resultSet.next();
int stuId = resultSet.getInt("stu_id");
String stuName = resultSet.getString("stu_name");
boolean stuSex = resultSet.getBoolean("stu_sex");
int stuAge = resultSet.getInt("stu_age");
String city = resultSet.getString("stu_city");
info = new UserInfo(stuId, stuName, stuSex, stuAge, city);
statement.close();
connection.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return info;
}
}
数据库中表对应的实例类
(一个表对应一个实例类)
public class UserInfo {
private int stuid;
private String stuname;
private boolean isnv;
private int age;
private String stucity;
public UserInfo(int stuid, String stuname,boolean isnv,int age,String stucity){
this.stuid = stuid;
this.stuname = stuname;
this.isnv = isnv;
this.age = age;
this.stucity = stucity;
}
public int getStuid() {
return stuid;
}
public void setStuid(int stuid) {
this.stuid = stuid;
}
public String getStuname() {
return stuname;
}
public void setStuname(String stuname) {
this.stuname = stuname;
}
public boolean isIsnv() {
return isnv;
}
public void setIsnv(boolean isnv) {
this.isnv = isnv;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getStucity() {
return stucity;
}
public void setStucity(String stucity) {
this.stucity = stucity;
}
@Override
public String toString() {
return "stu_id = " + stuid + "\t" + "stu_name =" + stuname +"\t" + "stu_sex=" + (isnv ? "男" : "女")+ "\t" + "stu_age=" + age + "\t" + "stu_city = " + stucity;
}
}
测试主类
import java.util.ArrayList;
public class TestMain {
public static void main(String[] args) {
//添加一个人
// DBControl control = new DBControl();
// Useslist one = new Useslist(1003, "zhaoliu", true, 28, "北京");
// boolean flag = control.add(one);
// if (flag) {
// System.out.println("添加成功~~~");
// }
// 修改一个人
// DBControl control = new DBControl();
// Useslist two = new Useslist(1003, "libai", true, 100, "古代");
// boolean flag1 = control.updata(two);
// if (flag1) {
// System.out.println("修改成功~~~");
// }
// 删除t_user一个人信息
// DBControl control = new DBControl();
// //需要删除的id
// int id = 1002;
// boolean flag = control.detele(id);
// if (flag) {
// System.out.println("删除成功~~");
// }
// 查询所有学生的学生信息
// DBControl control = new DBControl();
// ArrayList<UserInfo> infos = control.seleteAll();
// for (UserInfo useslist : infos) {
// System.out.println(useslist);
// }
// 查询一个人得信息
DBControl control = new DBControl();
UserInfo info = control.selectOne(1001);
if (info == null) {
System.out.println("没有要查询的信息");
}
System.out.println(info);
}
}
无奈源于不够强大