文件流程图:
一、连接数据库
数据表:
db.properties配置文件:我连接的是Linux里面的数据库
username=root
password=123456
url=jdbc:mysql://172.16.6.25:3306/jdbc?useUnicode=true&characterEncoding=utf-8&useSSL=false
driverClass=com.mysql.jdbc.Driver
JDBCUtils里面写的连接数据库:
public static Connection getConnection() throws Exception {
Properties properties = new Properties();
InputStream is = JDBCUtils.class.getClassLoader().getResourceAsStream("db.properties");
properties.load(is);
String username = properties.getProperty("username");
String password = properties.getProperty("password");
String url = properties.getProperty("url");
String driverClass = properties.getProperty("driverClass");
Class.forName(driverClass);
Connection conn = DriverManager.getConnection(url, username, password);
return conn;
}
MysqlDAO中的测试:
二、 增加删除修改数据库信息:
代码在JDBCUtils,连接前面的定义好的函数
public static void closeResource(Connection conn, Statement ps) {
try {
ps.close();
} catch (SQLException e) {
e.printStackTrace();
}
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
public static void update(String sql, Object... args) {
Connection conn = null;
PreparedStatement ps = null;
try {
conn = JDBCUtils.getConnection();
//预编译sql,返回PreparedStatement
ps = conn.prepareStatement(sql);
//填充占位符
for (int i = 0; i < args.length; i++) {
ps.setObject(i + 1, args[i]);//特别注意,小心出错
}
ps.execute();
} catch (Exception e) {
e.printStackTrace();
} finally {
JDBCUtils.closeResource(conn, ps);
}
}
修改结果:
删除结果:
插入测试结果:
三、 MySQL查询:
Customer类:
package com.Crunchy.util;
public class Customer {
private int id;
private String name;
private Float money;
public Customer() {
}
public Customer(int id, String name, Float money) {
this.id = id;
this.name = name;
this.money = money;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Float getMoney() {
return money;
}
public void setMoney(Float money) {
this.money = money;
}
@Override
public String toString() {
return "Customer{" +
"id=" + id +
", name='" + name + '\'' +
", money=" + money +
'}';
}
}
JDBCUtils:低级单表查询
//关闭查询连接
public static void closeResource(Connection conn, Statement ps, ResultSet resultSet) {
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
try {
ps.close();
} catch (SQLException e) {
e.printStackTrace();
}
try {
resultSet.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
//低级单表查询
public static Customer selecta(String sql, Object... args) {
Connection conn = null;
PreparedStatement ps = null;
ResultSet resultSet = null;
try {
conn = JDBCUtils.getConnection();
//预编译sql,返回PreparedStatement
ps = conn.prepareStatement(sql);
//执行sql语句
for (int i = 0; i < args.length; i++) {
ps.setObject(i + 1, args[i]);
}
resultSet = ps.executeQuery();
//获取结果集的元数据:ResultSetMetaData,
ResultSetMetaData rsmd = resultSet.getMetaData();
//通过ResultSetMetaData获取元数据的列数
int columnCount = rsmd.getColumnCount();
if (resultSet.next()) {//判断结果集下一条有没有数据有,指向下一条并且返回,如果没有弹出
Customer cust = new Customer();
//处理结果集一行数据中的每一列
for (int i = 0; i < columnCount; i++) {
//获取列值
Object columnValue = resultSet.getObject(i + 1);
//获取每个列的列名
String columnName = rsmd.getColumnName(i + 1);
/*获取别名
* String columnLabel = rsmd.getColumnLabel(i+1);
* 针对于表的字段名于类的属性名不相同的情况可以使用getColumnLabel,如果
* sql没有给字段起别名,使用getColumnLabel获取的仍然是列名
* */
//通过反射,赋值给cust对象指定的columnName属性
Field field = Customer.class.getDeclaredField(columnName);
//允许访问私有属性
field.setAccessible(true);
//赋值
field.set(cust, columnValue);
}
//返回结果
return cust;
}
} catch (Exception e) {
e.printStackTrace();
} finally {
//关闭连接
JDBCUtils.closeResource(conn, ps, resultSet);
}
//可能没有赋值成功,返回空
return null;
}
在MysqlDAO调用测试:
四、高级单表查询:连接关闭在此处省略,与上一步低级单表相同
//高级单表查询,把Customer换为<T>,泛型,可以换结构表
public static <T> T getInstance(Class<T> clazz,String sql, Object... args){
Connection conn = null;
PreparedStatement ps = null;
ResultSet resultSet = null;
try {
conn = JDBCUtils.getConnection();
//预编译sql,返回PreparedStatement
ps = conn.prepareStatement(sql);
//执行sql语句
for (int i = 0; i < args.length; i++) {
ps.setObject(i + 1, args[i]);
}
resultSet = ps.executeQuery();
//获取结果集的元数据:ResultSetMetaData,
ResultSetMetaData rsmd = resultSet.getMetaData();
//通过ResultSetMetaData获取元数据的列数
int columnCount = rsmd.getColumnCount();
if (resultSet.next()) {//判断结果集下一条有没有数据有,指向下一条并且返回,如果没有弹出
T t = clazz.newInstance();
//处理结果集一行数据中的每一列
for (int i = 0; i < columnCount; i++) {
//获取列值
Object columnValue = resultSet.getObject(i + 1);
//获取每个列的列名
String columnLabel = rsmd.getColumnLabel(i + 1);
/*获取别名
* String columnLabel = rsmd.getColumnLabel(i+1);
* 针对于表的字段名于类的属性名不相同的情况可以使用getColumnLabel,如果
* sql没有给字段起别名,使用getColumnLabel获取的仍然是列名
* */
//通过反射,赋值给cust对象指定的columnName属性
Field field = Customer.class.getDeclaredField(columnLabel);
//允许访问私有属性
field.setAccessible(true);
//赋值
field.set(t, columnValue);
}
//返回结果
return t;
}
} catch (Exception e) {
e.printStackTrace();
} finally {
//关闭连接
JDBCUtils.closeResource(conn, ps, resultSet);
}
//可能没有赋值成功,返回空
return null;
}
在MysqlDAO调用测试:
高级多条数据查询:
//高级多表查询
public static <T> List<T> getForList(Class<T> clazz,String sql,Object ...args){
Connection conn = null;
PreparedStatement ps = null;
ResultSet resultSet = null;
try {
conn = JDBCUtils.getConnection();
//预编译sql,返回PreparedStatement
ps = conn.prepareStatement(sql);
//执行sql语句
for (int i = 0; i < args.length; i++) {
ps.setObject(i + 1, args[i]);
}
resultSet = ps.executeQuery();
//获取结果集的元数据:ResultSetMetaData,
ResultSetMetaData rsmd = resultSet.getMetaData();
//通过ResultSetMetaData获取元数据的列数
int columnCount = rsmd.getColumnCount();
//创建集合对象
ArrayList<T> list = new ArrayList<T>();
while (resultSet.next()) {//判断结果集下一条有没有数据有,指向下一条并且返回,如果没有弹出
T t = clazz.newInstance();
//处理结果集一行数据中的每一列,给T对象指定的属性赋值的过程
for (int i = 0; i < columnCount; i++) {
//获取列值
Object columnValue = resultSet.getObject(i + 1);
//获取每个列的列名
String columnLabel = rsmd.getColumnLabel(i + 1);
/*获取别名
* String columnLabel = rsmd.getColumnLabel(i+1);
* 针对于表的字段名于类的属性名不相同的情况可以使用getColumnLabel,如果
* sql没有给字段起别名,使用getColumnLabel获取的仍然是列名
* */
//通过反射,赋值给cust对象指定的columnName属性
Field field = Customer.class.getDeclaredField(columnLabel);
//允许访问私有属性
field.setAccessible(true);
//赋值
field.set(t, columnValue);
}
list.add(t);
}
return list;
} catch (Exception e) {
e.printStackTrace();
} finally {
//关闭连接
JDBCUtils.closeResource(conn, ps, resultSet);
}
//可能没有赋值成功,返回空
return null;
}
测试结果:
五、 最后一个简单的登录实现:
public void testLogin(){
Scanner scanner = new Scanner(System.in);
System.out.print("请输入用户名:");
String user = scanner.nextLine();
System.out.print("请输入密码:");
String password = scanner.nextLine();
String sql = "select id,name from account where id = ? and name = ?";
Object returnUser = JDBCUtils.getInstance(Customer.class,sql,user,password);
if (returnUser != null){
System.out.println("登录成功");
}else{
System.out.println("登录失败");
}
}
在IDEA中我的Scanner是不能使用的,一直转圈,解决方法:进入这个界面在后边加入:
-Deditable.java.test.console=true
成功解决
我的JDBC学习地址:尚硅谷JDBC核心技术视频教程(康师傅带你一站式搞定jdbc)_哔哩哔哩_bilibili