JDBC,预编译,DAO设计,事务
JDBC(Java DataBase Connectivity)
【JDBC,预编译,DAO设计,事务】JDBC是用于执行SQL语句的Java API,由一组用Java语言编写的类和接口组成,为多种关系型数据库提供了统一的访问基准。
JDBC隶属于JavaSE的范畴,伴随着JavaSE的版本升级。
Java6开始:JDBC4.0开始无需加载注册驱动。
Java7开始:JDBC4.1提供RowSetProvider工具类
JDBC访问数据库的形式主要有两种
- 直接使用JDBC API去访问数据库服务器(MySQL/Oracle)。
- 间接使用JDBC的API去访问数据库服务器
如第三方工具,Hibernate,,MyBatis等(底层依然是JDBC)。
- 将MySQL的驱动Jar包添加到项目中
MySQL驱动下载地址
public static void demo() throws ClassNotFoundException, SQLException {
1.注册驱动
Class.forName("com.mysql.jdbc.Driver");
2.获取连接对象
拼接方式:jdbc:使用什么类型的数据库:数据库地址:数据库端口号:哪个数据库
url = jdbc:mysql://localhost(127.0.0.1):3306/jdbcdemo
user = root 数据库账号
password = root 数据库密码Connection conn = DriverManager
.getConnection("jdbc:mysql://localhost:3306/demo",
"root",
"root");
}
3.使用PreparedStatement预编译
public static void demo() throws ClassNotFoundException, SQLException {//?表示占位符
String sql = "SELECT * FROM t_student WHERE id = ?";
Class.forName("com.mysql.jdbc.Driver");
Connection conn = DriverManager
.getConnection("jdbc:mysql://localhost:3306/demo",
"root",
"root");
PreparedStatement ps = conn.prepareStatement(sql);
//参数:占位符,对应查询条件
ps.setLong(1, 1L);
//获取结果查询结果集
ResultSet rs = ps.executeQuery();
while (rs.next()) {
//获取数据
String name = rs.getString("name");
System.out.println(name);
}
}
DDL
创建表public static void demo() throws ClassNotFoundException, SQLException {String sql = "CREATE TABLE t_demo(" +
"id BIGINT PRIMARY KEY AUTO_INCREMENT," +
"name VARCHAR(20)," +
"age INT);
";
Class.forName("com.mysql.jdbc.Driver");
Connection conn = getConnection();
Statement st = conn.createStatement();
st.executeLargeUpdate(sql);
st.close();
conn.close();
}public static Connection getConnection() {
try {
return DriverManager
.getConnection("jdbc:mysql://localhost:3306/demo",
"root",
"root");
} catch (SQLException e) {
throw new RuntimeException(e);
}
}
DML
插入数据public static void demo() throws ClassNotFoundException, SQLException {String insertSql = "INSERT INTO t_demo(id,name,age)VALUES(1,'测试',18)";
Class.forName("com.mysql.jdbc.Driver");
Connection conn = getConnection();
Statement st = conn.createStatement();
st.executeLargeUpdate(insertSql);
st.close();
conn.close();
}
修改数据public static void demo() throws ClassNotFoundException, SQLException {String updateSql = "UPDATE t_demo SET name = '修改',age = 20 WHERE id = 1";
Class.forName("com.mysql.jdbc.Driver");
Connection conn = getConnection();
Statement st = conn.createStatement();
st.executeLargeUpdate(updateSql);
st.close();
conn.close();
}
删除数据public static void demo() throws ClassNotFoundException, SQLException {String deleteSql = "DELETE FROM t_demo WHERE id = 1";
Class.forName("com.mysql.jdbc.Driver");
Connection conn = getConnection();
Statement st = conn.createStatement();
st.executeLargeUpdate(deleteSql);
st.close();
conn.close();
}
DQL
public static void demo() throws ClassNotFoundException, SQLException {//?表示占位符
String sql = "SELECT * FROM t_student WHERE id = ?";
Class.forName("com.mysql.jdbc.Driver");
Connection conn = DriverManager
.getConnection("jdbc:mysql://localhost:3306/demo",
"root",
"root");
PreparedStatement ps = conn.prepareStatement(sql);
//参数:占位符,对应查询条件
ps.setLong(1, 1L);
//获取结果查询结果集
ResultSet rs = ps.executeQuery();
while (rs.next()) {
//获取数据
String name = rs.getString("name");
System.out.println(name);
}rs.close();
ps.close();
conn.close();
}
Dao设计思想和规范 DAO层在业务逻辑与数据库资源中间,是一个数据访问的接口。
用程序设计的语言来说,就是建立一个接口,将所有对数据源的访问操作,抽象封装起来。
public interface IStudentDao {void add(Student student);
void delet(Long id);
void update(Student student);
Student get(Long id);
List list();
}
分包规范
com.w.pss.util :工具包,存放工具类
com.w.pss.domian/modle/bean :模型包,存放封装的对象类
com.w.pss.dao :DAO接口包,存放DAO接口
com.w.pss.impl :接口实现包,存放接口的实现类
com.w.pss.test :存放测试类命名规范
接口:IXxx,如:IWidget
实现:XxxImpl,如:KeyImpl
测试:XxxTest
Dao:XxxDao
Domain组件的设计思想 Domain组件是把数据封装到一个类中,用来负责组件间的数据传递。
如果方法的形参需要传递过多的参数,那就将这些参数封装成一个实体类传递,这个实体类即Domain。
void update(Student student);
JDBC的异常处理
传统方式处理 public static void demo() {String deleteSql = "DELETE FROM t_demo WHERE id = 1";
Connection conn = null;
Statement st = null;
try {
Class.forName("com.mysql.jdbc.Driver");
conn = DriverManager
.getConnection("jdbc:mysql://localhost:3306/demo",
"root",
"root");
st = conn.createStatement();
st.executeLargeUpdate(deleteSql);
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
} finally {
if (st != null) {
try {
st.close();
} catch (SQLException e) {
e.printStackTrace();
}finally {
if (conn!=null) {
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
}
}
AutoCloseable处理IO异常public void testHandlerException() {
String sql = "CREATE TABLE t_demo(
id BIGINT PRIMARY KEY AUTO_INCREMENT,
age INT);
";
try (
Connection conn = DriverManager.getConnection(
"jdbc:mysql://localhost:3306/demo",
"root", "root");
Statement st = conn.createStatement();
) {st.execute(sql);
} catch (SQLException e) {
e.printStackTrace();
}
}
事务 在数据库中,开启事务后操作数据,只要出现一点异常,这组数据将不执行任何修改提交的操作,反之则完整的执行。
极端惨烈的要成功都成功,要失败都失败。
事务相关细节1.默认情况下,事务在执行完DML操作就自动提交。
2.查询操作,其实是不需要事务的,但是在开发中也把查询放入其中。
3.记得commit()提交事务。
4.事务不应该在DAO层处理,应该在service层控制。
事务模板
@Test
public void testTx() {PreparedStatement ps = null;
ResultSet rs = null;
Connection conn = null;
try {//取消自动提交
conn.setAutoCommit(false);
//逻辑语句//成功后提交
conn.commit();
} catch (Exception e) {
try {
//回滚
conn.rollback();
} catch (SQLException e1) {
throw new RuntimeException(e1);
}
}
}
推荐阅读
- 肛门疼痛预示着哪些肛肠疾病?
- 人工智能|干货!人体姿态估计与运动预测
- 推荐系统论文进阶|CTR预估 论文精读(十一)--Deep Interest Evolution Network(DIEN)
- “身体健康”不如“身心健康”——预防老年痴呆
- D206清明第一天
- Spring|Spring 框架之 AOP 原理剖析已经出炉!!!预定的童鞋可以识别下发二维码去看了
- 在外琐事?9
- 预见人力资源
- 病理预测
- 《Unix网络编程》第一卷第三版|《Unix网络编程》第一卷第三版 源码编译