##jdbc
-
java database connectivty ==>使用java来操作数据库
jdbc:其实就是提供了一些方法与接口(规范) ==>实现是由数据库的厂商来实现 (驱动包)
驱动包:也就是连接数据的提供的一个jar2.jdbc 连接数据库的一个步骤 1.导入jar包
2.通过反射来加载驱动
3.得到连接对象 connection
4.得到发送sql 对象(交通工具)
5.得到返回的结果
6.关闭资源 从下往上进行关闭
注意点:所有的jar包都是导入的是 java.sql.*
package com.offcn.day09.test;
import java.sql.*;
public class Test {
public static void main(String[] args) {
//System.out.println("第一个java项目");
/* 2.jdbc 连接数据库的一个步骤 1.导入jar包
2.通过反射来加载驱动
3.得到连接对象 connection
4.得到发送sql 对象(交通工具)
5.得到返回的结果
6.关闭资源 从下往上进行关闭*/
Connection conn = null;
Statement sta = null;
ResultSet rs = null;
try {
Class.forName("com.mysql.jdbc.Driver");
conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/use_db?characterEncoding=utf-8", "root", "root");
sta = conn.createStatement();
String sql = "select * from user";
rs = sta.executeQuery(sql);
while (rs.next()) {
int uid = rs.getInt("uid");
String uname = rs.getString("uname");
System.out.println(uid + "\t" + uname);
}
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
} finally {
try {
if(rs !=null){
rs.close();
}
if(sta !=null){
sta.close();
}
if(conn !=null){
conn.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
jdbc的详细解释
- Class.forName(“com.mysql.jdbc.Driver”); 通过反射来加载驱动 Driver >驱动类
2.DriverManager 驱动管理对象来获取连接对象 getConnection(“url”,“username”,“password”) 》返回值就是 Connection
url==>表示连接数据库的地址 jdbc:mysql://localhost:3306/数据库的库名?characterEncoding=utf-8 || jdbc:mysql:///day03_db 只支持本地连接
jdbc:表示主的协议==>也就是使用jdbc来连接数据库
mysql:表示子协议==>也及时使用mysql数据库
localhost: 表示本机的ip地址
3306 表示mysql数据库的端口号,端口号后是数据库的库ming
? 后 都是表示设置的参数 characterEncoding=utf-8>设置其编码格式username:表示数据库的用户名
password 表示数据库 密码
3.conn.createStatement(); ==>表示通过连接对象来获取执行sql 的对象Statement(交通工具)
4.sta.executeQuery(sql) 发送sql语句,数据库返回一个结果集 ResultSet
5.关闭资源(从下往上关闭)
6.jdbc连接数据库使用的类:1.Driver 2.DriverManager ( 3.Connection 4.Statement 5.ResultSet)
2.getConnection(); createStatement() executeQuery(sql) colse()
3.prepareStatement() 获取到 PrepareStatement
4. ps.setString(1,“li”); ? 表示占位符 给站位符来进行赋值 第一参数是索引 索引是从1开始 第二个参数是具体设置的值
5. executeUpdate(sql) 执行增删改的方法 返回是int类型 是影响的行数
常见的错误:nknown database ‘us’ 数据库不存在
Access denied for user ‘root’@‘localhost’ (using password: YES) 用户名与密码不正确
package com.offcn.day09.test;
import java.sql.*;
import java.util.Scanner;
public class Test2 {
public static void main(String[] args) {
//登录功能
Scanner input = new Scanner(System.in);
System.out.println("请输入用户名:");
String uname = input.next();
System.out.println("请输入密码:");
String pwd = input.next();
//与数据库的进行对比 ==》根据用户名与密码进行对比
Connection conn = null;
Statement sta = null;
ResultSet rs = null;
try {
Class.forName("com.mysql.jdbc.Driver");
conn = DriverManager.getConnection("jdbc:mysql:///use_db", "root", "root");
//得到执行sql 的对象
sta = conn.createStatement();
//正常的sql String sql="select * from user where uname='admin' and upwd='123456'";
// String sql = "select * from user where uname='" + uname + "' and upwd='" + pwd + "'";
String sql ="select * from user where uname='"+uname+"'" +" or 1=1";
// String sql ="select * from user where uname=?";
//执行sql
rs = sta.executeQuery(sql);
if (rs.next()) {
System.out.println("登录成功");
} else {
System.out.println("登录失败");
}
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
} finally {
//关闭资源
try {
if(rs !=null){
rs.close();
}
if(sta !=null){
sta.close();
}
if(conn !=null){
conn.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
You have an error in your SQL syntax ==>sql 异常
4. Statement 产生的问题:1.sql注入,不安全,每次直接拼
PreparedStatement 1.他是 Statement 对象的一个子类
2.可以防止sql注入,保证sql语句的安全
3.预编译检验sql是否正确 ==>效率高 ==>替换Statement
4.避免sql语句的拼写
使用 PreparedStatement 对象
import org.junit.Test;
import java.sql.*;
public class Test3 {
public static void main(String[] args) {
//通过反射来加载驱动
Connection conn= null;
try {
Class.forName("com.mysql.jdbc.Driver");
conn = DriverManager.getConnection("jdbc:mysql:///use_db","root","root");
//得到执行sql 对象
String sql ="select * from user where uname=? and upwd =?";
PreparedStatement ps = conn.prepareStatement(sql);
//填坑
ps.setString(1,"lisi");
ps.setString(2,"123");
ResultSet rs = ps.executeQuery();
while (rs.next()){
System.out.println(rs.getInt("uid"));
System.out.println(rs.getString("uname"));
System.out.println(rs.getString("upwd"));
}
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}
}
@Test
public void insertUser(){
try {
Class.forName("com.mysql.jdbc.Driver");
Connection conn = DriverManager.getConnection("jdbc:mysql:///use_db","root","root");
String sql ="insert into user(uname,upwd)values(?,?)";
PreparedStatement ps = conn.prepareStatement(sql);
//给占位符来填充值
ps.setString(1,"admin");
ps.setString(2,"123456");
//发送
int num = ps.executeUpdate();
if(num>0){
System.out.println("增加成功");
}else{
System.out.println("增加失败");
}
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}
}
@Test
public void updateUser(){
try {
Class.forName("com.mysql.jdbc.Driver");
Connection conn = DriverManager.getConnection("jdbc:mysql:///use_db","root","root");
String sql ="update user set uname =?,upwd=? where uid=?";
PreparedStatement ps = conn.prepareStatement(sql);
//给占位符来填充值
ps.setString(1,"wangwu");
// ps.setObject();
ps.setString(2,"111111");
ps.setInt(3,2);
//发送
int num = ps.executeUpdate();
if(num>0){
System.out.println("修改成功");
}else{
System.out.println("修改失败");
}
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}
}
//删除
@Test
public void deleteById(){
try {
Class.forName("com.mysql.jdbc.Driver");
Connection conn = DriverManager.getConnection("jdbc:mysql:///use_db","root","root");
String sql ="delete from user where uid=?";
PreparedStatement ps = conn.prepareStatement(sql);
//给占位符来填充值
ps.setInt(1,2);
/* ps.setString(2,"111111");
ps.setInt(3,2);*/
//发送
int num = ps.executeUpdate();
if(num>0){
System.out.println("删除成功");
}else{
System.out.println("删除失败");
}
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
在这里插入代码片
6junit 测试 主要是用于测试 使用的步骤 1.导包 添加依赖
2.编写一个测试方法(不是main) 注意点:1.需要使用 public void 2.这个方法没有返回值 3.这个方法没有参数
3.在方法加注解 @Test
4.直接运行 绿色表示没有错误 红色表示产生了错误
jdbcUtils工具类的封装:
1.加载驱动(只需要加载一次,写在静态代码块) 2.获取连接对象写成一个方法 (三个参数写成常量) 3.增删改 4.查询 5.关闭资源
package com.offcn.day09.test;
import java.sql.*;
import java.util.ArrayList;
import java.util.List;
public class JDBCUtils {
/* 1.导入jar包
2.通过反射来加载驱动
3.得到连接对象 connection
4.得到发送sql 对象(交通工具)
5.得到返回的结果
6.关闭资源 从下往上进行关闭
*/
// 2.通过反射来加载驱动
//定义四个常量
private final static String driver ="";
private final static String url ="";
private final static String username ="";
private final static String password ="";
static{
try {
Class.forName(driver);
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
// 得到连接对象 connection 增删改 等方式都需要使用 ,所有需要封装成一个方法 返回值就是connection
public static Connection getConnection(){
Connection con = null;
try {
con = DriverManager.getConnection(url,username,password);
} catch (SQLException e) {
e.printStackTrace();
}
return con;
}
//增删改 返回值都是影响的行数 int 发送指令都是调用同一个方法
// sql 语句不通(传参数) 站位符的个数不同(值的个数确定占位符的个数),类型也不能确定(Object)
/* public static int updateUser(String sql,Object[]objects){
Connection con = null;
//获取到连接对象
con = getConnection();
//通过连接对象,获取到执行sql的对象
PreparedStatement ps = con.prepareStatement(sql);
if(objects !=null && objects.length>0){
for (int i=0;i<objects.length;i++){
ps.setObject(i+1,objects[i]);
}
}
//发送sql
int num= ps.executeUpdate();
return num;
//关闭资源
}
*/
//
public static List<User> selectAll(String sql, Object[]objects){
List<User> list = new ArrayList<>();
Connection con = null;
//获取到连接对象
con = getConnection();
//通过连接对象,获取到执行sql的对象
PreparedStatement ps = con.prepareStatement(sql);
if(objects !=null && objects.length>0){
for (int i=0;i<objects.length;i++){
ps.setObject(i+1,objects[i]);
}
}
// 发送指令
ResultSet rs = ps.executeQuery();
while (rs.next()){
User user = new User();
user.setUid(rs.getInt("uid"));
user.setUname(rs.getString("uname"));
user.setUpwd(rs.getString("upwd"));
list.add(user);
}
return list;
//
}
}
来源:CSDN
作者:qq_45935125
链接:https://blog.csdn.net/qq_45935125/article/details/103568861