JDBC--(5)Statement接口、预编译语言

Statement接口

在这里插入图片描述

Statement接口作用

用于进行Java程序和数据库之间的数据传输

具体类有3个实现

Statement
用于对数据库进行通用访问,使用的是静态sql
PreparedStatement
PreparedStatement 用于预编译模板SQL语句,在运行时接受sql输入参数
CallableStatement
要访问数据库存储过程时使用,也可以接受运行时输入参数。

预编译语句

没有预编译语句时,没有预编译语句,所有的sql都是进行拼接
在这里插入图片描述
使用预编译语句时

  1. PreparedStatement 用于预编译模板SQL语句
  2. 在性能和代码灵活性上有显著地提高
  3. PreparedStatement 对象使用?作为占位符,即参数标记;
  4. 使用 setXXX( index,value) 方法将值绑定到参数中,每个参数标记是其顺序位置引用,注意 index 从 1 开始;
  5. executeQuery()executeUpdate()
    注意,它们都没有参数

executeQuery()
在这里插入图片描述
executeUpdate()
在这里插入图片描述

内部优化

在这里插入图片描述支持优化情况

  1. MySql不支持
  2. Oracle支持

更安全
可以防SQL注入

什么是sql注入
就是通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令
在这里插入图片描述

用户登录

为什么PrepareState就能够防注入
之所以PreparedStatement能防止注入,是因为它把单引号转义了,变成了\',这样一来,就无法截断SQL语句,进而无法拼接SQL语句 基本上没有办法注入了。

在这里插入图片描述
student.java

package com.iris.jdbc.domain;

public class Student  {
	Integer id;
	String name;
	Integer age;
	
	public Integer getId() {
		return id;
	}
	public void setId(Integer id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public Integer getAge() {
		return age;
	}
	public void setAge(Integer age) {
		this.age = age;
	}
	@Override
	public String toString() {
		return "Student [id=" + id + ", name=" + name + ", age=" + age + "]";
	}
}

IStudentDao.java

package com.iris.jdbc.jao;

import java.util.List;

import com.iris.jdbc.domain.Student;

public interface IStudentDao {
	//保存数据
	void save(Student stu);
	//更新指定学生
	void update(int id,Student stu);
	//删除指定学生
	void delete(int id);
	//获取指定学生
	public Student get(int id);
	//获取所有学生
	List<Student>getAll();
}

JDBCUtil.java

package com.iris.jdbc.util;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

public class JDBCUtil {
	public static String driveName =  "com.mysql.cj.jdbc.Driver";			//JAVA1.6之后可以不写此语句,根据开发环境类型而定
	public static String url = "jdbc:mysql://localhost:3306/jdbc_db?useUnicode=true&characterEncoding=UTF-8&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=UTC";		//url 数据库地址
	public static String user="root";		//user 数据库用户名
	public static String password="13718407978"	;	//password 数据库密码
	
	static{    //静态代码块
		try {
			Class.forName(JDBCUtil.driveName) ;			//JAVA1.6之后可以不写此语句,根据开发环境类型而定
		}catch (Exception e) {
			e.printStackTrace();
		}
	}
	
	public static Connection getConn() {
		try {
			Class.forName(JDBCUtil.driveName) ;			//JAVA1.6之后可以不写此语句,根据开发环境类型而定
			//连接数据库
			return  DriverManager.getConnection(JDBCUtil.url, JDBCUtil.user, JDBCUtil.password);
		}catch(Exception e) {
			e.printStackTrace();
		}
		return null;
		
	}
	public static void close(Connection conn,Statement st, ResultSet res) {
		//释放资源
		if(res !=null){
			try {
				res.close();
			}
			catch(SQLException e) {
				e.printStackTrace();
			}
		}
		if(st !=null){
			try {
				st.close();
			}
			catch(SQLException e) {
				e.printStackTrace();
			}
		}
		if(conn != null) {
			try {
				conn.close();
			}catch(SQLException e) {
				e.printStackTrace();
			}
		}
	}
}

StudentDaoImpl.java

package com.iris.jdbc.dao.impl;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;

import com.iris.jdbc.domain.Student;
import com.iris.jdbc.jao.IStudentDao;
import com.iris.jdbc.util.JDBCUtil;

public class StudentDaoImpl implements IStudentDao {

	@Override
	public void save(Student stu) {
		// TODO Auto-generated method stub

		Connection conn = null;
		PreparedStatement ps = null;
		try{
			//加载驱动
			//连接数据库
			conn = JDBCUtil.getConn();
				//创建语句
			String sql = "insert into student(name,age) values(?,?)";
			ps = conn.prepareStatement(sql);
			ps.setString(1, stu.getName());
			ps.setInt(2, stu.getAge());
			System.out.println(sql);
				//执行语句
			ps.executeUpdate();
		} catch(Exception e){
			e.printStackTrace();
		} finally {
			//释放资源
			JDBCUtil.close(conn, ps, null);
		}
	}

