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语句时玩的是文字游戏,不小心写错一个字母,得出的结果就可能完全不同,精彩性的报语法错误,关键的是每一步都打印出调试的信息,这样方便与出错时检查