一:JDBC是什么?
JDBC(Java Data Base Connectivity,java数据库连接)是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,它由一组用Java语言编写的类和接口组成。
JDBC提供了一种基准,据此可以构建更高级的工具和接口,使数据库开发人员能够编写数据库应用程序。
简单地说,JDBC 可做三件事:与数据库建立连接、发送 操作数据库的语句并处理结果。
二:优缺点
1)优点:简单易学,上手快,非常灵活构建SQL,效率高
2)缺点:代码繁琐,难以写出高质量的代码(例如:资源的释放,SQL注入安全性等)
开发者既要写业务逻辑,又要写对象的创建和销毁,必须管底层具体数据库的语法
(例如:分页)。
3)适合于超大批量数据的操作,速度快
三:JDBC总结
1、数据库连接使用时就创建,不使用时便立即释放,从而对数据库进行频繁的操作,导致数据资源的浪费、影响性能;
优化设想:使用数据库连接池管理数据库对象;
2、sql都是硬编码到java程序中,如果改变sql,那么得重新编译java代码,不利于系统后期的维护;
优化设想:将sql语句配置在xml中,及时改变sql也不用重新编译源代码;
3、向PreparedStatement设置参数,也是硬编码到java程序中,不利于后期的维护;
优化设想:将sql语句以及占位符和参数全部配置在xml中,改动也不需要重新编译源代码;
4、从resultset遍历结果集数据时,也存在硬编码 ,不利于后期系统的维护;
优化设想:将查询的结果集自动映射成java对象;
JDBC操作:
工具类
public class JdbcUtils {
//数据库连接对象
private static String driver; //驱动
private static String url; //连接字符串
private static String user; //用户名
private static String password; //密码
static {
//读取db.properties
ResourceBundle bundle = ResourceBundle.getBundle("db");
driver=bundle.getString("oracledriver");
url=bundle.getString("oracleurl");
user=bundle.getString("oracleusername");
password=bundle.getString("oraclepassword");
}
public static Connection getConn() {
Connection conn = null;
try {
Class.forName("oracle.jdbc.driver.OracleDriver");
conn=DriverManager.getConnection("jdbc:oracle:thin:@192.168.142.128:1521:orcl", "scott", "tiger");
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return conn;
}
public static void close(Connection conn,PreparedStatement pstm,ResultSet rs) {
if (rs!=null) {
try {
rs.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
if (pstm!=null) {
try {
pstm.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
if (conn!=null) {
try {
conn.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
测试类
public class TestJdbc {
private Connection conn=null;
private PreparedStatement pstm=null;
private ResultSet rs;
@Test
public void find() {
try {
pstm= conn.prepareStatement("select * from emp where empno=7000");
rs=pstm.executeQuery();
while (rs.next()) {
System.out.println(rs.getInt(1)+"---"+rs.getString("ename"));
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
@Test
public void add() {
try {
pstm= conn.prepareStatement("insert into emp(ename,job,sal,empno) values(?,?,?,?)");
pstm.setString(1, "張三");
pstm.setString(2, "CLERK");
pstm.setString(3, "20000");
pstm.setInt(4, 7000);
int eu = pstm.executeUpdate();
if(eu>0) {
System.out.println("成功");
}else {
System.out.println("失敗");
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
@Test
public void update() {
try {
pstm= conn.prepareStatement("update emp set ename=? where empno=?");
pstm.setString(1, "hello");
pstm.setInt(2, 7000);
int executeUpdate = pstm.executeUpdate();
if(executeUpdate>0) {
System.out.println("成功");
}else {
System.out.println("失敗");
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
@Test
public void delete() {
try {
pstm= conn.prepareStatement("delete from emp where empno=?");
pstm.setInt(1, 7000);
int EU = pstm.executeUpdate();
if(EU>0) {
System.out.println("成功");
}else {
System.out.println("失敗");
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
@Before
public void getconn() {
conn = JdbcUtils.getConn();
}
@After
public void close() {
JdbcUtils.close(conn, pstm, rs);
}
}