1. 什么是JDBC?JDBC(Java Data Base Connectivity,java数据库连接)是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,它由一组用Java语言编写的类和接口组成。
2. jdbc操作数据库的总体模型:
1)一张表对应一个pojo类,也就是一个表对应一个java对象。
2)pojo类中的属性对象表中的相应的字段。
3)一个pojo类有一个dao类,通过导类操作对应的pojo类中的属性值来实现对数据库中数据的曾、删、改、查等操作
JDBC 操作数据库的模型
3. 连接数据库的种类及方法:
不同的数据库,使用的驱动类不同,对应的连接对象也不同,不过他们都有共同点,
驱动类都是要到对应的官网下载驱动包,比如mysql的驱动包为:mysql-connector-java-5.0.5-bin.jar,将驱动包放置在工程的lib文件夹下,如果没有该文件夹,就新建一个,把驱动包复制进去,然后进行配置,有些会自动进行配置。连接url为jdbc:+所用的数据库类型+访问路径+端口号+要操作的数据库,接着根据用户和密码得到连接对象,常用的数据库类型得到连接的方法如下:
1)、Oracle8/8i/9i数据库(thin模式)
Class.forName("oracle.jdbc.driver.OracleDriver").newInstance();
String url="jdbc:oracle:thin:@localhost:1521:orcl";
//orcl为数据库的SID
String user="test";
String password="test";
Connection conn= DriverManager.getConnection(url,user,password);
2)、DB2数据库
Class.forName("com.ibm.db2.jdbc.app.DB2Driver ").newInstance();
String url="jdbc:db2://localhost:5000/sample";
//sample为你的数据库名
String user="admin";
String password="";
Connection conn= DriverManager.getConnection(url,user,password);
3)、Sql Server7.0/2000数据库
Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver").newInstance();
String url="jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=mydb";
//mydb为数据库
String user="sa";
String password="";
Connection conn= DriverManager.getConnection(url,user,password);
4)、Sybase数据库
Class.forName("com.sybase.jdbc.SybDriver").newInstance();
String url =" jdbc:sybase:Tds:localhost:5007/myDB";
//myDB为你的数据库名
Properties sysProps = System.getProperties();
SysProps.put("user","userid");
SysProps.put("password","user_password");
Connection conn= DriverManager.getConnection(url, SysProps);
5)、Informix数据库
Class.forName("com.informix.jdbc.IfxDriver").newInstance();
String url =
"jdbc:informix-sqli://123.45.67.89:1533/myDB:INFORMIXSERVER=myserver;
user=testuser;password=testpassword";
//myDB为数据库名
Connection conn= DriverManager.getConnection(url);
6)、MySQL数据库
Class.forName("org.gjt.mm.mysql.Driver").newInstance();
String url ="jdbc:mysql://localhost/myDB?user=soft&password=soft1234&useUnicod
e=true&characterEncoding=8859_1"
//myDB为数据库名
Connection conn= DriverManager.getConnection(url);
4.JDBC 常用接口:
ResultSet | 代表执行查询sql的结果集对象,通过遍历结果集可以得到查询的数据。 |
Statement | 用于执行一条sql查询语句的声明对象,执行后可以返回ResulSet对象,其它的语句返回命令执行的个数 |
PreparedStatement | 用于执行预编译sql语句的声明对象,执行查询后可以返回ResulSet对象,其它的语句返回命令执行的个数。 |
Connection | 一个Connection对象代表程序与数据库的一个连结,用与创建Statement对象. |
5.下面通过一个简单的列子把这些知识串联起来:
假设数据库类型使用的是mysql类型,已经创建好了名MyDB数据库,MyDB里面有一个课程
course,表中有字段,课程代号Cid、课程名称Name、课程学分Score、课程描述Desce四个字段
那么运用jdbc来操作数据库的步骤如下:
1)得到数据库连接对象:
//创建数据库的处理类
public class JDataBase {
// 取得数据库的连接对象
public static java.sql.Connection getConnection() {
java.sql.Connection conn = null;
if (conn == null) {
// 连接数据库URL地址
String url = "jdbc:mysql://localhost:3306/MyDB";
// 连接数据库的用户名
String user = "root";
// 连接数据库的密码
String password = "123456";
try { // 创建连接数据库的驱动类对象 java反射技术
Class.forName("com.mysql.jdbc.Driver");
// 根据驱动管理类,得到数据库的连接对象
conn = java.sql.DriverManager
.getConnection(url, user, password);
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (java.sql.SQLException e) {
e.printStackTrace();
}
}
return conn;
}
}
2)创建表course的pojo类名为CoursePojo,并写好对应的get和set方法
//课程表的pojo类
public class CoursePojo {
private String CId;//课程代号
private String Name;//课程名称
private String Score;//课程学分
private String Desce;//课程描述
//从写无参构造器
public CoursePojo(){}
//重写构造器并传入参数,以方便创建对象
public CoursePojo(String CId,String Name,String Score,String Desce){
this.CId=CId;
this.Name=Name;
this.Score=Score;
this.Desce=Desce;
}
public String getCId() {
return CId;
}
public void setCId(String cId) {
CId = cId;
}
public String getName() {
return Name;
}
public void setName(String name) {
Name = name;
}
public String getScore() {
return Score;
}
public void setScore(String score) {
Score = score;
}
public String getDesce() {
return Desce;
}
public void setDesce(String desce) {
Desce = desce;
}
}
3)创建操作CoursePojo中属性值的ManagerDao类,并实现对数据的增删改查
//操作数据库的导类
public class ManagerDao {
public static void main(String[] args) {
// 创建导类对象
ManagerDao dao = new ManagerDao();
for (int i = 1; i < 10; i++) {
// 创建课程pojo对象,并传人相应的参数
CoursePojo c = new CoursePojo("00" + i, "course" + i, "" + i,
"desc" + i);
// 调试查找课程的方法
System.out.println("课程信息:" + dao.searchCourse(c).get(0).getName());
// 调试修改课程的方法
//
dao.modifyCourse(c);
System.out.println("xiug ");
}
}
// 添加课程的方法,返回sql语句执行条数,如果返回0,则表示操作失败
public int addCourse(CoursePojo c) {
int count = 0;
// 获得数据库连接
java.sql.Connection conn = JDataBase.getConnection();
try { // 编写需要执行的sql语句
String sql = "insert into course(CId,Name,Score,Desce) values(?,?,?,?)";
// 得到预编译处理对象
java.sql.PreparedStatement pstmt = conn.prepareStatement(sql);
// 向数据库中插入相应的数据
pstmt.setString(1, c.getCId());
pstmt.setString(2, c.getName());
pstmt.setString(3, c.getScore());
pstmt.setString(4, c.getDesce());
count = pstmt.executeUpdate();
// 关闭接口集
pstmt.close();
conn.close();
} catch (Exception ef) {
System.out.println("插入课程失败");
ef.printStackTrace();
}
return count;
}
// 查找课程信息,返回一个存有课程信息的队列
public java.util.ArrayList<CoursePojo> searchCourse(CoursePojo c) {
// 创建一个队列对象
java.util.ArrayList<CoursePojo> list = new java.util.ArrayList<CoursePojo>();
// 获得数据库连接
java.sql.Connection conn = JDataBase.getConnection();
try {
// 编写查询sql语句
String sql = "select * from course where CId=" + c.getCId();
// 得到执行对象
java.sql.Statement stmt = conn.createStatement();
// 返回一个存有查询结果的结果集
java.sql.ResultSet set = stmt.executeQuery(sql);
// 遍历结果集,并且将查询的数据设置pojo对象的属性
while (set.next()) {
c.setCId(set.getString(1));
c.setName(set.getString(2));
c.setScore(set.getString(3));
c.setDesce(set.getString(4));
// 将课程对象存到队列中
list.add(c);
}
// 关闭接口集
set.close();
stmt.close();
conn.close();
} catch (Exception ef) {
ef.printStackTrace();
}
return list;
}
// 修改课程
public int modifyCourse(CoursePojo c) {
int count = 0;
// 获得数据库连接
java.sql.Connection conn = JDataBase.getConnection();
try {
// 拼凑sql修改语句语句
String sql = "update course set Name='" + c.getName() + "',Score='"
+ c.getScore() + "',Desce='" + c.getDesce()
+ "' where CId=" + c.getCId();
java.sql.PreparedStatement pstmt = conn.prepareStatement(sql);
count = pstmt.executeUpdate();
pstmt.close();
conn.close();
} catch (Exception ef) {
ef.printStackTrace();
}
return count;
}
// 删除课程的方法
public int deleteCourse(CoursePojo c) {
int count = 0;
// 获得数据库连接
java.sql.Connection conn = JDataBase.getConnection();
try {
String sql = "delete from course where CId=" + c.getCId();
java.sql.PreparedStatement pstmt = conn.prepareStatement(sql);
// 执行SQL语句
count = pstmt.executeUpdate();
// 关闭接口 集
pstmt.close();
conn.close();
} catch (Exception ef) {
ef.printStackTrace();
}
return count;
}
}
说明:在查找时将查找结果存到队列中是为了在使用时方便取出来,其他操作返回一个int是为了判断操作是否执行成功。sql有两种语句,一种是拼凑sql语句,另一种是占位符sql语句,比如String sql = "insert into course(CId,Name,Score,Desce) values(?,?,?,?)";使用这中语句的好处是执行的速度快,而且比较安全,因为它是先发送语句,再发送对应的数据,而拼凑sql语句是一种很有规则的语句,很容易被人破解。
6.总结
在使用jdbc操作数据库时,细心是最重要的,在拼凑sql语句时玩的是文字游戏,不小心写错一个字母,得出的结果就可能完全不同,精彩性的报语法错误,关键的是每一步都打印出调试的信息,这样方便与出错时检查