文章目录
jdbc 用于java与数据库链接
1、链接数据库
package cn.xk.demoa;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
/**
* @author 马晶
* @since 2022-04-10
*/
public class DemoA {
public static void main(String[] args) {
// 声明数据库连接
Connection connection = null;
try {
// 1.注册驱动类(只做一次)
Class.forName("com.mysql.jdbc.Driver");
/**
* 2.连接连接
* getConnection(String url,String user, String password);
* url: 连接字符串 (用于表述 要连接那台计算机的数据库 )
* user :数据库账号
* password: 数据库密码
* url: jdbc:mysql://localhost:3306/数据库名称?参数名:参数值
* jdbc: 协议 mysql:子协议
* localhost:3306 主机端口
*/
String url = "jdbc:mysql://localhost:3306/myschool?userUnicod=true&characterEncoding=utf8";
String user = "root";
String passwodr = "root";
// 通过DriverManager的getConnection 方法 获取数据的连接
connection = DriverManager.getConnection(url, user, passwodr);
/**
* Connection 它代表数据库的连接,客户端与数据库所有的交互都是通过Connection对象来完成的
* */
System.out.println("数据库连接成功");
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
} finally {
try {
// 释放资源
if (null != connection) {
connection.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
2、executeUpdate(String sql); 用于执行 insert delete update SQL语句
案例演示
package cn.xk.demoa;
import java.sql.*;
/**
* @author 马晶
* @since 2022-04-10
*/
public class DemoB {
public static void main(String[] args) {
// 声明数据库连接
Connection connection = null;
// 声明数据库操作对象
Statement statement =null;
// PreparedStatement prepareStatement=null;
try {
// 1.注册驱动类(只做一次)
Class.forName("com.mysql.jdbc.Driver");
/**
* 2.连接连接
* getConnection(String url,String user, String password);
* url: 连接字符串 (用于表述 要连接那台计算机的数据库 )
* user :数据库账号
* password: 数据库密码
* url: jdbc:mysql://localhost:3306/数据库名称?参数名:参数值
* jdbc: 协议 mysql:子协议
* localhost:3306 主机端口
*/
String url = "jdbc:mysql://localhost:3306/myschool?userUnicod=true&characterEncoding=utf8";
String user = "root";
String passwodr = "root";
// 通过DriverManager的getConnection 方法 获取数据的连接
connection = DriverManager.getConnection(url, user, passwodr);
/**
* Connection 它代表数据库的连接,客户端与数据库所有的交互都是通过Connection对象来完成的
* */
System.out.println("数据库连接成功");
//3.获取数据库操作对象
statement = connection.createStatement();
// connection.prepareStatement(String sql);
//4.执行SQL语句
String sql = "UPDATE grade SET gradeName='一年级' WHERE gradeID =1";
// String sql ="INSERT INTO `grade` ( `gradeName`) VALUES ('四年级');";
// String sql = "delete from grade where gradeID=4";
// executeUpdate(String sql); 用于执行 insert delete update SQL语句
int row = statement.executeUpdate(sql);
System.out.println(row==1?"成功":"失败");
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
} finally {
try {
// 释放资源 正用到关
if(null!=statement){
statement.close();
}
if (null != connection) {
connection.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
3、executeQuery(sql)方法 执行 查询语句
package cn.xk.demoa;
import cn.xk.entity.Student;
import java.sql.*;
import java.util.ArrayList;
import java.util.List;
/**
* @author 马晶
* @since 2022-04-10
*/
public class DemoC {
public static void main(String[] args) {
// 声明数据库连接
Connection connection = null;
// 声明数据库操作对象
Statement statement = null;
// 声明 查询返回的结果集
ResultSet resultSet = null;
// PreparedStatement prepareStatement=null;
// 声明集合 用于保存 学生集
List<Student> studentList = new ArrayList<>();
try {
// 1.注册驱动类(只做一次)
Class.forName("com.mysql.jdbc.Driver");
/**
* 2.连接连接
* getConnection(String url,String user, String password);
* url: 连接字符串 (用于表述 要连接那台计算机的数据库 )
* user :数据库账号
* password: 数据库密码
* url: jdbc:mysql://localhost:3306/数据库名称?参数名:参数值
* jdbc: 协议 mysql:子协议
* localhost:3306 主机端口
*/
String url = "jdbc:mysql://localhost:3306/myschool?userUnicod=true&characterEncoding=utf8";
String user = "root";
String passwodr = "root";
// 通过DriverManager的getConnection 方法 获取数据的连接
connection = DriverManager.getConnection(url, user, passwodr);
/**
* Connection 它代表数据库的连接,客户端与数据库所有的交互都是通过Connection对象来完成的
* */
System.out.println("数据库连接成功");
//3.获取数据库操作对象
statement = connection.createStatement();
// connection.prepareStatement(String sql);
//4.执行SQL语句
String sql = "select * from student";
// 通过statement 的executeQuery(sql)方法 执行 查询语句
// ResultSet 结果集
resultSet = statement.executeQuery(sql);
// 遍历结果集 行 和 列 组成的结果集
// 1、通过next() 方法判断是否存在数据
while (resultSet.next()) {
Student student = new Student();
// int stuNo = resultSet.getInt("studentNo");
//通过下标获取 虚拟结果集中的值 注意 下标从1开始 2 3 4 ....
int stuNo = resultSet.getInt(1);
student.setStudentNo(stuNo);
// 通过列名 获取值
String stuName = resultSet.getString("studentName");
student.setStudentName(stuName);
student.setLoginPwd(resultSet.getString("loginPwd"));
student.setSex(resultSet.getString("sex"));
student.setGradeId(resultSet.getInt("gradeId"));
student.setPhone(resultSet.getString("phone"));
student.setAddress(resultSet.getString("address"));
student.setBornDate(resultSet.getTimestamp("bornDate"));
// 将对象保存到集合中
studentList.add(student);
// System.out.println("学生编号:" + stuNo);
// System.out.println("学生姓名:" + stuName);
}
System.out.println("-----------------");
for (Student student : studentList)
System.out.println(student);
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
} finally {
try {
// 释放资源 正用到关
if (null != resultSet) {
resultSet.close();
}
if (null != statement) {
statement.close();
}
if (null != connection) {
connection.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
4、事务控制的演示
package cn.xk.demoa;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
/**
* @author 马晶
* @since 2022-04-10
*
* 事务控制
*
*/
public class DemoD {
public static void main(String[] args) {
// 声明数据库连接
Connection connection = null;
// 声明数据库操作对象
Statement statement =null;
// PreparedStatement prepareStatement=null;
try {
// 1.注册驱动类(只做一次)
Class.forName("com.mysql.jdbc.Driver");
/**
* 2.连接连接
* getConnection(String url,String user, String password);
* url: 连接字符串 (用于表述 要连接那台计算机的数据库 )
* user :数据库账号
* password: 数据库密码
* url: jdbc:mysql://localhost:3306/数据库名称?参数名:参数值
* jdbc: 协议 mysql:子协议
* localhost:3306 主机端口
*/
String url = "jdbc:mysql://localhost:3306/myschool?userUnicod=true&characterEncoding=utf8";
String user = "root";
String passwodr = "root";
// 通过DriverManager的getConnection 方法 获取数据的连接
connection = DriverManager.getConnection(url, user, passwodr);
/**
* Connection 它代表数据库的连接,客户端与数据库所有的交互都是通过Connection对象来完成的
* */
System.out.println("数据库连接成功");
// 开启事务处理 关闭自动事务
connection.setAutoCommit(false);
//3.获取数据库操作对象
statement = connection.createStatement();
//4.执行SQL语句
String sql = "UPDATE grade SET gradeName='二年级' WHERE gradeID =2";
int row = statement.executeUpdate(sql);
System.out.println(row==1?"成功":"失败");
// 事务回滚 不成立
// connection.rollback();
// 事务成立 提交事务
connection.commit();
} catch (Exception e) {
try {
// 事务回滚 不成立
connection.rollback();
} catch (SQLException ex) {
ex.printStackTrace();
}
e.printStackTrace();
} finally {
try {
// 释放资源 正用到关
if(null!=statement){
statement.close();
}
if (null != connection) {
connection.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
5、避免SQL注入攻击 引入占位符对sql语句
package cn.xk.demoa;
import java.sql.*;
import java.util.WeakHashMap;
/**
* @author 马晶
* @since 2022-04-12
*/
public class DemoE {
public static void main(String[] args) {
Connection connection = null;
PreparedStatement preparedStatement = null;
ResultSet resultSet =null;
try {
Class.forName("com.mysql.jdbc.Driver");
String url = "jdbc:mysql://localhost:3306/myschool?userUnicod=true&characterEncoding=utf8";
String user = "root";
String passwodr = "root";
// 通过DriverManager的getConnection 方法 获取数据的连接
connection = DriverManager.getConnection(url, user, passwodr);
/**
* Connection 它代表数据库的连接,客户端与数据库所有的交互都是通过Connection对象来完成的
* */
System.out.println("数据库连接成功");
// SQL 注入 注入攻击 ' or 1=1 --
//? :占位符 表示将要有一个值 在这里
String sql = "SELECT * FROM student WHERE studentNo = ? AND loginPwd = ?";
//3.获取数据库操作对象 获取prepareStatement 对象 》》 对SQL语句进行预加载 避免:SQL注入攻击 等等
preparedStatement = connection.prepareStatement(sql);
// 处理占位符 为SQL中的占位符赋值set值得类型
// preparedStatement.setString(1,"' or 1=1 -- ");
// preparedStatement.setString(2,"123");
preparedStatement.setObject(1,"10001");
preparedStatement.setObject(2,"123");
// 通过preparedStatement 执行 executeQuery方法 不需要传入SQL 因为prepareStatement 已经预加载了
resultSet = preparedStatement.executeQuery();
while (resultSet.next()){
// System.out.println(resultSet.getInt(1)+":"+resultSet.getString(3));
System.out.println(resultSet.getInt("studentNo")+":"+resultSet.getString("studentName"));
}
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}finally {
try {
if(null!= resultSet)
resultSet.close();
if(null!= preparedStatement)
preparedStatement.close();
if(null!= connection)
connection.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
1、对上述操作封装演示
package demoa;
import javax.xml.transform.Result;
import java.io.File;
import java.lang.reflect.Field;
import java.sql.*;
import java.util.ArrayList;
import java.util.List;
public class BaseDao {
//声明数据库链接
Connection conn = null;
//声明数据库操作对象
PreparedStatement ps = null;
//声明查询 时 返回的结果集
ResultSet rs = null;
static String driver = "com.mysql.jdbc.Driver";
String url = "jdbc:mysql://localhost:3306/myschool2?userUnicod=true&characterEncoding=utf8";
String user = "root";
String password = "root";
static {
try {
//静态块,运行一次
Class.forName(driver);//注册驱动类(只做一次)
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
//获取链接的方法
public Connection getConnection() throws SQLException {
conn = DriverManager.getConnection(url, user, password);
return conn;
}
//更新方法 用于执行 增加 删除 修改SQL语句
public int executeUpdate(String sql, Object... objects) {
int row = 0;
try {
conn = getConnection();//获取数据的链接
conn.setAutoCommit(false);//开启事务 关闭自动事务
//获取数据库操作对象
ps = conn.prepareStatement(sql);
//为 ? 占位符赋值
if (objects != null) {
for (int i = 0; i < objects.length; i++) {
// prepareStatement 为?占位符 赋值 下标从1开始
// Object... objects 下标从0开始
ps.setObject(i + 1, objects[i]);
}
}
//执行sql语句 返回影响行数
row = ps.executeUpdate();
conn.commit();//提交事务
} catch (SQLException e) {
try {
conn.rollback(); //回滚
} catch (SQLException ex) {
ex.printStackTrace();
}
} finally {
try {
//释放资源
closeAll(conn, ps, null);
} catch (SQLException e) {
e.printStackTrace();
}
}
return row;
}
public List<Object> executeQuery(Class<?> clazz, String sql, Object... objects) {
List<Object> list = null;
try {
getConnection();
ps = conn.prepareStatement(sql);
//为?占位符赋值
if(objects!=null){
for (int i = 0; i < objects.length; i++) {
ps.setObject(i+1,objects[i]);
}
}
rs=ps.executeQuery();
//处理放置到集合当中
list=handler(rs, clazz);
} catch (SQLException e) {
e.printStackTrace();
} finally {
try {
closeAll(conn,ps,rs);
} catch (SQLException e) {
e.printStackTrace();
}
}
return list;
}
public List<Object> handler (ResultSet rs,Class<?> clazz){
List<Object> list = new ArrayList<>();
Object object=null;
try {
while (rs.next()){
//获取Class类对象
object = clazz.newInstance();
//获取结果集的数据源
ResultSetMetaData rsMeta = rs.getMetaData();
//获取结果集字段数
int count = rsMeta.getColumnCount();
//循环去字段的名字 以及值
//将作为赋值给对应的实体对象的属性
for (int i = 0; i < count; i++) {
String columnName = rsMeta.getColumnName(i+1);
// 利用反射 将结果集中的字段名 与 实体对象中的属性名 对应
// 由于对象的属性都是私有的 所以想要访问必须使用
Field field = object.getClass().getDeclaredField(columnName);
field.setAccessible(true);
Object obj = rs.getObject(columnName);
// 判断 当前是否为Long
if(obj instanceof Long){
//强制类型转化
obj= Integer.parseInt(obj.toString());
}
field.set(object,obj);
}
list.add(object);
}
} catch (SQLException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (NoSuchFieldException e) {
e.printStackTrace();
}
return list;
}
//释放资源的方法
public void closeAll(Connection conn, PreparedStatement ps, ResultSet rs) throws SQLException {
if (null != conn) {
conn.close();
}
if (null != ps) {
ps.close();
}
if (null != rs) {
rs.close();
}
}
}
2、测试类
package demoa;
import java.util.List;
public class DemoE {
public static void main(String[] args) {
//用于执行 insert delete update SQL语句
BaseDao baseDao = new BaseDao();
/* String sql="UPDATE grade SET gradeName=? WHERE gradeID=? ";
int row = baseDao.executeUpdate(sql, "三年级",3 );
System.out.println(row == 1 ? "接收成功" : "接收失败");*/
//用于执行查语句
String sql = "SELECT * FROM student WHERE studentName LIKE ?";
List<Object> objects = baseDao.executeQuery(Student.class, sql, "%李%");
for (Object student : objects) {
System.out.println((Student) student);
}
}
}