学习内容:java
1.JDBC的含义...mysql
JDBC想必学过JAVA的就不会陌生,JDBC究竟是什么呢?其实就是由JAVA的一些类和接口构成的API,保存在java.sql和javax.sql..包中的一些API...程序员
2.使用JDBC的缘由...sql
那么为何要使用,这个想必你们也是更为了解了,一个应用程序若是不和数据库进行链接,那这根本就不算是个应用程序,那么应用程序是不能直接对数据库进行操做的,那么就须要一个辅助工具去链接数据库,从而操做数据库...那这个辅助的工具就是JDBC了,这个仅限于JAVA应用程序...其实整体的规模就是这样:应用程序——>JDBC——>(mysql driver——>mysql)数据库
JDBC——>(oracle driver——>oracle)oracle
JDBC——>(DB2 driver——>db2)就是这么简单的事...多余的就不罗嗦了...dom
3.如何使用JDBC...eclipse
如何使用JDBC,才是真正的重点...使用JDBC分为几个步骤...ide
我这里只对连接mysql进行讲解...函数
i.首先注册驱动
Class.forName("com.mysql.Driver");//这种方式是最好的,不会对具体驱动产生依赖... DriverManager.registerDriver(com.mysql.jdbc.Driver);//会产生两个相同的驱动,并会对具体驱动产生依赖... System.setProperty("jdbc.drivers","driver1:driver2");//基本不经常使用,因此能够不用记,通常就使用第一种就好了...
ii.创建链接
Connection conn = DriverManager.getConnection(url, user, password);
iii.建立执行SQL语句...
Statement st = conn.createStatement(); st.executeQuery(sql); PreparedStatement String sql = "select * from table_name where col_name=?"; PreparedStatement ps = conn.preparedStatement(sql); ps.setString(1, "col_value"); ps.executeQuery();
iv.处理执行结果...
ResultSet rs = statement.executeQuery(sql);
While(rs.next()){
rs.getString(“col_name”);
rs.getInt(“col_name”);
}
v.释放资源...
释放资源这是必须的,使用close()进行关闭...因为数据库的资源是很是珍贵的,所以只要咱们不去使用资源的时候,必定要记得释放...
先来个例子:仍是例子更加的好理解...
import java.sql.*;//1.引包是必须的... public class JDBC_1_1 { static final String JDBC_DRIVER="com.mysql.jdbc.Driver"; static final String DB_URL ="jdbc:mysql://localhost:3306/emp";//这个连接是我本机的数据库emp...emp里有个表格叫employees.... /*表格的信息 *create table employees *( * id int not null, * first varchar(255) not null, * last varchar(255) not null, * age int not null *); */ static final String USER="root";//登录数据库时的用户名... static final String PAS="49681888";登录时的密码... public static void main(String[] args) { // TODO Auto-generated method stub Connection conn=null; Statement stmt=null;// try { //2.注册JDBC驱动程序... Class.forName("com.mysql.jdbc.Driver"); //3.打开一个连接... System.out.println("Connection database...."); conn=DriverManager.getConnection(DB_URL,USER,PAS); //4.执行一个操做... System.out.println("Creating statement"); stmt=conn.createStatement(); // String sql; // sql="select id,first,last,age from employees"; 这个是查询操做... // ResultSet rs=stmt.executeQuery(sql); String sql_1="insert into employees " + "values (7, 'z', 'yh', 20)";//插入操做... stmt.executeUpdate(sql_1); 5.提取数据... // while(rs.next()){ //rs用来保存sql执行后的结果... // int id=rs.getInt("id"); // int age=rs.getInt("age"); // String first=rs.getString("first"); // String last=rs.getString("last"); // System.out.println(id+" "+age+" "+first+" "+last); // } 6.清理环境 // rs.close(); stmt.close(); conn.close(); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); System.out.println("no class"); }finally{ if(stmt!=null){ try { stmt.close(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } } if(conn!=null){ try { conn.close(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } System.out.println("Goodbye"); } }
其余操做,好比说删除啊,更改啊,这个模式基本都差很少...就不进行解释了...
注意:若是咱们使用JDBC的时候,必定要检查检查本身的的jdk的lib文件夹下有没有mysql-connector-java-5.1.18-bin.jar这个压缩文件..若是没有,那么程序运行时会出现错误...解决方法就是咱们下一个mysql-connector-java-5.1.18-bin.jar这个文件,几k而已,下载完毕以后直接拷贝到jdk的lib文件夹下便可..
若是使用的是eclipse,咱们还要导入这个文件...右击咱们创建的项目文件,而后点击build path——>configure build path,弹出对话框之后,点击Libraries——>Add External JARs...找到这个mysql-connector-java-5.1.18-bin.jar文件导入,而后就能够了...
4.使用JDBC实现CURD操做...什么是CURD操做呢?其实就是对数据进行更新,删除等操做...
这里咱们采用分层操做...这个代码很长...
首先是User实体...
package JDBC_3; import java.util.Date; class User{ //user类.. private int id; private String name; private Date birthday; private float money; public User(){ } public User(int id,String name,Date birthday,float money){ this.id=id; this.name=name; this.birthday=birthday; this.money=money; } public int getid(){ return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Date getBirthday() { return birthday; } public void setBirthday(Date birthday) { this.birthday = birthday; } public float getMoney() { return money; } public void setMoney(float money) { this.money = money; } @Override public String toString(){ return "[id="+id+",name="+name+",birthday="+birthday+",money="+money+"]"; } }
接着是咱们的Dao层,就是接口...
package JDBC_3; interface UserDao{ public abstract void addUser(User user); public abstract User getUserById(int userid); public abstract int update(User user); public abstract int delete(User user); }
而后是实现接口的类...
package JDBC_3; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.SQLException; import java.sql.Date; import java.sql.ResultSet; /* * JDBC实现crud操做 * crud操做就是对数据进行增删改查... * */ public class JDBC_3_1_server implements UserDao{ static final String DB_URL="jdbc:mysql://localhost:3306/emp"; static final String user_1="root"; static final String pas="49681888"; static{ try { Class.forName("com.mysql.jdbc.Driver"); } catch (ClassNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } } public void addUser(User user){ Connection cn=null; PreparedStatement ps=null; try { cn=DriverManager.getConnection(DB_URL,user_1,pas); String sql="insert into userr values(2,'clearlove','1995-01-26',200)"; //String sql="insert into userr values(?,?,?,?)";这句话是传参数是未知的,须要咱们进行获取... ps=cn.prepareStatement(sql); //这四个函数就是为了获取咱们插入的信息...上面采用了直接在sql里写入咱们要插入的数据,其实咱们也能够在主函数里进行传参...见下面主函数... // ps.setInt(1,user.getid()); // ps.setString(2,user.getName()); // ps.setDate(3, new Date(user.getBirthday().getTime())); // ps.setFloat(4, 20); int count=ps.executeUpdate(); System.out.println("添加的记录数"+count); ps.close(); cn.close(); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); }finally{ if(ps!=null){ try { ps.close(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); }finally{ if(cn!=null){ try { cn.close(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } } } } public User getUserById(int userid){ Connection cn=null; PreparedStatement ps=null; ResultSet rs=null; try { cn=DriverManager.getConnection(DB_URL,user_1,pas); String sql="select * from userr where id=1"; //导入sql语句... ps=cn.prepareStatement(sql); //保存执行sql语句后的结果对象... rs=ps.executeQuery(); ps.close(); cn.close(); rs.close(); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); }finally{ if(ps!=null){ try { ps.close(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } } if(rs!=null){ try { rs.close(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } } if(cn!=null){ try { cn.close(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } return null; } public int update(User user){ Connection cn=null; PreparedStatement ps=null; try { cn=DriverManager.getConnection(DB_URL,user_1,pas); String sql="update userr set name='clearlove',birthday='1994-12-19',money=60 where id=1"; ps=cn.prepareStatement(sql); int count=ps.executeUpdate(); return count; } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); }finally{ try { cn.close(); ps.close(); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } return 0; } public int delete(User user){ Connection cn=null; PreparedStatement ps=null; try { cn=DriverManager.getConnection(DB_URL,user_1,pas); String sql="delete from userr where id=1"; ps=cn.prepareStatement(sql); int count=-1; count=ps.executeUpdate(); return count; } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); }finally{ try { cn.close(); ps.close(); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } return 0; } }
接着是服务层...
package JDBC_3; class userserves { private UserDao userDao; public userserves(){ userDao =DaoFactory.getInstance().createUserDao();//经过工厂实例化一个例子。。 System.out.println("userDao "+userDao); } public void regist(User user){ if(user==null){ System.out.println("注册表信息无效..."); }else{ userDao.addUser(user); } } public User query(int userId){ User user = userDao.getUserById(userId); if(user == null){ System.out.println("查询结果为空!!"); }else{ System.out.println(user.getid()+"\t"+user.getName()+"\t"+user.getBirthday()+"\t"+user.getMoney()); } return userDao.getUserById(userId); } public void update(User user){ if(user.getid()<0){ System.out.println("用户id无效,从新输入"); }else{ userDao.update(user); } } public void delete(User user){ if(user.getid()<0){ System.out.println("用户id无效,从新输入"); }else{ userDao.delete(user); } } }
定义一个工厂模式来实例化对象UserDao。。。
package JDBC_3; class DaoFactory{ private static UserDao userdao=null; private static DaoFactory instance= new DaoFactory(); private DaoFactory(){ try { userdao=(UserDao)Class.forName("JDBC_3.JDBC_3_1_server").newInstance(); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } public static DaoFactory getInstance(){ return instance; } public UserDao createUserDao(){ return userdao; } }
最后是测试类...
package JDBC_3; import java.sql.Date; public class JDBC_3_1_ceshi { public static void main(String[] args) { // TODO Auto-generated method stub userserves userse=new userserves(); System.out.println("添加用户"); userse.regist(new User()); //这句话咱们也能够这样 //userse.regist(new User(1,"clearlove","1995-01-26",300));这样写咱们能够固定传参...可是上面的一些代码就要进行修改了... } }
上面的代码估计是有点长,可是也不要紧...一名优秀的程序员这点代码对于咱们来讲算什么呢?其实上面的例子是很好理解的...都是一些基本的东西...
咱们除了上述那种方式能够对类名进行加载,咱们还可使用proprties...是一种很灵活的方式...
private DaoFactory(){ /** * 经过读取属性文件来动态的加载Dao层类 */ Properties prop = new Properties(); try{ FileInputStream fis = new FileInputStream("src/com/weijia/domain/daoconfig.properties"); prop.load(fis); String className = prop.getProperty("userDaoClass"); Class<?> clazz = Class.forName(className); userDao = (UserDao)clazz.newInstance(); fis.close(); }catch(Exception e){ } }
这里的数据库就是一个简单的数据库...
create table userr ( id int not null, name varchar(255) not null, birthday Date, money float not null );