文章目录
- 入门案例
- DriverManager
- Connection
- Statement
- ResultSet
- PreparedStatement
- 数据库连接池
- 完整代码
入门案例
package jdbc;
import java.sql.*;
public class connectionTest {
public static void main(String[] args) throws ClassNotFoundException, SQLException {
//1.注册驱动
Class.forName("com.mysql.jdbc.Driver");
//2.获取连接
String url="jdbc:mysql:///test2?useSSL=false";
String username="root";
String password="123456";
Connection conn= DriverManager.getConnection(url,username,password);
//3.定义sql
String sql ="update sc set Grade=95 where Sno=15202101";
//4.获取执行sql的对象Statement
Statement stmt=conn.createStatement();
//5.执行sql
int cout=stmt.executeUpdate(sql);//受影响行数
//6.处理结果
System.out.println(cout);
//7.释放资源
stmt.close();
conn.close();
}
}
DriverManager
驱动管理类,作用:1. 注册驱动 2. 获取数据库连接
- 注册驱动:MySql 5之后的注册驱动可以不写,所以上面的代码注册驱动部分可以省略。
- 获取连接
Connection conn=DriverManager.getConnection(url,username,password);
url:连接路径,语法 jdbc:mysql://ip地址(域名):端口号/数据库名称?参数键值对1&参数键值对2…
示例:jdbc:mysql://127.0.0.1:3306/test2
user:数据库用户名 password:数据库密码
Connection
数据库连接对象,作用:
1.获取执行SQL的对象 2.管理事物
//获取连接conn
Connection conn=DriverManager.getConnection(url,username,password);
//用conn获取sql的执行对象stmt
Statement stmt=conn.createStatement();
import java.sql.*;
public class connectionTest {
public static void main(String[] args) throws ClassNotFoundException, SQLException {
//1.获取连接
String url="jdbc:mysql:///test2?useSSL=false";
String username="root";
String password="123456";
Connection conn= DriverManager.getConnection(url,username,password);
//2.定义sql
String sql1 ="update sc set Grade=95 where Sno=15202101";
String sql2 ="update sc set Grade=75 where Sno=15202102";
//3.获取执行sql的对象Statement
Statement stmt=conn.createStatement();
try {
//开启事物
conn.setAutoCommit(false);//改为手动提交
//4.执行sql
int cout1=stmt.executeUpdate(sql1);
int i=3/0;
int cout2=stmt.executeUpdate(sql2);
//5.处理结果
System.out.println(cout1);
System.out.println(cout2);
//提交事物
conn.commit();
}catch (Exception throwables){
conn.rollback();//回滚到开启事物那里
throwables.printStackTrace();
}
//6.释放资源
stmt.close();
conn.close();
}
}
Statement
作用:执行SQL语句。
DML:对数据的增删改 DDL:对表和数据库的增删改 DQL:对数据的查询
//对数据的增删改
public class connectionTest {
public static void main(String[] args) throws ClassNotFoundException, SQLException {
//1.获取连接
String url="jdbc:mysql:///test2?useSSL=false";
String username="root";
String password="123456";
Connection conn= DriverManager.getConnection(url,username,password);
//2.定义sql
String sql ="update sc set Grade=95 where Sno=15202101";
//3.获取执行sql的对象Statement
Statement stmt=conn.createStatement();
//4.执行sql
int cout=stmt.executeUpdate(sql);
//5.处理结果
if(cout>0){
System.out.println("修改成功");
}else{
System.out.println("修改失败");
}
//6.释放资源
stmt.close();
conn.close();
}
}
//对数据库和表的增删改
public class connectionTest {
public static void main(String[] args) throws ClassNotFoundException, SQLException {
//1.获取连接
String url="jdbc:mysql:///test2?useSSL=false";
String username="root";
String password="123456";
Connection conn= DriverManager.getConnection(url,username,password);
//2.定义sql
String sql ="create database db2";
//3.获取执行sql的对象Statement
Statement stmt=conn.createStatement();
//4.执行sql
int cout=stmt.executeUpdate(sql);
//5.处理结果
//执行DDL语句时,就算执行成功,cout返回可能也是0
//所以不能按之前的方法判断执行成功与否
//6.释放资源
stmt.close();
conn.close();
}
}
ResultSet
结果集对象,作用:封装了DQL查询语句的结果
ResultSet result=stmt.executeQuery(sql);
使用步骤:
1.游标向下移动一行并判断该行是否有数据。
2.获取数据:getXxx(参数)
import java.sql.*;
public class connectionTest {
public static void main(String[] args) throws ClassNotFoundException, SQLException {
//1.获取连接
String url="jdbc:mysql:///test2?useSSL=false";
String username="root";
String password="123456";
Connection conn= DriverManager.getConnection(url,username,password);
//2.定义sql
String sql ="select * from sc";
//3.获取执行sql的对象Statement
Statement stmt=conn.createStatement();
//4.执行sql
ResultSet rs=stmt.executeQuery(sql);
//5.处理结果(遍历rs中的所有数据)
//5.1光标向下移动一行,并且判断当前行是否有数据
while (rs.next()){
//5.2获取数据
String Sno=rs.getString(1);
String Cno=rs.getString(2);
int Grade=rs.getInt(3);
System.out.println("Sno:"+Sno+" "+"Cno:"+Cno+" "+"Grade:"+Grade);
}
//6.释放资源
rs.close();
stmt.close();
conn.close();
}
}
关于上面rs获取表中数据部分,还有另外一种写法:
//5.处理结果(遍历rs中的所有数据)
//5.1光标向下移动一行,并且判断当前行是否有数据
while (rs.next()){
//5.2获取数据
String Sno=rs.getString("Sno");
String Cno=rs.getString("Cno");
int Grade=rs.getInt("Grade");
System.out.println("Sno:"+Sno+" "+"Cno:"+Cno+" "+"Grade:"+Grade);
}
案例
import java.sql.*;
import java.util.*;
public class connectionTest {
public static void main(String[] args) throws ClassNotFoundException, SQLException {
//1.获取连接
String url="jdbc:mysql:///test2?useSSL=false";
String username="root";
String password="123456";
Connection conn= DriverManager.getConnection(url,username,password);
//2.定义sql
String sql ="select * from sc";
//3.获取执行sql的对象Statement
Statement stmt=conn.createStatement();
//4.执行sql
ResultSet rs=stmt.executeQuery(sql);
//创建集合
List<Accout> list=new ArrayList<>();
//5.处理结果(遍历rs中的所有数据)
while (rs.next()){
Accout accout=new Accout();
String Sno=rs.getString(1);
String Cno=rs.getString(2);
int Grade=rs.getInt(3);
//赋值
accout.setSno(Sno);
accout.setCno(Cno);
accout.setGrade(Grade);
list.add(accout);
}
//查看集合中数据
Iterator<Accout> it=list.iterator();
while (it.hasNext()){
Accout s=it.next();
System.out.println(s);
}
//6.释放资源
rs.close();
stmt.close();
conn.close();
}
}
PreparedStatement
作用:预编译SQL语句并执行,预防SQL注入问题
SQL注入:SQL注入是通过操作输入来修改事先定义好的SQL语句,用以达到执行代码对服务器进行攻击的方法。
简单的用户登录环节,连接数据库
public class connectionTest {
public static void main(String[] args) throws ClassNotFoundException, SQLException {
//获取连接
String url="jdbc:mysql:///test2?useSSL=false";
String username="root";
String password="123456";
Connection conn= DriverManager.getConnection(url,username,password);
//获取执行sql的对象Statement
Statement stmt=conn.createStatement();
//接收用户输入的用户名和密码
String name="";
String pwd="";
String sql ="select * from tb_user where username='"+name+"' and password='"+pwd+"'";
ResultSet rs=stmt.executeQuery(sql);
//判断是否登录成功
if(rs.next()){
System.out.println("登录成功");
}else {
System.out.println("登录失败");
}
//释放资源
rs.close();
stmt.close();
conn.close();
}
}
而SQL注入说的是,例如当密码输入的是’or ‘1’='1时,会将那条SQL语句改成了恒为1,则一直登录成功。
如何解决SQL注入?
出现SQL注入的根本原因是拼字符串环节存在bug。
所以实际生产中要避免拼接字符串,用?来代替。
通过setXxx()的方法来给?设置数值。
所以将Statement类改用PreparedStatement类。
public class connectionTest {
public static void main(String[] args) throws ClassNotFoundException, SQLException {
//获取连接
String url="jdbc:mysql:///test2?useSSL=false";
String username="root";
String password="123456";
Connection conn= DriverManager.getConnection(url,username,password);
//接收用户输入的用户名和密码
String name="";
String pwd="";
String sql ="select * from tb_user where username=? and password=?";
PreparedStatement pstmt=conn.prepareStatement(sql);
pstmt.setString(1,name);
pstmt.setString(2,pwd);
ResultSet rs=pstmt.executeQuery();
//判断是否登录成功
if(rs.next()){
System.out.println("登录成功");
}else {
System.out.println("登录失败");
}
//释放资源
rs.close();
pstmt.close();
conn.close();
}
}
数据库连接池
简介:是一个容器,负责分配、管理数据库连接。它允许应用程序重复使用一个现有的数据库连接,而不是再重新建立一个。释放空闲数据超过最大空间的数据库连接来避免因为没有释放数据库连接而引起的数据库连接遗漏。
好处:1. 资源重复利用。 2. 提示系统响应速度。 3. 避免数据库连接遗漏。
import com.alibaba.druid.pool.DruidDataSourceFactory;
import javax.sql.DataSource;
import java.io.FileInputStream;
import java.sql.*;
import java.util.*;
public class connectionTest {
public static void main(String[] args) throws Exception {
//导入jar包 druid-1.1.12.jar
//定义配置文件 druid.properties
//加载配置文件
Properties prop=new Properties();
prop.load(new FileInputStream("src/druid.properties"));
//获取连接池对象
DataSource dataSource=DruidDataSourceFactory.createDataSource(prop);
//获取数据库连接
Connection connection=dataSource.getConnection();
System.out.println(connection);
}
}
完整代码
druid.properties文件信息:
driverClassName=com.mysql.jdbc.Driver
url=jdbc:mysql:///test2?useSSL=false&useServerPrepStmts=true
username=root
password=123456
# 初始化连接数量
initialSize=5
# 最大连接数
maxActive=10
# 最大等待时间
maxWait=3000
查询
import com.alibaba.druid.pool.DruidDataSourceFactory;
import javax.sql.DataSource;
import java.io.FileInputStream;
import java.sql.*;
import java.util.*;
public class connectionTest {
public static void main(String[] args) throws Exception {
//导入jar包 druid-1.1.12.jar
//定义配置文件 druid.properties
//加载配置文件
Properties prop=new Properties();
prop.load(new FileInputStream("src/druid.properties"));
//获取连接池对象
DataSource dataSource=DruidDataSourceFactory.createDataSource(prop);
//获取数据库连接
Connection connection=dataSource.getConnection();
String sql1="select * from sc where Sno=?";
System.out.println("请输入要查询的学号:");
Scanner sc=new Scanner(System.in);
String uSno=sc.next();
//获取PreparedStatement对象
PreparedStatement pstmt=connection.prepareStatement(sql1);
pstmt.setString(1,uSno);
//执行sql
ResultSet rs=pstmt.executeQuery();
Accout accout=new Accout();
List<Accout> list=new ArrayList<>();
//处理结果
while (rs.next()){
String Sno=rs.getString(1);
String Cno=rs.getString(2);
int Grade=rs.getInt(3);
accout.setSno(Sno);
accout.setCno(Cno);
accout.setGrade(Grade);
list.add(accout);
}
Iterator<Accout> it=list.iterator();
while (it.hasNext()){
Accout a=it.next();
System.out.println(a);
}
//释放资源
rs.close();
pstmt.close();
connection.close();
}
}
插入数据
import com.alibaba.druid.pool.DruidDataSourceFactory;
import javax.sql.DataSource;
import java.io.FileInputStream;
import java.sql.*;
import java.util.*;
public class connectionTest {
public static void main(String[] args) throws Exception {
//导入jar包 druid-1.1.12.jar
//定义配置文件 druid.properties
//加载配置文件
Properties prop=new Properties();
prop.load(new FileInputStream("src/druid.properties"));
//获取连接池对象
DataSource dataSource=DruidDataSourceFactory.createDataSource(prop);
//获取数据库连接
Connection connection=dataSource.getConnection();
String sql1="insert into sc values (?,?,?)";
System.out.println("请输入要插入的数据:");
Scanner sc=new Scanner(System.in);
String uSno=sc.next();
String uCno=sc.next();
int uGrade=sc.nextInt();
//获取PreparedStatement对象
PreparedStatement pstmt=connection.prepareStatement(sql1);
pstmt.setString(1,uSno);
pstmt.setString(2,uCno);
pstmt.setInt(3,uGrade);
//执行sql
int cout=pstmt.executeUpdate();
//处理结果
if(cout>0){
System.out.println("更新成功");
}else{
System.out.println("更新失败");
}
//释放资源
pstmt.close();
connection.close();
}
}