文章目录
一、jdbc(java database connectivty) 概述:
1.使用java来操作数据库
2.jdbc:提供了一些方法与接口(规范),实现是由数据库的厂商来实现 (驱动包)
3.驱动包:也就是连接数据提供的一个jar包
二、jdbc 连接数据库的一个步骤:
1.在项目里面导入jar包:mysql-connector-java-5.1.0-bin.jar
2.通过反射来加载驱动:Class.forName(“com.mysql.jdbc.Driver”)
3.得到连接对象:connection()
4.得到发送sql对象(交通工具):prepareStatement()
5.得到返回的结果:1.executeQuery()查询 2.executeUpdate()增删改
6.关闭资源(从下往上进行关闭):close()
注意点:所有的jar包都是导入的是:java.sql.*
package com.offcn.day09.test;
import java.sql.*;
public class Test {
public static void main(String[] args) {
//1.导入jar包
//2.通过反射加载驱动
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","1616");
//操作数据库对象
sta = conn.createStatement();
//编写sql语句
String sql = "select * from user";
//执行sql语句
rs = sta.executeQuery(sql);
//进行判断
while(rs.next()){
int uid = rs.getInt("uid");
String uname = rs.getString("uname");
String upwd = rs.getString("upwd");
System.out.println(uid+"\t"+uname+"\t"+upwd);
}
} 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的详细解释:
1.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数据库的端口号,端口号后是数据库的库名
? 后面都是表示设置的参数
characterEncoding=utf-8:设置其编码格式
username:表示数据库的用户名
password:表示数据库 密码
3.conn.createStatement():表示通过连接对象来获取执行sql的对象Statement(交通工具)
4.sta.executeQuery(sql):发送sql语句,数据库返回一个结果集 ResultSet
5.关闭资源(从下往上关闭):close()
6.jdbc连接数据库使用的类:
1.Driver
2.DriverManager
3.Connection
4.Statement
5.ResultSet
常用的方法:
1.getConnection()
2.createStatement()
3.executeQuery(sql)
4.colse()
5.prepareStatement() 获取到对象:PrepareStatement
6.ps.setString(1,“li”),?表示占位符,给占位符来进行赋值,第一个参数是索引(从1开始),第二个参数是具体设置的值
7.executeUpdate(sql) 执行增删改的方法,返回是int类型,是影响的行数
8.executeQuery(sql) 执行的是查询的方法,返回的是对象,需要遍历
常见的错误:
1.nknown database ‘us’:数据库不存在
2.Access denied for user ‘root’@‘localhost’ (using password: YES):用户名与密码不正确
3.You have an error in your SQL syntax :sql 异常
四、Statement产生的问题:
sql语法注入,不安全,每次都是直接拼
五、使用 PreparedStatement 对象:
1.是 Statement 对象的一个子类
2.可以防止sql注入,保证sql语句的安全
3.预编译检验sql是否正确,效率高,替换Statement
4.避免sql语句的拼写
package com.offcn.day09.test;
import org.junit.Test;
import java.sql.*;
public class Test3 {
public static void main(String[] args) {
Connection conn = null;
PreparedStatement ps = null;
ResultSet rs = null;
//通过反射加载驱动
try {
Class.forName("com.mysql.jdbc.Driver");
//连接数据库对象
conn = DriverManager.getConnection("jdbc:mysql:///use_db","root","1616");
//编写sql语句
String sql = "select * from user where uname = ? and upwd = ?";
ps = conn.prepareStatement(sql);
ps.setString(1,"张三");
ps.setString(2,"222");
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();
}finally {
try {
if (rs != null){
rs.close();
}
if (ps != null){
ps.close();
}
if (conn != null){
conn.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}
六、junit测试,主要是用于测试,使用的步骤:
1.导包、添加依赖(如图1)
2.编写一个测试方法(不是main方法)
注意点:
1.需要使用public void
2.这个方法没有返回值
3.这个方法没有参数
4.在方法上加注解:@Test
5.直接运行,绿色表示没有错误,红色表示产生了错误
@Test
public void insertUser(){
try {
Class.forName("com.mysql.jdbc.Driver");
Connection conn = DriverManager.getConnection("jdbc:mysql:///use_db","root","1616");
String sql = "insert into user(uname,upwd)values (?,?)";
PreparedStatement ps = conn.prepareStatement(sql);
ps.setString(1,"liupian");
ps.setString(2,"121212");
int num = ps.executeUpdate();
if(num > 0){
System.out.println("添加成功!");
}else {
System.out.println("添加失败!");
}
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}
}
七、jdbcUtils工具类的封装:
1.加载驱动(只需要加载一次,写在静态代码块)
2.获取连接对象写成一个方法 (三个参数写成常量)
3.增删改
4.查询
5.关闭资源
package com.offcn.day09.test;
import java.sql.*;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
public class JDBCUtils {
private final static String driver = "com.mysql.jdbc.Driver";
private final static String url = "jdbc:mysql:///use_db";
private final static String user ="root";
private final static String password ="1616";
static {
try {
Class.forName(driver);
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
//获取连接对象
public static Connection getConnertion(){
try {
return DriverManager.getConnection(url,user,password);
} catch (SQLException e) {
e.printStackTrace();
}
return null;
}
//查询
public static List<User> selectAll(String sql, Object[] objects){
//实例化一个集合
List<User> list = new ArrayList<User>();
Connection conn = null;
PreparedStatement ps = null;
ResultSet rs = null;
try {
//获取连接对象
conn = getConnertion();
//获取执行sql语句对象
ps = conn.prepareStatement(sql);
//遍历填充占位符
if(objects != null && objects.length > 0){
for (int i = 0;i < objects.length;i++){
ps.setObject(i+1,objects[i]);
}
}
//发送指令
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);
}
} catch (SQLException e) {
e.printStackTrace();
}finally {
close(rs,ps,conn);
}
return list;
}
//增加 修改 删除
public static int updateuser(String sql,Object[] objects) {
int num = -1;
PreparedStatement ps = null;
Connection conn = null;
try {
conn = getConnertion();
ps = conn.prepareStatement(sql);
if (objects != null && objects.length > 0) {
for (int i = 0; i < objects.length; i++) {
ps.setObject(i + 1, objects[i]);
}
}
num = ps.executeUpdate();
} catch (SQLException e) {
e.printStackTrace();
}finally {
close(null,ps,conn);
}
return num;
}
//关闭资源
public static void close(ResultSet rs,PreparedStatement ps,Connection conn){
try {
if (rs != null){
rs.close();
}
if (conn != null){
conn.close();
}
if (ps != null){
ps.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}
package com.offcn.day09.test;
import java.io.Serializable;
public class User implements Serializable {
private int uid;
private String uname;
private String upwd;
public int getUid() {
return uid;
}
public String getUname() {
return uname;
}
public String getUpwd() {
return upwd;
}
public void setUid(int uid) {
this.uid = uid;
}
public void setUname(String uname) {
this.uname = uname;
}
public void setUpwd(String upwd) {
this.upwd = upwd;
}
}
package com.offcn.day09.test;
import java.util.List;
public class Test4 {
public static void main(String[] args) {
//添加
/*String sql = "insert into user(uname,upwd)values(?,?)";
Object[] objects = {"haha","1616"};
int num = JDBCUtils.updateuser(sql,objects);
System.out.println(num > 0 ? "添加成功" : "添加失败");*/
//删除
/*String sql = "delete from user where uid = ?";
Object[] objects = {8};
int num = JDBCUtils.updateuser(sql,objects);
System.out.println(num > 0 ? "删除成功" : "删除失败");*/
//修改
/* String sql = "update user set uname =?, upwd =? where uid =?";
Object[] objects = {"刘翩","1616",5};
int num = JDBCUtils.updateuser(sql,objects);
System.out.println(num > 0 ? "修改成功" : "修改失败");*/
//查询
/* String sql = "select * from user limit ?,?";
Object[] objects = {0,3};
List<User> list = JDBCUtils.selectAll(sql,objects);
for (User u : list) {
System.out.println(u.getUid()+"\t"+u.getUname()+"\t"+u.getUpwd());
}*/
String sql = "select * from user where uname like ?";
Object[] objects = {"%刘%"};
List<User> list = JDBCUtils.selectAll(sql,objects);
for (User u : list) {
System.out.println(u.getUid()+"\t"+u.getUname()+"\t"+u.getUpwd());
}
}
}