Java连接数据库 --- 主推预编译Statement
准备工作 1.创建数据库
2.导入jar包 我使用的是 mysql-connector-java-5.1.8-bin.jar
简单的插入数据
方法一:预编译Statement
try {
/**
* 通过Class.forName 初始化驱动类com.mysql.jdbc.Driver
*/
Class.forName("com.mysql.jdbc.Driver");
/*
* 连接数据库 信息,用户,密码
*/
Connection c = DriverManager.getConnection("jdbc:mysql://localhost:3306/login?characterEncoding=UTF-8","root","123456");
System.out.println("数据库连接成功"+c);
/**
* 方法1:预编译Statement
* PreparedStatement 执行10次,只需要1次把SQL语句传输到数据库端
* 数据库对带?的SQL进行预编译
* 每次执行,只需要传输参数到数据库端
* 1. 网络传输量比Statement更小
* 2. 数据库不需要再进行编译,响应更快
* 3. 杜绝注入式攻击
*/
String sql = "insert into user values(null,?,?)";
PreparedStatement pStatement = c.prepareStatement(sql);
//设置数据
//传入多组数据用for循环
pStatement.setString(1, "zhansan");
pStatement.setString(2, "zhansan123456");
//执行
pStatement.execute();
}catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}catch (ClassNotFoundException e) {
e.printStackTrace();
}
方法二:statement
try {
/**
* 通过Class.forName 初始化驱动类com.mysql.jdbc.Driver
*/
Class.forName("com.mysql.jdbc.Driver");
/*
* 连接数据库 信息 ,用户,密码
*/
Connection c = DriverManager.getConnection("jdbc:mysql://localhost:3306/login?characterEncoding=UTF-8","root","123456");
System.out.println("数据库连接成功"+c);
/*创建Statement 用于执行sql语句*/
Statement s = c.createStatement();
System.out.println("获取 Statement对象: " + s);
/**
* 插入语句数据 注意这里插入到表名user哦,别再是数据库名
*/
//拼接sql语句
String sqlString = "insert into user values(null,"+"'rendonglin'"+","+"'123456789'"+")";
//String deleteString = "删除语句";
//String updateString = "修改语句";
s.execute(sqlString);
}catch (SQLException e) {
// TODO Auto-generated catch block
System.out.println("数据库异常");
}catch (ClassNotFoundException e) {
System.out.println("连接失败");
}
查询数据库所有数据并打印
//接在 Statement s = c.createStatement(); 后面即可
/**
* 查询语句,查询所有信息并打印
*/
String selectString = "select * from user";
ResultSet rs = s.executeQuery(selectString);
while(rs.next()){
int id = rs.getInt("id"); //可以使用字段名
String accountString = rs.getString(2); //可以使用字段顺序
String passwordString = rs.getString(3);
System.out.printf("%d\t%s\t%s\n",id,accountString,passwordString);
}
验证账号密码
/**
* 校验账号密码正确,避免将数据库里的数据全部传到内存中,直接在数据库里面校验
*/
String account = "zhangyi";
//正确的密码是:123456789
String password = "0123456789";
String sql = "select * from user where account = '" + account +"' and password = '" + password+"'";
ResultSet rs = s.executeQuery(sql);
if(rs.next())
System.out.println("账号密码正确");
else
System.out.println("账号密码错误");
关闭数据库
//但是得提前定义s,c;即
//Connection c = null;
//Statement s = null;
finally {
// 数据库的连接时有限资源,相关操作结束后,养成关闭数据库的好习惯
// 先关闭Statement
if (s != null)
try {
s.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
// 后关闭Connection
if (c != null)
try {
c.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
使用事务
/*
在Mysql中,只有当表的类型是INNODB的时候,才支持事务,所以需要把表的类型设置为INNODB,否则无法观察到事务.
修改表的类型为INNODB的SQL:
alter table hero ENGINE = innodb;
查看表的类型的SQL
show table status from how2java;
*/
// 有事务的前提下
// 在事务中的多个操作,要么都成功,要么都失败
//操作介绍 hp 先 +1,再 -1
c.setAutoCommit(false);
String sql1 = "update hero set hp = hp +1 where id = 22";
s.execute(sql1);
// 不小心写错写成了 updata(而非update)
String sql2 = "updata hero set hp = hp -1 where id = 22";
s.execute(sql2);
// 手动提交
c.commit();