数据库—mysql—sql
JDBC:java中用于控制(操作)sql语句的驱动—-都是接口
Java中面向接口编程,给定相关的接口,我们调用接口来说实现相应的功能
比如:jdbc就是给定了java访问数据库的接口—是由各个数据库的厂商提供的驱动来处理的
数据库的驱动:实际上就是一个jar包
这个jar包(数据库驱动)是由各个数据库的厂商自己提供的,用于给java访问自己的数据库
比如:
java要去访问mysql数据库,就使用mysql厂商提供的数据库驱动
java要去访问oracle数据库,就使用oracle厂商提供的数据库驱动
综上所诉:jdbc的作用就是java利用数据库厂商提供的驱动来访问数据库
JDBC的使用
步骤:
- 注册驱动
- 获取连接
- 获取语句执行平台
- 获取sql语句
- 处理结果
- 释放资源
mysql-connector-java-5.1.37-bin.jar
package cn.ant.Day18;import java.sql.Connection;import java.sql.DriverManager;import java.sql.ResultSet;import java.sql.Statement;import org.junit.Test;public class Demo {@Testpublic void test() throws Exception{/** 1、注册驱动--用到的是反射机制* 将mysql的数据库驱动导入--大小写敏感,一个字都不能错* jdbc的所有api都是在java.sql下的* */Class.forName("com.mysql.jdbc.Driver");//获取连接Connection conn= DriverManager.getConnection("jdbc:mysql://localhost:3306/mydb","root","123456");System.out.println(conn);//com.mysql.jdbc.JDBC4Connection@4ac68d3e//3、获取语言执行平台(执行sql语句的对象)Statement stmt= conn.createStatement();//4、获取执行sql语句的对象 返回一个结果集ResultSet res= stmt.executeQuery("select*from category");//处理查询结果while(res.next()){//是否还有下一个数据记录//获取每一行的数据Integer cid=res.getInt("cid");String cname=res.getString("cname");System.out.println("cid:"+cid+"\t"+"cname:"+cname);}//释放资源--关闭连接//关闭结果集res.close();//关闭sql语句平台stmt.close();//关闭连接conn.close();}}
获取驱动

getConnection语法格式
getConnection(url,user,password)第一参数是连接第二参数是数据库用户密码第三参数是数据库摩玛url语法格式jdbc:mysql://ip地址:数据库端口号//数据库名称
资源释放
资源释放问题数据库的操作原则上是要一次连接一次关闭将jdbc中用到的接口先声明好因为释放资源是必须的,所以可以放在finally块中
测试
package cn.ant.Day18;import java.sql.Connection;import java.sql.DriverManager;import java.sql.ResultSet;import java.sql.Statement;import org.junit.Test;public class Demo3 {@Testpublic void test(){/** 1、注册驱动--用到的是反射机制* 将mysql的数据库驱动导入--大小写敏感,一个字都不能错* jdbc的所有api都是在java.sql下的* *///接口声明Connection conn=null;Statement st=null;ResultSet rs=null;try{Class.forName("com.mysql.jdbc.Driver");conn= DriverManager.getConnection("jdbc:mysql://localhost:3306/mydb","root","123456");st=conn.createStatement();rs=st.executeQuery("select*from category");while(rs.next()){Integer cid=rs.getInt(1);String cname=rs.getString(2);System.out.println("cid:"+cid+"\t"+"cname:"+cname);}}catch(Exception e){e.printStackTrace();}finally{//判断是否为空try{if(rs!=null)rs.close();if(st!=null)st.close();if(conn!=null)conn.close();}catch(Exception e){e.printStackTrace();}}}}
封装成工具类
package cn.ant.Day18;import java.sql.Connection;import java.sql.DriverManager;import java.sql.ResultSet;import java.sql.SQLException;import java.sql.Statement;import org.junit.Test;public class JDBCUtils {/** jdbc的工具类* 用户封装jdbc操作中的重复操作** 当前这个工具类一旦封装就可以重复,为了将就效率,一般使用静态* */private static String driver="com.mysql.jdbc.Driver";private static String url="jdbc:mysql://localhost:3306/mydb";private static String user="root";private static String password="123456";static{try {Class.forName(driver);} catch (ClassNotFoundException e) {// TODO Auto-generated catch blocke.printStackTrace();}}//下面封装两个操作//1、封装获取连接的方法public static Connection getConnection(){//直接获取连接Connection conn;try {conn = DriverManager.getConnection(url,user,password);return conn;} catch (SQLException e) {// TODO Auto-generated catch blocke.printStackTrace();}return null;}//封装一个释放资源的方法public static void closeResource(Connection conn,Statement st,ResultSet rs){try{if(st!=null) st.close();if(rs!=null) rs.close();if(conn!=null) conn.close();}catch(Exception e){e.printStackTrace();}}@Testpublic void test(){Connection conn=getConnection();System.out.println("conn==>"+conn);}}
CRUD
C--create--增加R--Retrieve--读取--查询U-update--更新--改D--Delete--删除
package cn.ant.Day18;import java.sql.Connection;import java.sql.ResultSet;import java.sql.Statement;import org.junit.Test;public class Demo04 {//jdbc模板public void test01(){Connection conn=null;Statement st=null;ResultSet rs=null;try{//逻辑操作}catch(Exception e){e.printStackTrace();}finally{//关闭资源JDBCUtils.closeResource(conn, st, rs);}}//添加// @Testpublic void test02(){Connection conn=null;Statement st=null;ResultSet rs=null;try{//逻辑操作//获取连接conn=JDBCUtils.getConnection();//获取执行sql对象st=conn.createStatement();//int i=st.executeUpdate("insert into category(cname) values('测试数据1')");System.out.println("插入数据结果==》"+i);}catch(Exception e){e.printStackTrace();}finally{//关闭资源JDBCUtils.closeResource(conn, st, rs);}}//修改// @Testpublic void test03(){Connection conn=null;Statement st=null;ResultSet rs=null;try{//逻辑操作//获取连接conn=JDBCUtils.getConnection();//获取执行sql对象st=conn.createStatement();//int i=st.executeUpdate("update category set cname='测试数据2' where cid=4");System.out.println("插入数据结果==》"+i);}catch(Exception e){e.printStackTrace();}finally{//关闭资源JDBCUtils.closeResource(conn, st, rs);}}//删除// @Testpublic void test04(){Connection conn=null;Statement st=null;ResultSet rs=null;try{//逻辑操作//获取连接conn=JDBCUtils.getConnection();//获取执行sql对象st=conn.createStatement();//int i=st.executeUpdate("delete from category where cid=4");System.out.println("插入数据结果==》"+i);}catch(Exception e){e.printStackTrace();}finally{//关闭资源JDBCUtils.closeResource(conn, st, rs);}}//查询@Testpublic void test05(){Connection conn=null;Statement st=null;ResultSet rs=null;try{//逻辑操作//获取连接conn=JDBCUtils.getConnection();//获取执行sql对象st=conn.createStatement();//rs=st.executeQuery("select * from category where cid=3");while(rs.next()){//在mysql数据库中数值类型 会隐式转换为字符串Integer cid=rs.getInt(1);String cname=rs.getString(2);System.out.println("cid:"+cid+"\t"+"cname:"+cname);}}catch(Exception e){e.printStackTrace();}finally{//关闭资源JDBCUtils.closeResource(conn, st, rs);}}}
关于Statement
package cn.ant.Day18;import java.sql.Connection;import java.sql.ResultSet;import java.sql.Statement;import org.junit.Test;public class StatementDemo {//演示注入攻击@Testpublic void test(){//模拟登陆String username="jack";String password="123";//Connection conn=null;Statement st=null;ResultSet rs=null;try{conn=JDBCUtils.getConnection();String sql="select*from user where username='"+username+"' and password='"+password+"'";System.err.println(sql);st=conn.createStatement();rs=st.executeQuery(sql);if(rs.next()){System.out.println("登陆成功");}else{System.out.println("登陆失败");}}catch(Exception e){e.printStackTrace();}finally{JDBCUtils.closeResource(conn, st, rs);}}}
PreparedStatement(防止注入)代替Statement
package cn.ant.Day18;import java.sql.Connection;import java.sql.PreparedStatement;import java.sql.ResultSet;import java.sql.Statement;import org.junit.Test;public class PreparedStatementDemo {/*PreparedStatement* 是预处理机制,预处理sql语句* 处理的条件使用?来进行站位* 能够完美解决sql注入问题** */@Testpublic void test(){//模拟登陆String username="jack";String password="1234";//Connection conn=null;PreparedStatement ps=null;ResultSet rs=null;try{conn=JDBCUtils.getConnection();String sql="select*from user where username=? and password=?";System.err.println(sql);ps=conn.prepareStatement(sql);ps.setString(1, username);ps.setString(2, password);rs=ps.executeQuery();if(rs.next()){System.out.println("登陆成功");}else{System.out.println("登陆失败");}}catch(Exception e){e.printStackTrace();}finally{JDBCUtils.closeResource(conn, ps, rs);}}}
