这只是我自己的随笔博客~,用于偶尔回忆知识,可能存在一些错误,如有错误,欢迎指正~
首先对于JDBC连接MySQL,要了解基本的框架结构
画的比较烂,大约就是这样的结构
然后看一下具体实现的 代码:;
public class DBUtil { private String user = "root"; private String password = "root"; private String url = "jdbc:mysql://localhost:3306/mydb6"; private static DBUtil dbUtil; Connection connection = null; // 单例:构造方法私有化 private DBUtil() { } public synchronized static DBUtil getInstance() { if (dbUtil == null) { dbUtil = new DBUtil(); } return dbUtil; } /** * 创建数据库连接 */ public Connection getConnection() { if (connection == null) { try { // 注册驱动 Class.forName("com.mysql.jdbc.Driver"); // 获取连接 connection = DriverManager.getConnection(url, user, password); } catch (ClassNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } } return connection; }
}
上面这个是通过单例模式 建立了DBUtil这样一个类。通过这个类可以干什么呢?可以实现----数据库的连接!
没错,Connection接口的作用就是连接数据库-
与特定数据库的连接(会话)。在连接上下文中执行 SQL 语句并返回结果。
怎样才能得到这个连接呢?--想要建立这个连接,你需要注册一个驱动---嗯~就是这个代码 Class.forName("com.mysql.jdbc.Driver");
它是通过反射的机制来获得的,不了解反射?嗯~那你记住就完了 哈哈哈
connection = DriverManager.getConnection(url, user, password);这一句话的是用来获取连接的 ,这三个参数分别是 数据的地址,jdbc:mysql://IP地址:端口号/数据库的名称
嗯~然年再将一下如何通过jdbc向数据库写入数据
public int insertStuByStatement() { String sql1 = "insert into stu(sname,sage) values('aaa',1)"; String sql2 = "insert into stu(sname,sage) values('bbb',1)"; String sql3 = "insert into stu(sname,sage) values('ccc',1)"; Connection connection = getConnection();// 获得数据库的连接 Statement stmt = null; try { stmt = (Statement) connection.createStatement(); connection.setAutoCommit(false); stmt.addBatch(sql1);//批量添加sql语句 stmt.addBatch(sql2);//批量添加sql语句 stmt.addBatch(sql3);//批量添加sql语句 //一次性执行 stmt.executeBatch(); connection.commit(); System.out.println("批处理成功"); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } finally { try { if (stmt != null) { stmt.close(); } } catch (Exception e2) { } } return i; }
这里使用的statement 来实现的,写出你要操作的 sql语句。(提一下,一般这些操作都是放在DBUtil类中的额 ,这个方法我也是放在DBUtil的)。
第二步:根据上面的定义的方法获取数据库。
下面就是获取一个Statement 对象,然后通过这个对象的stmt.executeBatch();就可以在数据库中执行刚才就的语句了,这样就做到了静态插入数据。
那动态插入数据是怎样的呢 ?-----那就是用到了另一个能够实现语句的对象PreparedStatement
直接上代码吧
public int insertStu(String sname,int sage){ String sql = "insert into stu(sname,sage) values(?,?)"; Connection connection = getConnection();//获得数据库的连接 PreparedStatement ps = null; int i = 0; try { ps = (PreparedStatement) connection.prepareStatement(sql); ps.setString(1, sname); ps.setInt(2, sage); i=ps.executeUpdate(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); }finally { try { if (ps!=null) { ps.close(); } } catch (Exception e2) { } } return i; }
定义的插入方法有了两个参数的数值
与statement的区别在哪呢?--一个是sql字符串语句的区别,多了“?”,作用是---看下面这两行代码
ps.setString(1, sname); ps.setInt(2, sage);
ps.set****(a,b)有两个参数,sql语句中也有两个?,所以参数a,代表的是sql语句的第几个“?”,如果参数是1,则说明sql语句中第一个“?”的位置替换为参数b,
如果 同理如果参数是2,则说明sql语句中第一个“?”的位置替换为参数b.这样就做到了动态的插入数据,我们只要在调用插入方法的时候传入想要插入的数据就好了,不用每次都写新的sql语句。
对于 i=ps.executeUpdate();语句,它返回的这次你的数据库操作后有有几条数据有影响.这种方法对于插入,当然是i=1了
但是对于产出和修改的就不是一定了,删除修改我直接贴代码了就不再做讲解
//修改
public int updateStu(int sage,String sname){ String sql = "updae stu set sage = ? where sname = ?"; Connection connection = getConnection(); PreparedStatement ps =null; int i = 0; try { ps = (PreparedStatement) connection.prepareStatement(sql); ps.setInt(1, sage); ps.setString(2, sname); i = ps.executeUpdate(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); }finally { try { if (ps!=null) { ps.close(); } } catch (Exception e2) { } } return i; } //删除 public int deleteStu(String sname,int sage) { String sql = "delete from stu where sname=? and sage = ?"; Connection conn = getConnection();//获得数据库连接 PreparedStatement ps = null; int i = 0; try { ps = (PreparedStatement) conn.prepareStatement(sql); ps.setString(1, sname); ps.setInt(2,sage ); i = ps.executeUpdate(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); }finally { try { if(ps != null) ps.close(); }catch (Exception e) { // TODO: handle exception } } return i; }
数据库最重要的是什么---查询数据,相对于增删改--查可能稍微繁琐一点
代码如下:
/** * 查询所有学生 * @return */ public ArrayList<Stu> queryStu(){ String sql = "select * from stu ";// select * 或的字段的顺序和数据库中的是一致 Connection conn = getConnection(); PreparedStatement ps = null; ResultSet rs = null; ArrayList<Stu> stus = new ArrayList<Stu>();//此集合用于存储每一个学生对象 try { ps = (PreparedStatement) conn.prepareStatement(sql); rs = ps.executeQuery(); //遍历rs while(rs.next()) {//true表示有下一条数据 int id = rs.getInt("id"); String sname = rs.getString("sname"); int sage = rs.getInt("sage"); //创建stu对象 Stu stu = new Stu(id, sname, sage); //收集对象 stus.add(stu); } } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); }finally { try { if(rs != null) rs.close(); if(ps != null) ps.close(); }catch (Exception e) { // TODO: handle exception } } return stus; }
讲一下重点的地方 ResultSet rs = null; 这个对象存储的一个查询的结果集合。select * from stu这个返回的 应该是查询的学生表中每个学生的所有数据,
所以rs就可以储存这样的一个集合,然后通过遍历得到其中的数据,将数据赋值给一个学生对对象,将对象加入到集合中,就得到可表中所有的数据~
这次讲的主要是基础部分,等下次继续探讨JDBC联合其他的一些操作~
Class.forName("com.mysql.jdbc.Driver");