JDBC
Java应用程序 接口 MySQL(Oracle,Redis,
Java
JDBC全称为:Java Data Base Connectivity
【Java数据库连接】
如何操作数据库?
组成JDBC的2个包:
- java.sql
- javax.sql
下载驱动
推荐下载地址: https://mvnrepository.com/artifact/mysql/mysql-connector-java
1连接数据库:加载数据库的驱动 连接数据库
- 通过初始化驱动类com.mysql.jdbc.Driver,该类就在mysql-connector-java-5.1.47.jar中,如果你是用的是oracle数据库那么该驱动类将不同
常用这种方式:Class.forName(“com.my.jdbc.Driver”);
2数据库的对象:
这里需提供:driver=com.mysql.jabc.Driver
username=root
password=自己设定的
url=jdbc:mysql://localhost:3306/(数据库名字)(用于标识数据的位置,通过URL地址告诉JDBC程序连接那个数据库)
3.获取与数据库的连接
Connection connection=DriverManger.getConnection(url,username,password)
4.编写SQL语句,获取向数据发送的sql语句的statement对象
5.向数据库发sql,并获取代表结果集的resulset
6得到执行的结果
7.释放资源
import java.sql.*;
public class MyTest2 {
public static void main(String[] args) throws ClassNotFoundException, SQLException {
//1.加载驱动
Class.forName("com.mysql.jdbc.Driver");
//2.获取与数据库的链接
String username="root";
String password="123456";
String url="jdbc:mysql://localhost:3306/jdbcstudy";
Connection connection= DriverManager.getConnection(url,username,password);
//3.编写SQL语句
Statement statement=connection.createStatement();
String sql="select id,name,password,email from users";
ResultSet resultSet=statement.executeQuery(sql);
while (resultSet.next()){
System.out.println(resultSet.getObject("id"));
System.out.println(resultSet.getObject("name"));
System.out.println(resultSet.getObject("password"));
System.out.println(resultSet.getObject("email"));
}
//释放资源
resultSet.close();
statement.close();
connection.close();
}
}
prepareStstement 和Statement
相同点:都是用来执行sql语句的
不同点:Statement 不安全,不能预编译SQL,不能使用站位符,容易造成SQL语句拼接错误
prepareStatement.setXXX[xxx:对应占位符数据的类型](?索引[从1开始,传入的值])
如何给preparestatement的站位符赋值:
preparedstatemt.set
例如:
String sql = "update t_course set course_name =? where course_id=?";
pstmt = (PreparedStatement) conn.prepareStatement(sql);
pstmt.setString(1, courseName); //利用Preparedstatement的set方法给占位符赋值
pstmt.setInt(2, courseId);
execute和executeUpdate的区别
相同点:二者都能够执行增加,删除,修改等操作
不同点:1,execute可以执行查询语句,然后通过getResult把结果取出来 。executeUpdate不能执行查询语句
2.execute返回Boolean类型,true表示执行的是查询语句,false表示执行insert,delete,update等。executeUpdate的返回值是int,表示有多少条语句数据受到了影响
JDBC工具类
编写一个工具类简化开发,创建连接数据库都是死代码,每次写及其不方便,还有关闭连接
1.先创建一个.properties文件,把连接的一些固定属性放进去
package demo2;
import java.io.IOException;
import java.io.InputStream;
import java.sql.*;
import java.util.Properties;
//编写一个工具类简化开发,创建连接数据库都是死代码,每次写及其不方便,还有关闭连接
public class JDBCUtils {
private static String driver = null;
private static String username = null;
private static String password = null;
private static String url = null;
static {
try {
InputStream is = JDBCUtils.class.getClassLoader().getResourceAsStream("db.properties");
Properties properties = new Properties();
properties.load(is);
driver=properties.getProperty("driver");
username=properties.getProperty("username");
password=properties.getProperty("password");
url=properties.getProperty("url");
//加载驱动
Class.forName(driver);
} catch (IOException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
//获取数据库连接对象
public static Connection getConnection() throws SQLException {
return DriverManager.getConnection(url,username,password);
}
//定义一个关闭方法
public static void closeAll(ResultSet resultSet,Statement statement, Connection connection){
if (resultSet!=null){
try {
resultSet.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (statement!=null){
try {
statement.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (connection!=null){
try {
connection.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
调用工具类
package demo1;
import demo2.JDBCUtils;
import org.junit.Test;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
public class MyTest1 {
@Test
public void insert(){
Connection connection=null;
Statement statement=null;
try {
connection=JDBCUtils.getConnection();
statement=connection.createStatement();
String sql="delete from users where id=5";
//返回受影响的行数
int i = statement.executeUpdate(sql);
if (i>0){
System.out.println("删除成功");
}
} catch (SQLException e) {
e.printStackTrace();
}finally {
JDBCUtils.closeAll(null,statement,connection);
}
}
@Test
public void update(){
Connection connection=null;
Statement statement=null;
ResultSet resultSet=null;
try {
connection=JDBCUtils.getConnection();
statement=connection.createStatement();
String sql="select*from users";
resultSet=statement.executeQuery(sql);
while (resultSet.next()){
System.out.println(resultSet.getInt("id"));
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}
开启事务:
什么是事务:
事务是逻辑是逻辑上的一组操作,要么都执行,要么都不执行
#MySQl默认提交事务
SET autocommit=0;关闭事务
SET autocommit=1;开启自动提交事务(MySQL默认)
start transaction;
UPDATE account SET money=money-100 WHERE name
=‘A’;
一组SQL语句执行完毕后,提交事务,同时执行,如果中间有错误,则提交不成功;
如果想要回到提交之前的样子,则需要回滚
一般作用在并发处理上
开启事务后,如果不提交事务,那么所有的操作在mysql连接断开后,会恢复最开始的样子
开启事务后,更新了数据,不想更新了,可以选择回滚。
关闭数据库的事务自动提交=通知数据库开启事务控制。
1,数据表达的列尽量不要再分,(原子性)
2,每个表只专心于一件事情(一致性)
3.一个尽量保持一个主键()
MySQL中的一些函数
数学函数:
select ceiling(1.2)向上取整;
select floor(1.2)向下取整;
select abs(-10)绝对值;
select rand();随机数,会返回一个0~1之间的随机数
select rand(10);随机种子数;
字符串函数:
select char_length(“西部开源”);统计字符串个数
select replace(“i love you”,’o‘,’西开‘);字符串替换(原始字符串,需要替换的字符串,替换的字符串)
select substr(’i love you‘,0);
select substr(’i love you‘,1,5);
日期函数:
select now();查询当前时间。返回一个date
select YEAR(now());
select MONTH(now());
select day(now());
select sysdate();获取系统时间
select locatime();
系统信息函数
select VERSION();
select USER();
maven:可以下载jar包