JDBC的连接与操作
连接:
准备工作
从mysql官网下载连接mysql所需的jar包——https://dev.mysql.com/downloads/connector/j/,选择第二个(.zip)下载并解压,得到一个jar包。
第一步:
打开eclipse(或myeclipse),在需要的项目里新建一个文件夹,把这个jar包复制粘贴到这个文件夹下。
第二步:
在这个jar包上右击—>Build Path—>Add to Build Path,即添加到路径之中。
添加之后会自动产生一个Referenced Libraries。
至此,eclipse与mysql的连接外围工作已经结束了!
下面就是使用语句与mysql进行交互。
操作:
基本流程:
0.下面用到的包都来自java.sql之下,所以直接使用import java.sql.*; 不要导错包!
1.注册驱动:
forName()方法中要把地址和类名写完整。
Class.forName("com.mysql.jdbc.Driver");
2.获得链接:
Connection conn=DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/demo_jdbc?characterEncoding=utf-8","root","123456"); //127.0.0.1即localhost 或者
Connection conn=DriverManager.getConnection("jdbc:mysql://localhost:3306/demo_jdbc?characterEncoding=utf-8","root","123456");
jdbc:mysql://localhost/端口号/数据库名是固定格式。characterEncoding是设置字符编码(可选内容),“root”是数据库的用户名(user),“123456”是该用户的登录密码(password).
3.获得语句的执行平台
//Statement Statement st=conn.createStatement();
或 //PreparedStatement
PreparedStatement pst=conn.prepareStatement("update sort set sprice=? where sid=?");
pst.setString(1, "3000");
pst.setString(2, "4");
Statement和PreparedStatement书写时的区别是:Statement此时不传参,sql语句在下一步传入;PreparedStatement在创建时就传入参数,并使用占位符(?)(使用setXXX()传入参数,其中XXX表示String,Double,Int...等一系列方法,setXXX()的第一个参数是指第一个占位符(也就是第一个问号),第二个参数是需要接收的值)。
Statement和PreparedStatement的功能区别在于:PreparedStatement可以防止sql注入。(在下一篇随笔之中,会阐述这个问题)
4.执行sql语句:
对于增删改,使用executeUpdate();对于查找操作,使用executeQuery()。
例:
//Statement ResultSet rs=st.executeQuery("SELECT * FROM sort WHERE sid=1;"); //PreparedStatement ResultSet rs=pst.executeQuery();
//(其它内容见下面完整代码)
这个地方在使用Statement和PreparedStatement时也有区别,区别在于Statement需要在这两个方法中传入sql语句,而PreparedStatement由于在前一步已经传入,所以这里使用这两个方法时不需要传参。
5.处理结果集:
这一步一般针对查询语句,即显示查询到的结果。
while(rs.next()){ System.out.println(rs.getString("sid")+" "+rs.getString("sname")); }
而对于增删改,可以显示一下其返回值
int i=statement.executeUpdate("UPDATE store SET size=13 WHERE sid=3"); print(i);
这个i的值其实是执行该sql代码对几行数据造成影响,也就是下图中的这个值:
6.释放资源
原则:先创建的后释放;
rs.close();//如果用到的话 st.close();或pst.close(); conn.close();
完整代码:
//demo01.java
//Statement增删改
package demo01; import java.sql.*;//导的都是java.sql里面的包 public class demo01 { public static void main(String[] args) throws ClassNotFoundException, SQLException { //1.注册驱动 Class.forName("com.mysql.jdbc.Driver");//写完整的类名 //2.获得链接 Connection conn=DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/demo_jdbc","root","123456"); //3.获得语句执行平台 Statement st=conn.createStatement(); //4.执行sql语句 返回值int为“共几行受到影响” String sql="INSERT INTO sort(sname,sprice,syear) VALUES('电视',4000,6)"; int row=st.executeUpdate(sql); //5.处理结果集 System.out.println(row); //6.释放资源(先创建的后释放) st.close(); conn.close(); } }
//demo01.java //Statement查找 package demo01; import java.sql.*;//导的都是java.sql里面的包 public class demo01 { public static void main(String[] args) throws ClassNotFoundException, SQLException { //1.注册驱动 Class.forName("com.mysql.jdbc.Driver");//这是反射的概念 //写完整的类名 //2.获得链接 Connection conn=DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/demo_jdbc","root","123456"); //3.获得语句执行平台 Statement st=conn.createStatement(); //4.执行sql语句 返回值int为“共几行受到影响” String sql="select * from sort"; ResultSet rs=st.executeQuery(sql); //5.处理结果集 while(rs.next()){ System.out.println(rs.getString("sid")+" "+rs.getString("sname")); } //6.释放资源(先创建的后释放) rs.close(); st.close(); conn.close(); } }
//demo03.java //PreparedStatement增删改 package demo01; import java.sql.*; public class demo03 { public static void main(String[] args) throws ClassNotFoundException, SQLException { Class.forName("com.mysql.jdbc.Driver"); Connection conn=DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/demo_jdbc","root","123456"); PreparedStatement pst=conn.prepareStatement("update sort set sprice=? where sid=?"); pst.setString(1, "3000"); pst.setString(2, "4"); pst.executeUpdate(); pst.close(); conn.close(); } }
//demo02.java //PreparedStatement查找 package demo01; import java.sql.*; public class demo02 { public static void main(String[] args) throws ClassNotFoundException, SQLException { Class.forName("com.mysql.jdbc.Driver"); Connection conn=DriverManager.getConnection("jdbc:mysql://localhost:3306/demo_jdbc","root","123456"); String sql="select * from sort where sid=?;";//?为占位符 PreparedStatement pst=conn.prepareStatement(sql); pst.setString(1,"2");//给第一个占位符(?)赋以"2" ResultSet rs=pst.executeQuery();//里面没有参数 while(rs.next()){ System.out.println(rs.getString("sid")); } rs.close(); pst.close(); conn.close(); } }
注:连接数据库会抛出各种异常,所以都要进行捕获。