jdbc(java database connection) 数据库连接
jdbc概述:
1.jdbc是一种由java语言定义的接口和类,用于访问不同的关系型数据
2.java语言要连接mysql数据库,就需要开发具体的类来实现这样的功能
3.有了JDBC,java开发人员只需要编写一次程序,就可以访问不同的数据库. 4.java语言只需要定义一套连接数据库操作的标准接口就可以了1.导入mysql开发商提供的具体数据库连接实现的jar文件 2.加载mysql驱动类(打开jav与数据库的连接通道) 3.建立与mysql数据库连接 4.发送sql语句 5.关闭连接通道 6.接收数据库查询的结果JDBC API: 供程序员调用的接口与类,集成在 java.sql 包中 DriverManager 类作用:管理各种不同的 jDBC 驱动 Connection 接口 与特定数据库的连接 Statement 接口 执行 sql 或者 PreparedStatement接口 执行 sql ResultSet 接口 接收查询结果 JDBC搭建: 1.加载mysql驱动类: Class.forName(“com.mysql.cj.jdbc.Driver”); //反射实现 或者 DriverManager.registerDriver(new Driver()); 2.连接数据库: Connection conn = DriverManager.getConnection(URL,USER,PASS); URL:jdbc:mysql://ip(127.0.0.1): 端口 (3306)/ 数据库 名 ?serverTimezone=Asia/Shanghai USER: 用户名 (root) PASS: 密码
Connection connection = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/charroom? serverTimezone=Asia/Shanghai","root","121212");
3.获得Satement执行sql语句 或者 获得PrepareStatement执行sql语句
(1)获得Satement执行sql语句
Satement 中的方法 : Int executeUpdate(String sql) 用于执行 ddl 语句和 dml( 增 , 删 , 改 ) 语句 返回操作的行数(比如插入了一行数据,就返回1) 用于执行 ddl 语句返回 用于执行 dml 语句返回操作的行数 插入,修改,删除一行数据Statement s = connection.createStatement(); //现在要向数据库的表中插入一条数据 //这里对应的是数据库中的字段 //对指定条件的行进行数据修改 //删除 int a = s.executeUpdate("delete from suser where num="+num); System.out.println(a);
(2)获得PrepareStatement执行sql语句
在 sql 语句中参数位置使用占位符 , 使用 setXX 方法向 sql 中设置参数 PrepareStatement ps = connection.prepareStatement(sql); PrepareStatement 中的方法 : Int executeUpdate() 用于执行 ddl 语句和 dml( 增 , 删 , 改 ) 语句 返回操作的行数 用于执行 ddl 语句返回 0 用于执行 dml 语句返回操作的行数PreparedStatement ps = //将sql预编译到preparedstatement对象中,并没有执行 connection.prepareStatement("insert into suser(sname,passworde,brithday,timet) value(?,?,?,?)"); //接下来设置值 ps.setObject(1,username); ps.setObject(2,userpassword); ps.setObject(3,brithday); ps.setObject(4,new java.util. Date()); //执行 ps.executeUpdate();
4.关闭与数据库的链接通道
每次操作完成后关闭所有与数据库交互的通道,将statement于connection全部关闭 st.close(); rs.close(); conn.close(); ps.close(); 5. PreparedStatement 和 Statement 1、代码的可读性和可维护性. 虽然用PreparedStatement来代替Statement会使代码多出几行,但这样的代码无论从可读性还是可维护性上来说.都比直接用Statement的代码高很多档次: stmt.executeUpdate("insert into tb_name (col1,col2,col2,col4) values ('"+var1+"','"+var2+"',"+var3+",'"+var4+"')"); perstmt = con.prepareStatement("insert into tb_name (col1,col2,col2,col4) values (?,?,?,?)"); perstmt.setString(1,var1); perstmt.setString(2,var2); perstmt.setString(3,var3); perstmt.setString(4,var4); perstmt.executeUpdate(); //prestmt是 PreparedStatement 对象实例 可以看出来PreparedStatement要看起来更为简单直观 2.提高了安全性 (1)以 Statement为例String num = "1000 or 1=1";//sql注入 sql攻击 Class.forName("com.mysql.cj.jdbc.Driver"); Connection connection = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/charroom?serverTimezone=Asia/Shanghai","root","121212"); //执行 Statement statement = connection.createStatement(); int a = statement.executeUpdate("delete from suser where num="+num); //这种操作会直接把数据库表中的所有数据删除
(2)以PreparedStatement为例
String num = "1000 or 1=1";//sql注入 sql攻击 Class.forName("com.mysql.cj.jdbc.Driver"); Connection connection = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/charroom?serverTimezone=Asia/Shanghai","root","121212"); //执行 PreparedStatement pt = connection.prepareStatement("delete from suser where num=?"); pt.setObject(1,num);//set方法中对传入的值进行检测,一个?对应一个值,不能有其他的关键字 pt.executeUpdate(); //这种方法在运行程序时它会检测到错误从而报错阻止操作继续进行
6.结果集处理(也就是将数据库表中的数据提取出来)
PreparedStatement 和 Statement 中的 executeQuery() 方法中会返回一个ResultSet 对象 , 查询结果就封装在此对象中 . 1.使用 ResultSet 中的 next() 方法获得下一行数据 2.使用 getXXX(String name) 方法获得值 (1)将一行数据取出来 首先自己定义一个类public class User { private String name; private String password; private Date brithday; private Date time; private int num; public int getNum() { return num; } public void setNum(int num) { this.num = num; } public void setName(String name) { this.name = name; } public void setPassword(String password) { this.password = password; } public void setBrithday(Date brithday) { this.brithday = brithday; } public void setTime(Date time) { this.time = time; } @Override public String toString() { return "User{" + "name='" + name + ''' + ", password='" + password + ''' + ", brithday=" + brithday + ", time=" + time + ", num=" + num + '}'; } }
public class Demo7 { public static void main(String[] args) { String num = "6"; User user = null; try { user = new Demo7().dd(num); } catch (ClassNotFoundException | SQLException e) { e.printStackTrace(); } System.out.println(user); } public User dd(String num) throws ClassNotFoundException, SQLException { PreparedStatement pt=null; Connection connection = null; User user=null; try{ Class.forName("com.mysql.cj.jdbc.Driver"); connection = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/charroom?serverTimezone=Asia/Shanghai","root","121212"); pt = connection.prepareStatement("select * from suser where num=?"); pt.setObject(1,num); ResultSet st = pt.executeQuery();//执行查询操作 //从ResultSet中将数据传入到我们自己定义的对象中 while (st.next()){ user = new User(); user.setNum(st.getInt("num")); user.setName(st.getString("sname")); user.setPassword(st.getString("passworde")); user.setBrithday(st.getDate("brithday")); user.setTime(st.getTimestamp("timet")); } }finally { pt.close(); connection.close(); } return user; } }
(2)将表中的所有数据取出来,用到了集合的思想
public class Demo8 { public static void main(String[] args) { ArrayListusers = null; try { users = new Demo8().dd(); } catch (ClassNotFoundException | SQLException e) { e.printStackTrace(); } System.out.println(users); } public ArrayList dd() throws ClassNotFoundException, SQLException { PreparedStatement pt=null; Connection connection = null; ArrayList users = new ArrayList<>(); User user=null; try{ Class.forName("com.mysql.cj.jdbc.Driver"); connection = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/charroom?serverTimezone=Asia/Shanghai","root","121212"); pt = connection.prepareStatement("select * from suser "); ResultSet st = pt.executeQuery();//执行查询操作 //从ResultSet中将数据传入到我们自己定义的对象中 while (st.next()){ user = new User(); user.setNum(st.getInt("num")); user.setName(st.getString("sname")); user.setPassword(st.getString("passworde")); user.setBrithday(st.getDate("brithday")); user.setTime(st.getTimestamp("timet")); users.add(user); } }finally { pt.close(); connection.close(); } return users; } }