jdbc知识点复习(一)

一 什么是jdbc?

         使用java代码发送sql语句的技术,就是jdbc技术

二 该技术的好处?

         我们不用通过mysql等数据库的客户端工具,登录数据库服务器之后,编写sql语句,再发送sql语句到数据库服务器执行。

         而是直接使用java代码发送sql语句到数据库服务器执行。

三 使用jdbc连接数据库

	public void test() throws Exception{
                private String url = "jdbc:mysql://localhost:3306/user";
	                    // jdbc协议:数据库子协议:主机:端口/连接的数据库 
                private String user = "root";//用户名
                private String password = "root";//密码

		//通过得到字节码对象的方式加载静态代码块,从而注册驱动程序
		Class.forName("com.mysql.jdbc.Driver");
		
		//2.连接到具体的数据库
		Connection conn = DriverManager.getConnection(url, user, password);
		System.out.println(conn);
		
	}

四 JDBC接口核心的API          

|- Driver接口: 表示java驱动程序接口。所有的具体的数据库厂商要来实现此接口。
       |- connect(url, properties):  连接数据库的方法。
       url: 连接数据库的URL 
       URL语法: jdbc协议:数据库子协议://主机:端口/数据库
       user: 数据库的用户名
       password: 数据库用户密码
|- DriverManager类: 驱动管理器类,用于管理所有注册的驱动程序
        |-registerDriver(driver)  : 注册驱动类对象
        |-Connection getConnection(url,user,password);  获取连接对象

|- Connection接口: 表示java程序和数据库的连接对象。
    |- Statement createStatement() : 创建Statement对象
    |- PreparedStatement prepareStatement(String sql)  创建PreparedStatement对象
    |- CallableStatement prepareCall(String sql) 创建CallableStatement对象

|- Statement接口: 用于执行静态的sql语句
    |- int executeUpdate(String sql)  : 执行静态的更新sql语句(DDL,DML)
    |- ResultSet executeQuery(String sql)  :执行的静态的查询sql语句(DQL)

|-PreparedStatement接口:用于执行预编译sql语句
    |- int executeUpdate() : 执行预编译的更新sql语句(DDL,DML)
    |-ResultSet executeQuery()  : 执行预编译的查询sql语句(DQL)

|-CallableStatement接口:用于执行存储过程的sql语句(call xxx)
    |-ResultSet executeQuery()  : 调用存储过程的方法

|- ResultSet接口:用于封装查询出来的数据
    |- boolean next() : 将光标移动到下一行
    |-getXX() : 获取列的值

4-1 使用Statement执行sql语句

          Statement 是用来执行静态的SQL语句

                其中SQL语句分为两种:

                        一是DDL,DML (即定义,增删改),调用Statement的executeUpdate();

                                 eg.   int count = stmt.executeUpdate(sql);   只返回影响的行数,没有结果。

                         二是DQL(查),调用Statement的executeQuery();

                                   eg.    ResultSet rs = stmt.executeQuery(sql);    有返回结果。

下面给出具体例子:

        第一种SQL 以DML中的增加操作为例

public class Demo{
    // 执行DML中的插入操作
	@Test
	public void testInsert(){
		Connection conn = null;
		Statement stmt = null;
		try {
			//通过工具类获取连接对象
			conn = JdbcUtil.getConnection();
		
			//创建Statement对象
			stmt = conn.createStatement();

			//sql语句
			String sql = "INSERT INTO student(NAME,gender) VALUES('李四','女')";

			//执行sql
			int count = stmt.executeUpdate(sql);
			
			System.out.println("影响了"+count+"行");
		} catch (Exception e) {
			e.printStackTrace();
			throw new RuntimeException(e);
		} finally{
			//关闭资源
			JdbcUtil.close(conn, stmt);
		}
	}

   第二种SQL

public class Demo3 {

	@Test
	public void test1(){
		Connection conn = null;
		Statement stmt = null;
		try{
			//获取连接
			conn = JdbcUtil.getConnection();
			//创建Statement
			stmt = conn.createStatement();
			//准备sql
			String sql = "SELECT * FROM student";
			//执行sql
			ResultSet rs = stmt.executeQuery(sql);
			
			//遍历结果
			while(rs.next()){
				int id = rs.getInt("id");
				String name = rs.getString("name");
				String gender = rs.getString("gender");
				System.out.println(id+","+name+","+gender);
			}
			
		}catch(Exception e){
			e.printStackTrace();
			throw new RuntimeException(e);
		}finally{
			JdbcUtil.close(conn, stmt);
		}
	}
}

4.2 使用PreparedStatement执行sql语句

PreparedStatement 是用来执行预编译的SQL语句

                其中SQL语句和Statement一样, 分为两种:

                        一是DDL,DML (即定义,增删改),调用PreparedStatement的executeUpdate();

                                 eg.   int count = pstmt.executeUpdate();   只返回影响的行数,没有结果,注意不用传sql。

                         二是DQL(查),调用PreparedStatement的executeQuery();

                                   eg.    ResultSet rs = pstmt.executeQuery();    有返回结果。

下面给出具体例子:

        第一种SQL 以DML中的增加操作为例

public class Demo1 {

