1.基本概念:Java DataBase Connectivity Java数据库连接,Java语言操作数据库
JDBC本质:定义了一套操作所有关系型数据库的规则,即接口。各个数据库厂商去实现这套接口,提供数据库驱动jar包。我们可以使用这套接口(JDBC)编程,真正执行的代码是驱动jar包中的实现类。
2.快速入门:
步骤:1.导入驱动jar包
①复制mysql-connector-java-5.1.48-bin.jar到项目的libs目录下
②右键→Add As Library
2.注册驱动
3.获取数据库连接对象 Connection
4.定义sql
5.获取执行sql语句的对象 Statement
6.执行sql,接受返回结果
7.处理结果
8.释放资源
public class JdbcDemo01 {
public static void main(String[] args) throws Exception {
//1.导入驱动jar包
//2.注册驱动
Class.forName("com.mysql.jdbc.Driver");
//3.获取数据库连接对象
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/test", "root", "123");
// 4.定义sql
String sql = "update pet set sex = 'w' where name = 'xiaoming'";
// 5.获取执行sql语句的对象
Statement stmt = conn.createStatement();
//6.执行sql,接受返回结果
int count = stmt.executeUpdate(sql);
//7.处理结果
System.out.println(count);
//8.释放资源
stmt.close();
conn.close();
}
}
3.详解各个对象
1.DriverManager:驱动管理对象
功能:1、注册驱动
2、获取数据库连接
2.Connection:数据库连接对象
功能:1、获取执行sql的对象
2、管理事务
3.Statement:执行sql的对象(重要!)
1、boolean execute(String sql):可以执行任意的sql(了解)
2、int executeUpdate(String sql):执行DML(insert、update、delete)语句,
执行DDL(create、alter、drop)语句(一般不经常用)
3、ResultSet executeQuery(String sql):执行DQL(select)语句
JDBC小练习
public class JDBCDemo02 {
public static void main(String[] args) {
Statement stmt = null;
Connection conn = null;
try {
//1.注册驱动
Class.forName("com.mysql.jdbc.Driver");
//2.获取数据库连接对象
conn = DriverManager.getConnection("jdbc:mysql:///test", "root", "123");
//3.定义sql
String sql = "insert into pet values('cxl','lq','人','女','1997-12-19',null)";
//4.获取执行sql语句的对象
stmt = conn.createStatement();
//5.执行sql
int count = stmt.executeUpdate(sql);
//6.处理结果
System.out.println(count);
if (count > 0) {
System.out.println("添加成功!");
} else {
System.out.println("添加失败!");
}
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}finally {
//7.释放资源,避免空指针异常
if (stmt != null){
try {
stmt.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (conn != null) {
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
}
4.ResultSet:结果集对象
next():游标向下移动一行
getXxx():获取数据(Xxx代表数据类型)
5.PreparedStatement:执行sql的对象
1.SQL注入问题:(如小练习里面)
1.输入用户随便 ,输入密码:a' or 'a' = 'a'
2.sql:select * from user where username = 'dsfasdf' and password = 'a' or 'a' = 'a'
2.解决sql注入问题:使用PreparedStatement对象来解决
3.预编译的SQL:参数使用?作为占位符
4.步骤:1.导入驱动jar包
2.注册驱动
3.获取数据库连接对象 Connection
4.定义sql
注意:sql的参数使用?作为占位符。如:select * from user where username = ? and password = ?;
5.获取执行sql语句的对象 PreparedStatement Connection. PreparedStatement(String sql)
6.给?赋值
方法:setXxx(参数1,参数2)
参数1:?的位置编号 从1开始
参数2:?的值
7.执行sql,接受返回结果
8.处理结果
9.释放资源
抽取JDBC工具类:JDBCUtils
1.注册驱动也抽取
2.抽取一个方法获取连接对象
需求:不想传递参数(麻烦),还得保证工具类的通用性
解决:配置文件
jdbc.properties
url =
user =
password =
3.抽取一个方法释放资源
public class JDBCUtils {
private static String url;
private static String user;
private static String password;
private static String driver;
static {
try {
//读取资源文件,获取值
//1.创建Properties集合类
Properties pro = new Properties();
//获取src路径下的文件方式→Classloder 类加载器
ClassLoader classLoader = JDBCUtils.class.getClassLoader();
URL res = classLoader.getResource("jdbc.properties");
String path = res.getPath();
System.out.println(path);
//2.加载文件
// pro.load(new FileReader("D:\\Idea\\IdeaProjects\\basecode\\newbegin\\src\\jdbc.properties"));
pro.load(new FileReader(path));
//3.获取数据,赋值
url = pro.getProperty("url");
user = pro.getProperty("user");
password = pro.getProperty("password");
driver = pro.getProperty("driver");
//4.注册驱动
Class.forName(driver);
} catch (IOException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
//获取连接,返回连接对象
public static Connection getConnection() throws SQLException {
return DriverManager.getConnection(url,user,password);
}
//释放资源
public static void close(Statement stmt, Connection conn) {
if (stmt != null) {
try {
stmt.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (conn != null) {
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
小练习
1.通过键盘录入用户名和密码
2.判断用户是否登陆成功
第一步:先创建数据库
第二步:代码
pubpublic static void main(String[] args) {
//1.键盘录入,接受用户名和密码
Scanner sc = new Scanner(System.in);
System.out.print("请输入用户名:");
String username = sc.nextLine();
System.out.print("请输入密码:");
String password = sc.nextLine();
//2.调用方法
boolean flag = new JDBCDemo09().login2(username,password);
//3.判断结果,输出不同语句
if (flag) {
System.out.println("登陆成功!");
}else {
System.out.println("用户名或密码错误");
}
}
//登录方法
public boolean login2(String username,String password) {
if (username == null || password == null) {
return false;
}
//连接数据库判断是否登陆成功
Connection conn = null;
PreparedStatement psmt =null;
ResultSet rs = null;
//1.获取连接
try {
conn = JDBCUtils.getConnection();
//2.定义sql
String sql = "select * from user where username = ? and password = ?";
//3.获取执行sql的对象
psmt = conn.prepareStatement(sql);
//给?赋值
psmt.setString(1,username);
psmt.setString(2,password);
//4.执行查询
rs = psmt.executeQuery();
//5.判断
// if (rs.next()) {
// return true;
// }else {
// return false;
// }
return rs.next();//如果有下一行,返回true
} catch (SQLException e) {
e.printStackTrace();
} finally {
JDBCUtils.close(rs,psmt,conn);
}
return false;
}
运行结果:
请输入用户名:zhangsan
请输入密码:123
登陆成功!
JDBC管理事务
创建数据库
public static void main(String[] args) {
Connection conn = null;
PreparedStatement pstmt1 = null;
PreparedStatement pstmt2 = null;
try {
//1.获取连接
conn = JDBCUtils.getConnection();
//开启事务
conn.setAutoCommit(false);
//2.定义sql
//张三-500,李四+500
String sql1 = "update account set balance = balance-? where id =?";
String sql2 = "update account set balance = balance+? where id =?";
//3.获取执行sql对象
pstmt1 = conn.prepareStatement(sql1);
pstmt2 = conn.prepareStatement(sql2);
//4.设置参数
pstmt1.setInt(1,500);
pstmt1.setInt(2,1);
pstmt2.setInt(1,500);
pstmt2.setInt(2,2);
//5.执行sql
pstmt1.executeUpdate();
//手动制造异常
int i=3/0;
pstmt2.executeUpdate();
//提交事务
conn.commit();
} catch (SQLException e) {
//事务回滚
try {
conn.rollback();
} catch (SQLException ex) {
ex.printStackTrace();
}
e.printStackTrace();
} finally {
JDBCUtils.close(null,pstmt1,conn);
JDBCUtils.close(null,pstmt2,null);
}
}