JDBC基础入门,常用操作大全!

JDBC基础入门,常用操作大全!

相关插件以及源码均上传至云盘:
链接:https://pan.baidu.com/s/1oTatOzhGUNi0leLc3Dx22A
提取码:2c17

  • Statement接口
    由createStatement创建,用于发送简单的SQL语句(不带参数);存在SQL注入
  • PreparedStatement
    继承自Statement接口,由preparedStatement创建,用于发送含有一个或者多个输入参数的sql语句,PreparedStatement对象比Statement对象的效率更高,并且可以防止SQL注入。一般都是用PreparedStatement;
  • CallableStatement
    继承自PreparedStatement。由prePareCall创建,用于调用存储过程
  • 常用的Statement方法
    1 execute():运行语句,返回是否由结果集
    2 executeQuery:运行select语句,返回ResultSet结果集
    3 executeUpdate():运行insert/update/delete操作,返回更新的行数。

测试JDBC:
      原表中存在一行数据:
在这里插入图片描述

package edu.hue.jk.mysql;

import java.lang.management.ManagementPermission;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.sql.Statement;
/**
 * JDBC的基础使用!
 * @author 超爱学习的可琛同学
 *
 */
public class JdbcTest01 {

	public static void main(String[] args) throws SQLException {
		try {
			//加载驱动类
			Class.forName("com.mysql.jdbc.Driver");
		} catch (ClassNotFoundException e) {
			// TODO 自动生成的 catch 块
			e.printStackTrace();
		}
		//建立连接
		//3306为mysql特定端口 jdbctest为我创建的数据库名
		//第一个root为用户名 第二个root 为密码
		Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/jdbctest", "root", "root");
		
		String sql = "insert into tb_dept (user,pwd) values('admin','d123456');";
		//存在SQL注入问题,一般都是用PreparedStatement类,
		Statement statement = conn.createStatement(); 
		statement.execute(sql);

	}

}

      可以看见数据成功插入到mysql中了
在这里插入图片描述

什么是SQL注入呢?
正常情况:我如果要删除id=1的数据:
在这里插入图片描述
若一些恶意用户这样输入呢?
在这里插入图片描述
这就很恐怖了 1=1 为true 执行后,必然我们数据库表直接清空!
在这里插入图片描述
这就是一个SQL注入简单的例子!

2.PreparedStatement

package edu.hue.jk.mysql;

import java.lang.management.ManagementPermission;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.PseudoColumnUsage;
import java.sql.SQLException;
import java.sql.Statement;
/**
 * JDBC的基础使用!
 * @author 超爱学习的可琛同学
 *
 */
public class JdbcTest01 {

	public static void main(String[] args) throws SQLException {
		try {
			//加载驱动类
			Class.forName("com.mysql.jdbc.Driver");
		} catch (ClassNotFoundException e) {
			// TODO 自动生成的 catch 块
			e.printStackTrace();
		}
		//建立连接
		Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/jdbctest", "root", "root");
		String sql ="insert into tb_dept (user,pwd) values(?,?)";//?为占位符,由预处理机制,有效放置SQL注入;
		PreparedStatement pStatement = conn.prepareStatement(sql);
//		pStatement.setString(1, "admin");
//		pStatement.setString(2, "123456");
//		pStatement.execute();
		
		//还可以直接用Object
		pStatement.setObject(1, "achen");
		pStatement.setObject(2, 654321);
		pStatement.execute();
	
		

	}

}

在这里插入图片描述

2.1ResultSet的使用 :返回一个结果集

package edu.hue.jk.mysql;

import java.lang.management.ManagementPermission;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.PseudoColumnUsage;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
/**
 * JDBC的基础使用!
 * ResultSet的使用
 * @author 超爱学习的可琛同学
 *
 */
public class JdbcTest02 {
	static Connection conn = null;
	 static ResultSet resultSet = null;
	 static PreparedStatement pStatement = null;

	public static void main(String[] args) throws SQLException {
		try {
			//加载驱动类
			Class.forName("com.mysql.jdbc.Driver");
		
		//建立连接
		conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/jdbctest", "root", "root");
		String sql ="select * from tb_dept where id > ?";//?为占位符,由预处理机制,有效放置SQL注入;
		 pStatement = conn.prepareStatement(sql);
		pStatement.setObject(1, 5);

		  resultSet = pStatement.executeQuery();//返回一个结果集
		 
		 //存在下一行返回true 并且游标指向下一行
		 /*/
		  * ResultSet提供的检索不同类型字段的方法,常用的有:
		  * getString();获得在数据库里是varchar、char等数据类型的对象;
		  * getFloat();
		  * getDate();
		  * getBoolean();
		  */
		 while(resultSet.next()) { 
			 System.out.println(resultSet.getInt(1)+"--"+resultSet.getString(2)+"--"+resultSet.getString(3) );
			 
		 } 
		} catch (ClassNotFoundException e) {
			// TODO 自动生成的 catch 块
			e.printStackTrace();
		}finally {
			
			//依序关闭 ResultSet->Statement ->Connection
			if(resultSet != null) {
				resultSet.close();				
			}
			if(pStatement != null) {
				pStatement.close();				
			}
			if(conn != null) {
				conn.close();				
			}
		}
		

	}

}