	@Test
	public void testInsert() {
		Connection conn = null;
		PreparedStatement stmt = null;
		try {
			//1.获取连接
			conn = JdbcUtil.getConnection();
			
			//2.准备预编译的sql
			String sql = "INSERT INTO student(NAME,gender) VALUES(?,?)"; //?表示一个参数的占位符
			
			//3.执行预编译sql语句(检查语法)
			stmt = conn.prepareStatement(sql);
			
			//4.设置参数值
			/**
			 * 参数一: 参数位置  从1开始
			 */
			stmt.setString(1, "李四");
			stmt.setString(2, "男");
			
			//5.发送参数,执行sql
			int count = stmt.executeUpdate();
			
			System.out.println("影响了"+count+"行");
			
		} catch (Exception e) {
			e.printStackTrace();
			throw new RuntimeException(e);
		} finally {
			JdbcUtil.close(conn, stmt);
		}
	}

第二种SQL

public void testQuery() {
		Connection conn = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		try {
			//1.获取连接
			conn = JdbcUtil.getConnection();
			
			//2.准备预编译的sql
			String sql = "SELECT * FROM student"; 
			
			//3.预编译
			stmt = conn.prepareStatement(sql);
			
			//4.执行sql
			rs = stmt.executeQuery();
			
			//5.遍历rs
			while(rs.next()){
				int id = rs.getInt("id");
				String name = rs.getString("name");
				String gender = rs.getString("gender");
				System.out.println(id+","+name+","+gender);
			}
			
		} catch (Exception e) {
			e.printStackTrace();
			throw new RuntimeException(e);
		} finally {
			//关闭资源
			JdbcUtil.close(conn,stmt,rs);
		}
	}

PreparedStatement vs Statment

                   1)语法不同:PreparedStatement可以使用预编译的sql,而Statment只能使用静态的sql

                   2)效率不同: PreparedStatement可以使用sql缓存区,效率比Statment高

                   3)安全性不同: PreparedStatement可以有效防止sql注入,而Statment不能防止sql注入。

4.3 CallableStatement执行存储过程

public class Demo1 {

	/**
	 * 调用带有输入参数的存储过程
	 * CALL pro_findById(4);
	 */
	@Test
	public void test1(){
		Connection conn = null;
		CallableStatement stmt = null;
		ResultSet rs = null;
		try {
			//获取连接
			conn = JdbcUtil.getConnection();
			
			//准备sql
			String sql = "CALL pro_findById(?)"; //可以执行预编译的sql
			
			//预编译
			stmt = conn.prepareCall(sql);
			
			//设置输入参数
			stmt.setInt(1, 6);
			
			//发送参数
			rs = stmt.executeQuery(); //注意: 所有调用存储过程的sql语句都是使用executeQuery方法执行!!!
			
			//遍历结果
			while(rs.next()){
				int id = rs.getInt("id");
				String name = rs.getString("name");
				String gender = rs.getString("gender");
				System.out.println(id+","+name+","+gender);
			}
			
		} catch (Exception e) {
			e.printStackTrace();
			throw new RuntimeException(e);
		} finally {
			JdbcUtil.close(conn, stmt ,rs);
		}
	}
	
	/**
	 * 执行带有输出参数的存储过程
	 * CALL pro_findById2(5,@NAME);
	 */
	@Test
	public void test2(){
		Connection conn = null;
		CallableStatement stmt = null;
		ResultSet rs = null;
		try {
			//获取连接
			conn = JdbcUtil.getConnection();
			//准备sql
			String sql = "CALL pro_findById2(?,?)"; //第一个?是输入参数,第二个?是输出参数
			
			//预编译
			stmt = conn.prepareCall(sql);
			
			//设置输入参数
			stmt.setInt(1, 6);
			//设置输出参数(注册输出参数)
			/**
			 * 参数一: 参数位置
			 * 参数二: 存储过程中的输出参数的jdbc类型    VARCHAR(20)
			 */
			stmt.registerOutParameter(2, java.sql.Types.VARCHAR);
			
			//发送参数,执行
			stmt.executeQuery(); //结果不是返回到结果集中,而是返回到输出参数中
			
			//得到输出参数的值
			/**
			 * 索引值: 预编译sql中的输出参数的位置
			 */
			String result = stmt.getString(2); //getXX方法专门用于获取存储过程中的输出参数
			
			System.out.println(result);

		} catch (Exception e) {
			e.printStackTrace();
			throw new RuntimeException(e);
		} finally {
			JdbcUtil.close(conn, stmt ,rs);
		}
	}
}

总结:

//创建
      Statement stmt = conn.createStatement(); // 无sql 
      PreparedStatement stmt = conn.prepareStatement(sql); // 有sql 
      CallableStatement stmt = conn.prepareCall(sql); // 有sql 

//执行
   Statement:
      int count = stmt.executeUpdate(sql);   // 有sql 
      ResultSet rs = stmt.executeQuery(sql);  // 有sql 

   PreparedStatement:
      int count = stmt.executeUpdate();
      ResultSet rs = stmt.executeQuery();

   CallableStatement:
      ResultSet rs = stmt.executeQuery();

 

 

 

 

 

 

你可能感兴趣的:(JDBC)