规范 JAVA 程序操作数据库的标准,根据标准(接口)进行编程,不同的数据库产商根据标准(接口)做实现
环境准备
-
将数据库驱动导入到项目中
-
新建项目文件 - lib
-
拷贝jar进lib
-
右键jar--build path--add to build path
建立数据库连接
Driver接口的connect方法
-
url : 数据库连接地址
总协议:子协议:连接地址:端口号/数据库名
jdbc:mysql://localhost:3306/xx
-
user 数据库用户名
-
password 密码
// 手动加载驱动
Class.forName("com.mysql.cj.jdbc.Driver");
// 获取数据库信息(?...防止时区错误)
String url = "jdbc:mysql://localhost:3306/a?useUnicode=true&characterEncoding=UTF8&serverTimezone=UTC";
String user = "root";
String password = "123456";
// 获取数据库连接
Connection connection = DriverManager.getConnection(url, user, password);
封装数据库连接
创建.properties文件存放连接信息
driver = "com.mysql.cj.jdbc.Driver"
url = "jdbc:mysql://localhost:3306/数据库?useUnicode=true&characterEncoding=UTF8&serverTimezone=UTC"
user = "root";
pwd = "123456";
// 静态方法
public static Connection getConnection() {
// Properties类可以解析properties文件
Properties pro = new Properties();
// 用读入流将外部文件导入(在src中找到指定文件)
InputStream ips = Database.class.getClassLoader().getResourceAsStream("db.properties");
Connection c = null;
try {
// 将读入流中的K-V存放到Properties
pro.load(ips);
// 通过pro手动加载驱动
Class.forName(pro.getProperty("driver"));
// 获取数据库连接
c = DriverManager.getConnection(pro.getProperty("url"), pro.getProperty("user"), pro.getProperty("pwd"));
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}
// 返回Connection连接
return c;
}
执行SQL语句
增删改
// 调用连接数据库方法(建立数据库连接)
Database d = new Database();
Connection c = d.getConnection();
// 预编译SQL语句
PreparedStatement ps = c.prepareStatement("INSERT INTO pet VALUES(DEFAULT,'小狗',2)");
// 通过excuteUpdate()查看受影响的行数
int result = ps.executeUpdate();
System.out.println(result>0?"更新成功":"更新失败");
// 关闭资源
ps.close();
c.close();
查看
getMetaData()方法(通过ResultSet调用)
方法 | 作用 |
---|---|
getColumnName() | 获取字段名 |
getColumnCount() | 获取字段总数 |
// 调用连接数据库方法(建立数据库连接)
Database d = new Database();
Connection c = d.getConnection();
// 预编译SQL语句
PreparedStatement ps = c.prepareStatement("SELECT * FROM pet");
// 执行查询executeQuery
// 查询的结果的封装到ResultSet
// 解析ResultSet
ResultSet rs = ps.executeQuery();
方法一
是否有下一条数据
//while (rs.next()) {
// // 1、2、3...字段
// System.out.print(rs.getObject(1) + " ");
// System.out.print(rs.getObject(2) + " ");
// System.out.print(rs.getObject(3) + " "+"\n");
//}
// 方法二
// 获取字段总数方法
// 获取结果集的元数据对象
ResultSetMetaData rsm = rs.getMetaData();
// 获取字段总数
int count = rsm.getColumnCount();
while (rs.next()) {
for (int i = 1; i <= count; i++) {
// 获取i列的字段名
System.out.println(rsm.getColumnName(i));
// 获取i列的字段数据
System.out.print(rs.getObject(i)+"\n");
}
}
// 关闭资源
rs.close();
ps.close();
c.close();
对象存储
// 创建对象
Pet p = new Pet(3, "猫", 3);
// 调用连接数据库方法(建立数据库连接)
Database d = new Database();
Connection c = d.getConnection();
// 预编译SQL语句 - 使用?占位符占位,防止SQL注入篡改指令
PreparedStatement ps = c.prepareStatement("INSERT INTO pet VALUES(?,?,?)");
// .setObejct(index,参数)为占位符赋值 ,index是占位符的位置--从1开始
ps.setObject(1, p.id);
ps.setObject(2, p.name);
ps.setObject(3, p.age);
// 执行结果
int result = ps.executeUpdate();
System.out.println(result > 0 ? "更新成功" : "更新失败");
// 关闭资源
ps.close();
c.close();
事务控制
注意:关于事务的操作都在同一个connection连接上才能控制事务
// 调用连接数据库方法(建立数据库连接)
Database d = new Database();
Connection c = d.getConnection();
// 关闭自动提交
try {
c.setAutoCommit(false);
} catch (SQLException e) {
e.printStackTrace();
}
// 业务代码放try
PreparedStatement ps1 = null;
PreparedStatement ps2 = null;
try {
// 预编译SQL语句
ps1 = c.prepareStatement("update pet set age = age-500 where name='猫'");
ps2 = c.prepareStatement("update pet set age = age+500 where name='狗'");
// 运行结果
ps1.executeUpdate();
ps2.executeUpdate();
// 事务提交
// try最后提交事务
c.commit();
}
catch (Exception e) {
// catch最后回滚
try {
c.rollback();
} catch (SQLException e1) {
e1.printStackTrace();
}
e.printStackTrace();
}finally {
// finally关闭资源
if(ps1!=null) {
try {
ps1.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(ps2!=null) {
try {
ps2.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(c!=null) {
try {
//关闭之前打开恢复自动连接
c.setAutoCommit(true);
c.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
常见问题
java.lang.ClassNotFoundException: com.mysql.jdbc.Driver
正常情况下是因为tomcat服务器找不到
com.mysql.jdbc.Driver文件
要将数据库的这个jar包复制到Tomcat/lib目录