简单讲讲JDBC

JDBC的本质

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAWFVOfk1MRg==,size_20,color_FFFFFF,t_70,g_se,x_16

 

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAWFVOfk1MRg==,size_20,color_FFFFFF,t_70,g_se,x_16

 

JDBC是一套接口,数据库厂商实现类,降耦合,提高拓展性

创建不同的JDBC对象可通过反射

实现类得去数据库官网下载后jar包导入到环境变量classpath中

.;路径

 

JDBC编程的6个步骤

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAWFVOfk1MRg==,size_20,color_FFFFFF,t_70,g_se,x_16

package jdbc_study;

/*
 * jdbc mysql数据库
 */
import java.sql.Connection;
import java.sql.DriverManager;

import com.mysql.jdbc.Statement;

public class testJDBC02 {
	public static void main(String[] args) throws Exception{
		//注册驱动
		
		DriverManager.registerDriver(new com.mysql.jdbc.Driver());
		//获取连接
		String url = "jdbc:mysql://127.0.0.1:3306/xiaoqiu?useSSL=false";//ip地址可更改,连接别人的数据库
							/*
							 * jdbc:mysql://协议
							 * 127.0.0.1 ip地址
							 * 3306端口号
							 * xiaoqiu,mysql数据库库名
							 */
		String user= "root";
		String password="" ;
		Connection conn = DriverManager.getConnection(url, user, password);
		System.out.println("mysql数据库已连接"+conn);
		
		//获取数据库操作对象
		java.sql.Statement statement=conn.createStatement();
		String sql ="delete from t_xiaoqiu where name='xiaoqiu'";
		//执行sql语句
		int count=statement.executeUpdate(sql);//专门执行DML语句的方法
		System.out.println(count==1?"插入成功":"插入失败");//count表示形象表中记录的条数
		if (statement!=null) {
			statement.close();
		}
		if (conn!=null) {
			conn.close();	
		}
	}
}

 

