一:JDBC简介
JDBC是一种用于执行SQL语句的JavaAPI,可以为多种关系数据库提供统一访问,它由一组Java语言编写的类和接口组成。
二:JDBC连接数据库的步骤
0:导入JDBC相关jar包
1:加载驱动程序
2:获取Connection连接对象
3:准备Sql语句
4:发送Sql语句PrepareStatement ,并分析执行结果ResultSet
5:关闭资源
三:步骤细节
1加载驱动程序:
mySQL数据库:
Class.forName(“com.mysql.jdbc.Driver”);
Oracle数据库:
Class.forName(“oracle.jdbc.OracleDriver”);
2获得连接对象
mySQL数据库:
conn= DriverManager.getConnection("jdbc:mysql://localhost:3306/test", "root", "123456");
曾经,我连接时出现过的这个问题:
mySQL 警告WARN: Establishing SSL connection without server's identity verification is not recommended.
解决办法改下连接字符串,格式如下:
conn= DriverManager.getConnection("jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf-8&useSSL=false","root", "123456");
Oracle数据库便携版:
conn=DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:xe", "hr", "123");
3准备sql语句
sql语句根据有无参数可以分为,有参数sql语句和无参数sql语句。
其中有参数的sql语句绑定参数的写法有两种方式:
1)字符串拼接
2)?占位符的方式
这两种方法各有优缺点
1)字符串拼接
Srting id=”123”;
String sql =”Select * from t_user where id=’”+id+”’”;
缺点:容易被Sql注入破坏sql结构。
2)?占位符的方式
Srting id=”123”;
String sql =”Select * from t_user where id=?”;
prsm.setString(1, id);//绑定参数
缺点:无法绑定特定列,完成特定功能。如动态按照表的某列进行排序。
4:发送Sql语句
prsm=conn.prepareStatement(sql);
prsm.executeUpdate();返回影响行数,用于增删改。
5:ResultSet
ResultSet rs=prsm.executeQuery();//返回传入sql语句的查询结果(与数据库中的表列的数据没关系) 用于查询数据
While(rs.next())
{
String id=rs.getString(1);
String id=rs.getString(“id”);
//参数可以传入sql语句查询结果列的编号【从1开始】或列名(与查询sql语句的列名保持一致。)
}
6:关闭资源(原则:先打开的资源,后关闭。)
四:连接实例
public static void main(String[] args) throws Exception {
Connection conn=null;
PreparedStatement prsm=null;
ResultSet rs=null;
Product p=null;
try{
Class.forName("oracle.jdbc.OracleDriver");
conn=JDBCUtil.getConnection();
String sql="select * from shop_product";
prsm=conn.prepareStatement(sql);
rs=prsm.executeQuery();
p=new Product();
while(rs.next()){
p.setId(rs.getInt(1));
p.setName(rs.getString(2));
p.setPrice(rs.getInt(3));
p.setPath(rs.getString(4));
p.setDiscription( rs.getString(5));
System.out.println(p);
}
}finally{
JDBCUtil.relise(rs, prsm, conn);
}
}
五:对JDBC的简单封装
public class JDBCUtil {
private static final Properties prop=new Properties();
static{
InputStream is=null;
try {
is=new FileInputStream("bin//jdbc.properties");
prop.load(is);
String className=prop.getProperty("className");
Class.forName(className);
} catch (Exception e) {
e.printStackTrace();
}
finally{
try {
if(is!=null)
is.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
public static Connection getConnection (){
try{
String url=prop.getProperty("url");
String user=prop.getProperty("user");
String password=prop.getProperty("password");
return DriverManager.getConnection(url, user, password);
}catch(Exception e){
e.printStackTrace();
}
return null;
}
public static void relise(ResultSet rs,PreparedStatement prsm,Connection conn){
try{
if(rs!=null)
rs.close();
if(prsm!=null)
prsm.close();
if(conn!=null)
conn.close();
}catch(Exception e){
e.printStackTrace();
}
}
}
properties文件的配置