	@Override
	public void update(int id,Student stu) {
		// TODO Auto-generated method stub
		Connection conn = null;
		PreparedStatement ps = null;
		try{
			//加载驱动
			//连接数据库
			conn = JDBCUtil.getConn();
				//创建语句
			String sql = "update student set name=? , age=? where id =? ";
			 ps = conn.prepareStatement(sql);
			 ps.setString(1, stu.getName());
			 ps.setInt(2,stu.getAge());
			 ps.setInt(3, id);
			System.out.println(sql);
				//执行语句
			ps.executeUpdate();
		} catch(Exception e){
			e.printStackTrace();
		} finally {
			//释放资源
			JDBCUtil.close(conn, ps, null);
		}
	}
		
	

	@Override
	public void delete(int id) {
		// TODO Auto-generated method stub
		Connection conn = null;
		PreparedStatement ps = null;
		try{
			//加载驱动
			//连接数据库
			conn = JDBCUtil.getConn();
				//创建语句
			String sql = "delete from student where id = ?";
			ps = conn.prepareStatement(sql);
			ps.setInt(1, id);
			System.out.println(sql);
				//执行语句
			ps.executeUpdate();
			//System.out.println(((JdbcPreparedStatement)ps).getPreparedSql());
			
		} catch(Exception e){
			e.printStackTrace();
		} finally {
			//释放资源
			JDBCUtil.close(conn, ps, null);
		}
	}

	@Override
	public Student get(int id) {
		// TODO Auto-generated method stub
		Connection conn = null;
		PreparedStatement  ps = null;
		ResultSet res = null;
		try{
			//加载驱动
			//连接数据库
			conn = JDBCUtil.getConn();
				//创建语句
			String sql = "select * from student where id = ?";
			ps = conn.prepareStatement(sql);
			ps.setInt(1, id);
			System.out.println(sql);
				//执行语句
			res = ps.executeQuery();
			if(res.next()) {
				Student stu = new Student();
				stu.setName(res.getString("name"));
				stu.setAge(res.getInt("age"));
				stu.setId(res.getInt("id"));
				return stu;
			}
		} catch(Exception e){
			e.printStackTrace();
		} finally {
			//释放资源
			JDBCUtil.close(conn, ps, res);
		}
		return null;
	}

	@Override
	public List<Student> getAll() {
		// TODO Auto-generated method stub
		Connection conn = null;
		Statement st = null;
		ResultSet res = null;
		try{
			//连接数据库
			conn = JDBCUtil.getConn();
				//创建语句
			st = conn.createStatement();
			String sql = "select * from student";
			System.out.println(sql);
				//执行语句
			res = st.executeQuery(sql);
			//创建集合
			List<Student> list = new ArrayList<Student>();
			while(res.next()) {
				Student stu = new Student();
				stu.setName(res.getString("name"));
				stu.setAge(res.getInt("age"));
				stu.setId(res.getInt("id"));
				list.add(stu);
			}
			return list;
		} catch(Exception e){
			e.printStackTrace();
		} finally {
			//释放资源
			JDBCUtil.close(conn, st, res);
		}
		return null;
	}
}

StudentDaoTest.java

package com.iris.jdbc.test;

import java.util.List;

import org.junit.Test;

import com.iris.jdbc.dao.impl.StudentDaoImpl;
import com.iris.jdbc.domain.Student;
import com.iris.jdbc.jao.IStudentDao;

public class StudentDaoTest {

	@Test
	public void save(){
		//创建一个学生
		Student stu = new Student();
		stu.setName ("张三");
		stu.setAge(20);
		IStudentDao dao = new StudentDaoImpl();   //多态
		dao.save(stu);
	}
	@Test
	public void delete() {
		IStudentDao dao = new StudentDaoImpl();   //多态
		dao.delete(6);
	}
	@Test
	public void update() {
		IStudentDao dao = new StudentDaoImpl();   //多态
		Student stu = new Student();
		stu.setName("鲁班");
		stu.setAge(7);
		dao.update(3, stu);
	}
	@Test
	public void get() {
		IStudentDao dao = new StudentDaoImpl();   //多态
		Student stu= dao.get(3);
		System.out.println(stu);   //添加tostring方法
	}
	public void getAll() {
		IStudentDao dao = new StudentDaoImpl();   //多态
		List<Student> allStu = dao.getAll();
		System.out.println(allStu);   //添加tostring方法
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值