1. JDBC
Java Database Connectivity
需要jar包的支持
- java.sql
- javax.sql
- mysql-connector-java连接驱动(必须要导入)
步骤
1.导入数据库依赖
<dependencies> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.47</version> </dependency> </dependencies>
2.IDEA中连接数据库
3.编写Java文件
public class TestJdbc { public static void main(String[] args) throws ClassNotFoundException, SQLException { //配置信息 //解决乱码问题useUnicode=true&characterEncoding=UTF-8 String url = "jdbc:mysql://localhost:3306/jdbc?useUnicode=true&characterEncoding=UTF-8&useSSL=false"; String username = "root"; String password = "123456"; //1.加载驱动 (通过反射得到) Class.forName("com.mysql.jdbc.Driver"); //2.连接数据库 (connection其实就代表数据库) Connection connection = DriverManager.getConnection(url, username, password); //3.向数据库发送sql的对象statement,用它来做CRUD Statement statement = connection.createStatement(); //4.编写SQL String sql = "select * from t_jobs"; /* String sql = "delete from t_jobs where JOB_ID = 'HR_REP'"; int i = statement.executeUpdate(sql);//受影响的行数,增删改都用executeUpdate()即可 */ //5.执行SQL(查询),返回一个resultSet结果集。数据类型为 ResultSet rs = statement.executeQuery(sql); while (rs.next()){ System.out.println("JOB_ID="+rs.getObject("JOB_ID")); System.out.println("JOB_TITLE="+rs.getObject("JOB_TITLE")); } //6.关闭连接,释放资源(一定要做),先开的后关 rs.close(); statement.close(); connection.close(); } }
注:
- 可以编写db的util类,除了4,5步骤都是固定的
- 第三步中,PreparedStatement:预编译的对象,安全的。eg. connection.prepareStatement(sql);
- 预编译:
//4-1.编写SQL String sql = "insert into t_jobs(JOB_ID, JOB_TITLE, MIN_SALARY, MAX_SALARY) values (?,?,?,?);"; //4-2.预编译 PreparedStatement preparedStatement = connection.prepareStatement(sql); preparedStatement.setString(1,"id1");//分别给占位符赋值 preparedStatement.setString(2,"title1"); preparedStatement.setString(3,"salary1"); preparedStatement.setString(4,"salary2"); //5.执行SQL,返回一个resultSet结果集。数据类型为 int i = preparedStatement.executeUpdate(); if( i > 0){ System.out.println("插入成功"); } //6.关闭连接,释放资源(一定要做),先开的后关 statement.close(); connection.close();
2. Junit单元测试
依赖:
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>compile</scope>
</dependency>
一般用做测试,省去了写多个psvm分别运行的麻烦。用注解引入。
@Test注解只有在方法上有效,只要加了这个注解的方法,就可以直接运行。
import org.junit.Test;
public class TestJdbc3 {
@Test
public void test(){
System.out.println("Junit单元测试");
}
}
搭建一个环境,测试事务:
create table account(
id int PRIMARY KEY AUTO_INCREMENT,
name varchar(40),
money float);
INSERT INTO account (name, money) values ('A',1000);
INSERT INTO account (name, money) values ('B',1000);
INSERT INTO account (name, money) values ('C',1000);
@Test
public void test1() {
Connection connection = null;
//配置信息
//解决乱码问题useUnicode=true&characterEncoding=UTF-8
String url = "jdbc:mysql://localhost:3306/jdbc?useUnicode=true&characterEncoding=UTF-8&useSSL=false";
String username = "root";
String password = "39561316";
try {
//1.加载驱动 (通过反射得到)
Class.forName("com.mysql.jdbc.Driver");
//2.连接数据库 (connection其实就代表数据库)
connection = DriverManager.getConnection(url, username, password);
//3.通知数据库开启事务(false是开启)
connection.setAutoCommit(false);
//4.编写事务
String sql1 = "update account set money = money - 100 where name = 'A'";
//5.执行事务
connection.prepareStatement(sql1).executeUpdate();//增删改都用executeUpdate()即可
//制造错误
//int i = 1/0;
//再加一个事务
String sql2 = "update account set money = money + 100 where name = 'B'";
connection.prepareStatement(sql2).executeUpdate();
connection.commit();//以上两条sql都执行成功了,就提交事务
System.out.println("success");
} catch (Exception e) {
try {
//如果出现异常,就通知数据库回滚事务
connection.rollback();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
e.printStackTrace();
}
finally{
//6.关闭连接,释放资源(一定要做),先开的后关
try {
connection.close();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
}