JDBC 就是使用Java语言操作关系型数据库的一套API
全称:( Java DataBase Connectivity ) Java 数据库连接
官方(sun公司)定义的一套操作所有关系型数据库的规则,即接口
各个数据库厂商去实现这套接口,提供数据库驱动jar包
我们可以使用这套接口(JDBC)编程,真正执行的代码是驱动jar包中的实现类
各数据库厂商使用相同的接口,Java代码不需要针对不同数据库分别开发
可随时替换底层数据库,访问数据库的Java代码基本不变
public class Jdbc { public static void main(String[] args) throws ClassNotFoundException, SQLException { //1.注册驱动 Class.forName("com.mysql.jdbc.Driver"); //2.获取链接 String url="jdbc:mysql://127.0.0.1:3306/db1"; //自己电脑的用户名跟密码 String username="root"; String password="123"; Connection conn= DriverManager.getConnection(url,username,password); //3. 定义sql语句 String sql ="update account set money = 1000 where id= 1"; //4.获取执行sql的对象 Statement Statement stmt =conn.createStatement(); //5.执行sql int count =stmt.executeUpdate(sql);//返回受影响的行数 //6.处理结果 System.out.println(count); //7.释放资源 stmt.close(); conn.close(); } }
DriverManager(驱动管理类)作用:
1.注册驱动
2.获取数据库连接
Connection作用:
1.获取执行 SQL 的对象
2.管理事务
在管理事务中,我们如果操作数据交互,那么一方修改完出错,另一方没有修改 我们则需要回滚事务
所以我们可以使用try catch来捕获异常,在catch中回滚事务,就可以了
try {
conn.setAutoCommit(false);//开启事务
int count1 =stmt.executeUpdate(sql1);//返回受影响的行数
System.out.println(count1);
int count2 =stmt.executeUpdate(sql2);//返回受影响的行数
System.out.println(count2);
conn.commit();//提交事务
} catch (Exception e) {
conn.rollback();//回滚事务
throw new RuntimeException(e);
}
executeUpdate(sql) :我们可以根据返回值是否大于0 判断是否修改成功。分别输出不同的语句
Resultset(结果集对象)
String sql1 ="select * from account";
//4.获取执行sql的对象 Statement
Statement stmt =conn.createStatement();
//执行sql 并返回得到的数据对象
ResultSet rs = stmt.executeQuery(sql1);
//当rs.next()有数据时就循环遍历每一行
while (rs.next()){
//获取每列数据
int id=rs.getInt(1);
String name=rs.getString(2);
double money =rs.getDouble(3);
System.out.println(id);
System.out.println(name);
System.out.println(money);
System.out.println("---------");
}
需求:查询account账户表数据,封装为Account对象中,并且存储到ArrayList集合中
String sql1 ="select * from account";
//4.获取执行sql的对象 Statement
Statement stmt =conn.createStatement();
//执行sql 并返回得到的数据对象
ResultSet rs = stmt.executeQuery(sql1);
//创建集合
ArrayList list =new ArrayList<>();
//当rs.next()有数据时就循环遍历每一行
while (rs.next()){
//获取每列数据
int id=rs.getInt(1);
String name=rs.getString(2);
double money =rs.getDouble(3);
//利用带参构造直接创建对象
Account account =new Account(id,name,money);
//将对象加入集合
list.add(account);
}
System.out.println(list);
作用:预编译SQL语句并执行:预防SQL注入问题
SQL注入:SQL注入是通过操作输入来修改事先定义好的SQL语句,用以达到执行代码对服务器进行攻击的方法。
举例:
如用户登录时的sql语句:
String name ="asdasd"
String pwd=" 'or '1' ='1 "
String sql ="select * from tb_user where username =' "+name+" ' and password = ' "+pwd+" ' ";
sql 语句就成为了 select * from tb_user where username =' asdasd' and password = ' ' or '1' ='1 '
or 后面 1=1 恒等 所以一定会登录成功
这时候我们就需要使用preparedStatement
String uname ="zhangSan";
String pwd ="123";
String sql1 ="select * from account where name=? and password=?";
//获取pstmt对象
PreparedStatement pstmt = conn.prepareStatement(sql1);
//设置各个问号的值
pstmt.setString(1,uname);
pstmt.setString(2,pwd);
//运行sql并返回数据
ResultSet rs = pstmt.executeQuery();
if(rs.next()){
System.out.println("登陆成功");
}else {
System.out.println("登录失败");
}
prepared 会将敏感字符进行转义,这样就不会影响sql语句
预编译需要在String url 加上useServerPrepStmts=true
数据库连接池简介:
数据库连接池是个容器,负责分配、管理数据库连接(Connection)
它允许应用程序重复使用一个现有的数据库连接,而不是再重新建立一个;
释放空闲时间超过最大空闲时间的数据库连接来避免因为没有释放数据库连接而引起的数据库连接遗漏
好处:
1.资源重用 2.提升系统响应速度 3.避免数据库连接遗漏
导入jar包 druid-1.1.12.jar
定义配置文件
加载配置文件
获取数据库连接池对象
获取连接
定义配置文件:
driverClassName=com.mysql.jdbc.Driver
url=jdbc:mysql:///db1?useSSL=false&useServerPrepStmts=true
username=root
password=123
//初始化连接数量
initialSize=5
//最大连接数
maxActive=10
//最大等待时间
maxWait=3000
加载配置文件:
Properties prop =new properties();
prop.load(new FileInputStream("配置文件路径"));
获取连接池对象
DataSource datasource = DruidDataSourceFactory.createDataSource(prop);
获取数据库链接Connection
Connection connetion = dataSource.getConnection();