* jdbc(java连接数据库)实现的步骤:
* 1.加载驱动(选择数据库)
* 2.获取连接(与数据库建立连接)
* 3.准备sql语句(要执行的sql)
* 4.准备处理块(发送和执行sql语句)
* 5.发送sql语句(发送执行sql)
* 6.获取结果集(执行sql的结果)
* 7.关闭资源
最基本的JDBC的创建连接
public static void main(String[] args) throws ClassNotFoundException, SQLException, IOException {
//1.加载驱动(选择你要连接那个数据库)
//通过反射,但是新版的其实可以不写,这是软编码
Class.forName("oracle.jdbc.driver.OracleDriver");
//2.获取连接(与数据库建立连接)
//import java.sql.DriverManager;
//import java.sql.Connection;
//Connection conn = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:XE", "SCOTT", "TIGER");
Properties pro = new Properties();
pro.load(Thread.currentThread().getContextClassLoader().getResourceAsStream("db.properties"));
Connection conn = DriverManager .getConnection(pro.getProperty("url"),pro.getProperty("uname"),pro.getProperty("pwd"));
//3.准备sql语句
String sql = "select empno,ename from emp where deptno = 30";
//4.准备处理块,(让处理块发送和执行sql)
Statement state = conn.createStatement();
//5.将sql给处理块
//增删改 用execute 返回值是 boolean
//import java.sql.ResultSet;
ResultSet result = state.executeQuery(sql);
//6.获取结果处理下
System.out.println(result);//结果为地址值
while(result.next()){ //不要和迭代器搞混了 ,get里面写的是字段名字
int num = result.getInt(1); //从结果集中找到第一列,也可以直接用empno,因为这是第一列
String name = result.getString("ename");//从结果集中找到名字为ename的,也可以直接写2,表示第二列
System.out.println(num+"-->"+name);
}
//7.关闭资源,后打开的先关闭
result.close();
state.close();
conn.close();
}
上述代码中只是最最基本的JDBC的连接,其中的Statement之后基本用PrepareStatement,因为可以预编译,提升效率,并且防止SQL注入
上述代码中的很多数据每次改代码很烦,可以用配置文件来简化
/*
* 优化:
* 1.异常捕获
* 2.把连接数据库的相关信息放在配置文件中,从配置文件中获取值使用
*/
public static void main(String[] args) {
Properties pro = new Properties();
try {
pro.load(Thread.currentThread().getContextClassLoader().getResourceAsStream("db.properties"));
} catch (IOException e) {
e.printStackTrace();
}
Connection conn = null;
Statement state = null;
ResultSet result = null;
try { //可以放在一起更好,前面的有错误就不会执行后面的内容,所以前面有问题就不用执行后面的东西
//加载驱动
Class.forName(pro.getProperty("driver"));
//获取连接
conn = DriverManager.getConnection(
pro.getProperty("url"),
pro.getProperty("uname"),
pro.getProperty("pwd"));
//准备SQL语句
String sql = "select empno,ename from emp where deptno = 30";
//准备处理块
state = conn.createStatement();
//获取结果集
result = state.executeQuery(sql);
System.out.println(result);// 结果为地址值
while (result.next()) { // 不要和迭代器搞混了 ,get里面写的是字段名字
int num = result.getInt(1); // 从结果集中找到第一列,也可以直接用empno,因为这是第一列
String name = result.getString("ename");// 从结果集中找到名字为ename的,也可以直接写2,表示第二列
System.out.println(num + "-->" + name);
}
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}finally{
// 7.关闭资源,后打开的先关闭
try {
if (result!=null) {
result.close();
}
if (state!=null) {
state.close();
}
if (conn!=null) {
conn.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}
配置文件如下:
driver=oracle.jdbc.driver.OracleDriver
url=jdbc:oracle:thin:@127.0.0.1:1521:xe
name=SCOTT
pwd=TIGER
* 对用户模块功能的封装
* 注册用户
* 用户登录
* 用户数据的修改
* 查询用户信息
*
* sql注入:可能会造成数据不安全情况
* 建议使用: 预处理块
* 1.预先编译,提高效率
* 2.防止sql注入
public class SimpleJDBCDemo03 {
public static void main(String[] args) {
boolean flag=reg("zhangsan","123456");
if (flag) {
System.out.println("注册成功");
}else {
System.out.println("注册失败");
}
/*boolean flag=login("zhangsan","123");
if(flag){
System.out.println("登录成功");
}else{
System.out.println("登录失败");
}*/
}
/*
* 实现转账
* Connection的功能
* void setAutoCommit(boolean autoCommit) 设置手动提交,否则默认自动提交
* commit() 提交
* rollback() 回滚
*/
public static boolean change(String name,String pwd){
boolean flag=false;
//1.获取连接
Connection conn = null;
//3.准备处理块(发送和执行sql语句)
Statement state=null;
try {
conn=DBUtils.getConnection();
//2.准备sql
String sql="insert into t_user values('"+name+"',"+pwd+")";
//3.处理块
state=conn.createStatement();
//4.执行sql
int rows=state.executeUpdate(sql);
//5.判断是否执行成功
if(rows>0){
flag=true;
}
} catch (SQLException e) {
e.printStackTrace();
} finally{
//7.关闭资源
DBUtils.close(state, conn);
}
return flag;
}
/*
* 登录:
* 1.根据用户名和密码一起到数据库中查询,如果有数据,就成功,否则失败
* 2.根据用户名去查询,如果数据的密码和查询到的密码相同成功,否则失败
*/
public static boolean login(String name,String pwd){
boolean flag=false;
//1.获取连接
Connection conn = null;
//3.准备处理块(发送和执行sql语句)
PreparedStatement state=null;
//5.结果集
ResultSet result=null;
try {
conn=DBUtils.getConnection();
//2.准备sql
// String sql="select pwd from t_user where name='"+name+"'";
String sql="select * from t_user where name=? and pwd=?"; //?是占位符
//3.处理块
//state=conn.createStatement();
state=conn.prepareStatement(sql); //构建预处理块,就通知给它要执行的sql
//给sql 中的?占位符赋值
state.setObject(1, name);
state.setObject(2, pwd);
//4.执行sql
result=state.executeQuery();
//5.判断是否执行成功
/*if(result.next()){
String upwd= result.getObject(1).toString();
if(pwd.equals(upwd)){
flag=true;
}
}*/
if(result.next()){
flag=true;
}
} catch (SQLException e) {
e.printStackTrace();
} finally{
//7.关闭资源
DBUtils.close(result,state, conn);
}
return flag;
}
/*
* 注册用户
* 返回值: 成功与否
* 参数:
*/
public static boolean reg(String name,String pwd){
boolean flag=false;
//1.获取连接
Connection conn = null;
//3.准备处理块(发送和执行sql语句)
Statement state=null;
try {
conn=DBUtils.getConnection();
//2.准备sql
String sql="insert into t_user values('"+name+"',"+pwd+")";
//3.处理块
state=conn.createStatement();
//4.执行sql
int rows=state.executeUpdate(sql);
//5.判断是否执行成功
if(rows>0){
flag=true;
}
} catch (SQLException e) {
e.printStackTrace();
} finally{
//7.关闭资源
DBUtils.close(state, conn);
}
return flag;
}
}