注册驱动常用方法

	Class.forName("com.mysql.jdbc.Driver");//forname方法会加载这个类,执行static代码块中的内容,因为是字符串可以写到配置文件中
	try {
	Connection conn= DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/xiaoqiu?useSSL=false","root","");
	System.out.println(conn);

 

处理增删改

package jdbc_study;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Collection;
import java.util.ResourceBundle;

/*
 * 从配置文件中读取
 */
public class testJDBC05 {
	public static void main(String[] args) {
		ResourceBundle bundle =ResourceBundle.getBundle("jdbc_study/JDBC");
		String driver=bundle.getString("driver");
		String url=bundle.getString("url");
		String user=bundle.getString("user");
		String password=bundle.getString("password");
		try {
			Class.forName(driver);
			Statement statement =null;
			Connection conn =null;
			try {
				conn =DriverManager.getConnection(url,user,password);
				statement = conn.createStatement();
				String sql="insert t_xiaoqiu(name,sex) values('xiaoqiu',1)";
				statement.executeUpdate(sql);
			} catch (SQLException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}finally {
				if (statement!=null) {
					try {
						statement.close();
					} catch (SQLException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}
				}
				if (conn!=null) {
					try {
						conn.close();
					} catch (SQLException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}
				}
			}
		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
}

通过调用statement.executeupdate(sql)方法可以执行,返回int型数据表示该sql语句对表内容条数的变化

Insert update delete

通过调用statement.executequery(sql)返回一个resultset对象,通过调用resultset.getString方法可以得到每一行的字段数据

Resultset.next()光标判断下一行是否为空,通过while循环来遍历整个查询结果

 

 

JDBC->的配置文件

driver=com.mysql.jdbc.Driver

url=jdbc:mysql://127.0.0.1:3306/你的库名?useSSL=false

user=root

password=******

 

处理查询结果集

package jdbc_study;

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

/*
 * 处理查询结果集
 * resultset通过statement.executequery(sql);
 */
public class testJDBC06 {
	public static void main(String[] args) {
		ResourceBundle bundle = ResourceBundle.getBundle("jdbc_study/JDBC");
		String driver = bundle.getString("driver");
		String url = bundle.getString("url");
		String user = bundle.getString("user");
		String password = bundle.getString("password");
		Connection conn=null;
		Statement statement=null;
		ResultSet rs=null;
		try {
			Class.forName(driver);
			conn=DriverManager.getConnection(url, user, password);
			statement=conn.createStatement();
			String sql = "select * from emp";
			rs=statement.executeQuery(sql);
			while (rs.next()) {
				/*
				 * 除了用String类型取出之外,还能用特定的类型取出
				 */
				//用列的下标
				String empno=rs.getString(1);
				String ename=rs.getString(2);
				String job=rs.getString(3);	
				System.out.println(empno+"|"+ename+"|"+job);
				/*
				 *	以列的名字查询
				 *	如果在select语句中对字段的名称重命名了需要传入重命名后的字段名
				 */
//				String empno1=rs.getString("empno");
//				String ename1=rs.getString("ename");
//				String job1=rs.getString("job");	
//				System.out.println(empno1+"|"+ename1+"|"+job1);
			}
		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}finally {
			if (rs!=null) {
				try {
					rs.close();
				} catch (SQLException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
			if (statement!=null) {
				try {
					statement.close();
				} catch (SQLException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
			if (conn!=null) {
				try {
					conn.close();
				} catch (SQLException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
		}
		
	}
}

 

SQL注入

package jdbc_study;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.HashMap;
/*
 *	写一个登录系统
 *	请输入用户名
	xiaoqiu
	请输入密码
	xq' or '1'='1
 *
 */
import java.util.Map;
import java.util.ResourceBundle;
import java.util.Scanner;

import com.mysql.jdbc.Statement;

public class user_login {
	public static void main(String[] args) {
		user_login login=new user_login();
		Map map=login.InitLogin();
		System.out.println(login.loginsuccess(map));
	}
	private Map<String,String> InitLogin() {//初始化登录界面
		Map map = new HashMap<>();	
		Scanner sc = new Scanner(System.in);
		System.out.println("请输入用户名");
		String loginName=sc.nextLine();
		System.out.println("请输入密码");
		String loginPwd=sc.nextLine();
		map.put("loginName",loginName);
		map.put("loginPwd",loginPwd);
		return map;
	}
	private boolean loginsuccess(Map<String, String> map) {
		ResourceBundle bundle = ResourceBundle.getBundle("jdbc_study/JDBC");
		String driver= bundle.getString("driver");
		String url = bundle.getString("url");
		String user = bundle.getString("user");
		String password = bundle.getString("password");
		Connection conn=null;
		ResultSet rs=null;
		java.sql.Statement statement=null;
		boolean loginSuccess=false;
		try {
			String loginName = map.get("loginName");
			String loginPwd = map.get("loginPwd");
			conn = DriverManager.getConnection(url,user,password);
			statement=conn.createStatement();
			String sql="select * from t_user where loginName='"+loginName+"'"+"and loginPwd='"+loginPwd+"'";
			rs=statement.executeQuery(sql);
			if(rs.next()) {
				loginSuccess=true;
			}
			return loginSuccess;
		} catch (SQLException e) {
			e.printStackTrace();
		}finally {
			if (rs!=null) {
				try {
					rs.close();
				} catch (SQLException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
			if (statement!=null) {
				try {
					statement.close();
				} catch (SQLException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
			if (conn!=null) {
				try {
					conn.close();
				} catch (SQLException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
		}
		return loginSuccess;
	}
}

 

解决SQL注入

使用preparedStatement

package jdbc_study;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.HashMap;
import java.util.Map;
import java.util.ResourceBundle;
import java.util.Scanner;

/*
 * 解决sql注入
 */
public class user_login2 {
	public static void main(String[] args) {
		user_login2 login=new user_login2();
		Map map=login.InitLogin();
		System.out.println(login.loginsuccess(map));
	}
	private Map<String,String> InitLogin() {//初始化登录界面
		Map map = new HashMap<>();	
		Scanner sc = new Scanner(System.in);
		System.out.println("请输入用户名");
		String loginName=sc.nextLine();
		System.out.println("请输入密码");
		String loginPwd=sc.nextLine();
		map.put("loginName",loginName);
		map.put("loginPwd",loginPwd);
		System.out.println(map);
		return map;
	}
	private boolean loginsuccess(Map<String, String> map) {
		ResourceBundle bundle = ResourceBundle.getBundle("jdbc_study/JDBC");
		String driver= bundle.getString("driver");
		String url = bundle.getString("url");
		String user = bundle.getString("user");
		String password = bundle.getString("password");
		Connection conn=null;
		ResultSet rs=null;
		java.sql.PreparedStatement ps=null;
		boolean loginSuccess=false;
		try {
			String loginName = map.get("loginName");
			String loginPwd = map.get("loginPwd");
			conn = DriverManager.getConnection(url,user,password);	
			String sql="select * from t_user where loginName= ? and loginPwd= ?";
			//select * from t_user where loginName='xiaoqiu' and loginPwd='123';
			ps=conn.prepareStatement(sql);
			ps.setString(1,loginName);
			ps.setString(2,loginPwd);
			rs=ps.executeQuery();
			if (rs.next()) {
				loginSuccess=true;
			}
			return loginSuccess;
		} catch (SQLException e) {
			e.printStackTrace();
		}finally {
			if (rs!=null) {
				try {
					rs.close();
				} catch (SQLException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
			if (ps!=null) {
				try {
					ps.close();
				} catch (SQLException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
			if (conn!=null) {
				try {
					conn.close();
				} catch (SQLException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
		}
		return loginSuccess;
	}
}

 JDBC处理事务

在JDBC中,默认执行一条DML语句,自动提交

 

package jdbc_study;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.util.ResourceBundle;

/*
 * 测试事务
 */
public class testJDBC09 {
	public static void main(String[] args) {
		Connection conn = null;
		PreparedStatement ps = null;
		ResourceBundle bundle = ResourceBundle.getBundle("jdbc_study/JDBC");
		String driver= bundle.getString("driver");
		String url = bundle.getString("url");
		String user = bundle.getString("user");
		String password = bundle.getString("password");
		try {
			Class.forName(driver);
			conn=DriverManager.getConnection(url,user,password);
			String sql ="update t_act set balance=? where actno=?";
			ps=conn.prepareStatement(sql);
			ps.setDouble(1,0);
			ps.setString(2,"111");
			int count=ps.executeUpdate();
			ps.setDouble(1,30000);
			ps.setString(2,"222");
			count+=ps.executeUpdate();
			System.out.println(count==2?"转账成功":"转账失败");
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
}

 

如果一条DML语句执行成功后出现异常,下面的语句就都不能执行,但数据已经发生了更改,需要开启事务

 

package jdbc_study;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.util.ResourceBundle;

/*
 * 测试事务
 */
public class testJDBC09 {
	public static void main(String[] args) {
		Connection conn = null;
		PreparedStatement ps = null;
		ResourceBundle bundle = ResourceBundle.getBundle("jdbc_study/JDBC");
		String driver= bundle.getString("driver");
		String url = bundle.getString("url");
		String user = bundle.getString("user");
		String password = bundle.getString("password");
		try {
			Class.forName(driver);
			conn=DriverManager.getConnection(url,user,password);
			conn.setAutoCommit(false);//关闭自动提交机制
			String sql ="update t_act set balance=? where actno=?";
			ps=conn.prepareStatement(sql);
			ps.setDouble(1,0);
			ps.setString(2,"111");
			int count=ps.executeUpdate();
			ps.setDouble(1,30000);
			ps.setString(2,"222");
			count+=ps.executeUpdate();
			System.out.println(count==2?"转账成功":"转账失败");
			conn.commit();//提交
		} catch (Exception e) {
			try {
				conn.rollback();//如果出现异常,进行回滚
			} catch (SQLException e1) {
				// TODO Auto-generated catch block
				e1.printStackTrace();
			}
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
}

 

 

乐观锁和悲观锁

 

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAWFVOfk1MRg==,size_20,color_FFFFFF,t_70,g_se,x_16

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
clickhouse 的jdbc官方驱动: https://clickhouse.com/docs/zh/interfaces/jdbc/ 官方驱动源码:https://github.com/ClickHouse/clickhouse-jdbc 本资源为利用clickhouse的jdbc官方驱动 封装完整的增删改查示例。 修饰符和类型 方法 说明 void batchInsertData(clickhouse.service.impl.ClickHouseWrap clickHouseWrap, String tableName, List<Map<String,Object>> fieldValues) 批量插入数据 void batchInsertData(String tableName, List<Map<String,Object>> fieldValues) 批量插入数据 void closeDataBase(clickhouse.service.impl.ClickHouseWrap clickHouseWrap) 关闭数据库 int deleteData(clickhouse.service.impl.ClickHouseWrap clickHouseWrap, String tableName, String clause) 删除数据 int deleteData(String tableName, String clause) 删除数据 clickhouse.service.impl.ClickHouseWrap getClickHouseWrap() 获取数据库代理 List<Map<String,Object>> getListMapFromSql(clickhouse.service.impl.ClickHouseWrap clickHouseWrap, String sql) 根据sql查询数据 List<Map<String,Object>> getListMapFromSql(String sql) 根据sql查询数据 void insertData(clickhouse.service.impl.ClickHouseWrap clickHouseWrap, String tableName, Map<String,Object> fieldValues) 插入单条数据 void insertData(String tableName, Map<String,Object> values) 向指定表插入一条数据 int updateData(clickhouse.service.impl.ClickHouseWrap clickHouseWrap, String tableName, Map<String,Object> updateValues, String clause) 修改数据(mergetree引擎) int updateData(String tableName, Map<String,Object> updateValues, String clause) 修改数据(mergetree引擎)

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

XUN~MLF

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值