在这里插入图片描述

3.数据库中时间的处理

package edu.hue.jk.mysql;

import java.lang.management.ManagementPermission;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.PseudoColumnUsage;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.sql.Timestamp;
/**
 * JDBC的基础使用!
 * 
 * 时间的基本处理
 * @author 超爱学习的可琛同学
 *
 */
public class JdbcTest04 {
	static Connection conn = null;
	 static Statement stms = null;
	 static PreparedStatement pStatement = null;

	public static void main(String[] args) throws SQLException {
		try {
			//加载驱动类
			Class.forName("com.mysql.jdbc.Driver");
		
		//建立连接
		conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/jdbctest", "root", "root");
		String sql = "insert into tb_dept (user,pwd,regTime,lastLoginTime) values(?,?,?,?)";
		pStatement = conn.prepareStatement(sql);
		pStatement.setObject(1, "admin");
		pStatement.setObject(2, "admin");
		pStatement.setDate(3, new java.sql.Date(System.currentTimeMillis()));
		pStatement.setTimestamp(4, new Timestamp(System.currentTimeMillis()));
		//如果需要插入指定日期可以使用calendar类或者是 dataformat 字符串转时间
		pStatement.executeUpdate();
		System.out.println("插入一行数据");
		} catch (ClassNotFoundException e) {
			// TODO 自动生成的 catch 块
			e.printStackTrace();
		}finally {
			
			//依序关闭 ResultSet->Statement ->Connection

			if(stms != null) {
				stms.close();				
			}
			if(conn != null) {
				conn.close();				
			}
		}
		

	}

}

在这里插入图片描述

4.JDBC 批处理Batch :插入两万行数据

package edu.hue.jk.mysql;

import java.lang.management.ManagementPermission;
import java.sql.Connection;
import java.sql.Date;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.PseudoColumnUsage;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.sql.Timestamp;
/**
 * JDBC的基础使用!
 * 批处理的基本使用
 * PreparedStatement有预处理过程,处理批处理占用资源太大,所以用Statement
 * @author 超爱学习的可琛同学
 *
 */
public class JdbcTest03 {
	static Connection conn = null;
	 static Statement stms = null;

	public static void main(String[] args) throws SQLException {
		try {
			//加载驱动类
			Class.forName("com.mysql.jdbc.Driver");
		
		//建立连接
		conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/jdbctest", "root", "root");
		conn.setAutoCommit(false);//这里设置手动提交事务
		long start = System.currentTimeMillis();//开始时间
		stms = conn.createStatement();
		
		for(int i =0 ; i<20000;i++) {
			java.sql.Date date = new java.sql.Date(System.currentTimeMillis());
			Timestamp timestamp = new Timestamp(System.currentTimeMillis());
			stms.addBatch("insert into tb_dept (user,pwd,regTime,lastLoginTime) values ('user"+ i +"',123456,'"+date+"','"+timestamp
				+"')");
		}
		stms.executeBatch();
		conn.commit();//提交事务
		long end = System.currentTimeMillis();//开始时间
		System.out.println("插入20000行数据 ,耗时(毫秒):" + (end-start));

		} catch (ClassNotFoundException e) {
			// TODO 自动生成的 catch 块
			e.printStackTrace();
		}finally {
			
			//依序关闭 ResultSet->Statement ->Connection

			if(stms != null) {
				stms.close();				
			}
			if(conn != null) {
				conn.close();				
			}
		}
		

	}

}

![在这里插入图片描述](https://img-blog.csdnimg.cn/20190719150538577 .png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MzA3MDMzMQ==,size_16,color_FFFFFF,t_70)
5.查询指定时间段的信息

package edu.hue.jk.mysql;

import java.lang.management.ManagementPermission;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.PseudoColumnUsage;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.sql.Timestamp;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
/**
 * JDBC的基础使用!
 * 
 * 查询指定段时间信息
 * @author 超爱学习的可琛同学
 *
 */
public class JdbcTest05 {
	static Connection conn = null;
	 static PreparedStatement pStatement = null;
	 static ResultSet resultSet = null;
	 public static long convertTime(String date) {
		 
		 DateFormat dFormat = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
		 try {
			return dFormat.parse(date).getTime();
		} catch (ParseException e) {
			// TODO 自动生成的 catch 块
			e.printStackTrace();
		} 
		 return 0;
		
	}
	 
	public static void main(String[] args) throws SQLException {
		try {
			//加载驱动类
			Class.forName("com.mysql.jdbc.Driver");
		
		//建立连接
		conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/jdbctest", "root", "root");
		pStatement = conn.prepareStatement( "select * from tb_dept where lastLoginTime > ? and lastLoginTime < ? ;");
		java.sql.Date start = new java.sql.Date (convertTime("2019-7-19 10:29:00"));
		java.sql.Date  end = new java.sql.Date (convertTime("2019-7-20 10:29:00"));
		pStatement.setObject(1, start);
		pStatement.setObject(2, end);
		resultSet = pStatement.executeQuery();
		while (resultSet.next()) {
			System.out.println(resultSet.getInt("Id")+"--"+resultSet.getString("user")+"--"+resultSet.getString("pwd")+"--"+resultSet.getTimestamp("lastLoginTime"));
			
		}
		System.out.println("插入一行数据");
		} catch (ClassNotFoundException e) {
			// TODO 自动生成的 catch 块
			e.printStackTrace();
		}finally {
			
			//依序关闭 ResultSet->Statement ->Connection

		
			if(conn != null) {
				conn.close();				
			}
		}
		

	}

}

在这里插入图片描述
6.对JDBC进行简单的封装

package edu.hue.jk.mysql;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
/**
 * 简单封装jdbc中加载驱动类和close方法
 * @author Mr . Xu's  PC
 *
 */
public class JDBCUtil {
	public static Connection getMySqlConnect() {
		try {
			//加载驱动类
			Class.forName("com.mysql.jdbc.Driver");
			return DriverManager.getConnection("jdbc:mysql://localhost:3306/jdbctest", "root", "root");
		} catch (Exception e) {
			// TODO 自动生成的 catch 块
			e.printStackTrace();
		}
		//建立连接
		return null;
	}
	
	public static void close(ResultSet resultSet,PreparedStatement pStatement,Connection conn) {
		if(resultSet != null) {
			try {
				resultSet.close();
			} catch (SQLException e) {
				// TODO 自动生成的 catch 块
				e.printStackTrace();
			}				
		}
		if(pStatement != null) {
			try {
				pStatement.close();
			} catch (SQLException e) {
				// TODO 自动生成的 catch 块
				e.printStackTrace();
			}				
		}
		if(conn != null) {
			try {
				conn.close();
			} catch (SQLException e) {
				// TODO 自动生成的 catch 块
				e.printStackTrace();
			}				
		}
		
	}
	
	public static void close(PreparedStatement pStatement,Connection conn) {
	
		if(pStatement != null) {
			try {
				pStatement.close();
			} catch (SQLException e) {
				// TODO 自动生成的 catch 块
				e.printStackTrace();
			}				
		}
		if(conn != null) {
			try {
				conn.close();
			} catch (SQLException e) {
				// TODO 自动生成的 catch 块
				e.printStackTrace();
			}				
		}
		
	}
	
	public static void close(Statement statement,Connection conn) {
		if(statement != null) {
			try {
				statement.close();
			} catch (SQLException e) {
				// TODO 自动生成的 catch 块
				e.printStackTrace();
			}				
		}
		
		if(conn != null) {
			try {
				conn.close();
			} catch (SQLException e) {
				// TODO 自动生成的 catch 块
				e.printStackTrace();
			}				
		}
		
	}
	
	public static void close(Connection conn) {
	
		if(conn != null) {
			try {
				conn.close();
			} catch (SQLException e) {
				// TODO 自动生成的 catch 块
				e.printStackTrace();
			}				
		}
		
	}

}

6.2 资源文件properties处理JDBC连接信息

mysqlDriver=com.mysql.jdbc.Driver
mysqlURL=jdbc\:mysql://localhost\:3306/jdbctest
mysqlUser=root
mysqlPwd=root
oravleDriver=oracle.jdbc.driver.OracleDriver
oracleURL=jdbc:oracle:thin:@localhost:1521:orcl
oracleUser=scott
oraclePwd=tiger
package edu.hue.jk.mysql;

import java.io.IOException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;
/**
 * 简单封装jdbc中加载驱动类和close方法
 * @author 超爱学习的可琛同学
 *
 */
public class JDBCUtil {
	
	static Properties properties = null;//可以帮助读取和处理资源文件中的信息
	static {//加载JDBCUtil时自动被调用
		properties = new Properties();
		
		try {
			properties.load(Thread.currentThread().getContextClassLoader().getResourceAsStream("db.properties"));
		} catch (IOException e) {
			// TODO 自动生成的 catch 块
			e.printStackTrace();
		}
		
	}
	public static Connection getMySqlConnect() {
		try {
			//加载驱动类
			Class.forName(properties.getProperty("mysqlDriver"));
			return DriverManager.getConnection(properties.getProperty("mysqlURL"), properties.getProperty("mysqlUser"), properties.getProperty("mysqlPwd"));
		} catch (Exception e) {
			// TODO 自动生成的 catch 块
			e.printStackTrace();
		}
		//建立连接
		return null;
	}
	
	public static void close(ResultSet resultSet,PreparedStatement pStatement,Connection conn) {
		if(resultSet != null) {
			try {
				resultSet.close();
			} catch (SQLException e) {
				// TODO 自动生成的 catch 块
				e.printStackTrace();
			}				
		}
		if(pStatement != null) {
			try {
				pStatement.close();
			} catch (SQLException e) {
				// TODO 自动生成的 catch 块
				e.printStackTrace();
			}				
		}
		if(conn != null) {
			try {
				conn.close();
			} catch (SQLException e) {
				// TODO 自动生成的 catch 块
				e.printStackTrace();
			}				
		}
		
	}
	
	public static void close(PreparedStatement pStatement,Connection conn) {
	
		if(pStatement != null) {
			try {
				pStatement.close();
			} catch (SQLException e) {
				// TODO 自动生成的 catch 块
				e.printStackTrace();
			}				
		}
		if(conn != null) {
			try {
				conn.close();
			} catch (SQLException e) {
				// TODO 自动生成的 catch 块
				e.printStackTrace();
			}				
		}
		
	}
	
	public static void close(Statement statement,Connection conn) {
		if(statement != null) {
			try {
				statement.close();
			} catch (SQLException e) {
				// TODO 自动生成的 catch 块
				e.printStackTrace();
			}				
		}
		
		if(conn != null) {
			try {
				conn.close();
			} catch (SQLException e) {
				// TODO 自动生成的 catch 块
				e.printStackTrace();
			}				
		}
		
	}
	
	public static void close(Connection conn) {
	
		if(conn != null) {
			try {
				conn.close();
			} catch (SQLException e) {
				// TODO 自动生成的 catch 块
				e.printStackTrace();
			}				
		}
		
	}

}

package edu.hue.jk.mysql;

import java.lang.management.ManagementPermission;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.PseudoColumnUsage;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
/**
 * 测试JDBCUtil的使用
 * 
 * @author 超爱学习的可琛同学
 *
 */
public class TestJdbcUtil {
	static Connection conn = null;
	 static ResultSet resultSet = null;
	 static PreparedStatement pStatement = null;

	public static void main(String[] args) throws SQLException {
		
		Connection connection = JDBCUtil.getMySqlConnect();
		
	}
		

}

7 ORM原理,Map与List合作封装多条信息

基本思想:Map存键值对,再将map存入list

package edu.hue.jk.mysql;

/**
 * 这是一个Javabean
 * @author Mr . Xu's  PC
 *
 */
public class Emp {
	private String uname;
	private int age;
	private double salary;
	public String getUname() {
		return uname;
	}
	public void setUname(String uname) {
		this.uname = uname;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	public double getSalary() {
		return salary;
	}
	public void setSalary(double salary) {
		this.salary = salary;
	}
	@Override
	public String toString() {
		return "Emp [uname=" + uname + ", age=" + age + ", salary=" + salary + "]";
	}
	public Emp(String uname, int age, double salary) {
		super();
		this.uname = uname;
		this.age = age;
		this.salary = salary;
	}
	public Emp() {
		super();
	}
	

}

package edu.hue.jk.mysql;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
 * ORM:基本思想 用map键值对存 uname ,age等等,再将map存入list
 * @author Mr . Xu's  PC
 *
 */
public class JdbcTestORM {
	static PreparedStatement pStatement = null;
	static ResultSet resultSet = null;
	static Connection conn = null;
	static List<Map<String, Object>> lists;
	public static void main(String[] args) {
		// TODO 自动生成的方法存根
		conn = JDBCUtil.getMySqlConnect();
		 String sql = "select * from emp";
		 try {
				
			 lists = new ArrayList<>();
			pStatement = conn.prepareStatement(sql);
			resultSet = pStatement.executeQuery();
			
			while (resultSet.next()) {
				 Map<String,Object> map = new HashMap<>();
				map.put("uname", resultSet.getObject("uname"));
				map.put("age", resultSet.getObject("age"));
				map.put("salary", resultSet.getObject("salary"));
				lists.add(map);
			}
			
			for(Map<String, Object> emp: lists) {
				System.out.println(emp);
			}
		} catch (SQLException e) {
			// TODO 自动生成的 catch 块
			e.printStackTrace();
		}
		 
		
	}

}

在这里插入图片描述

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值