1、首先整理一下JDBC的连接思路
未经过封装:首先引入mysql的jar包
一、加载驱动,获取链接
01。驱动名称
02、数据库链接地址:
String url=jabc:mysql://localhost:3306/数据库名?characterEncoding=utf-8&serverTimezone=gmt
03、数据库的名称,密码
string username= string password=
二、建立链接
Connection conn=DriverManager.getconnection(url ,username, password);
三、获取操作对象
Statement st=conn.createstatement();
四、写sql语句,操作对象执行对应的操作
string sql="select * from s"
st.execuateupdate()//增删改
st.execuateQuery()//查询方法
查询方法的返回结果需要用一个结果集来获取。
ResultSet rs=st.execuateQuery(sql);
结果集是根据数据库表列和行组成的二维表
获取查询结果
while(rs.next()){
int firstcoumn=rs.getInt(1)//获取第一列,参数为int,
int secondcoumn=rs.getString("age")//获取列名为“age”的数据
。。。
}
2、进行封装。
其实我们进行每一次操作的时候只需要获取一次链接就可以,所以我们就需要进行封装
一、首先将数据常量全部封装到一个配置文件里,这样以后我们需要更改的时候直接去配置文件里边改就可以啦
首先在src根目录新建一个properties文件。
properties配置文件可以理解为Map键值对一样的存在.
那么,经过如此,我们的JDBC工具类封装正式开始
一、加载驱动,获取链接
思考一下,每次我们进行增删改查的时候,都需要用到工具类,而获取这properties的值只需要一次就可以,所以static代码块非常适合他们
private static String driver=null;
private static String url=null;
private static String username=null;
private static String password=null;
static {
Properties pop=new Properties();//Properties 继承于 Hashtable。表示一个持久 的属性集.属性列表中每个键及其对应值都是一个字符串。
try {
//getResourceAsStream读取的文件路径只局限与工程的源文件夹中,包括在工程src根目录下,以及类包里面任何位置,
//但是如果配置文件路径是在除了源文件夹之外的其他文件夹中时,该方法是用不了的。
pop.load(DBUtil.class.getResourceAsStream("db.properties"));//类加载器执行的时候去读取配置文件 注意这里不使用类加载器的话也可以自己新建一个InputStream流去读取,然后作为load方法的参数。
driver=pop.getProperty("driverClassName");
url=pop.getProperty("url");
username=pop.getProperty("username");
password=pop.getProperty("password");
Class.forName(driver);
} catch (Exception e) {
e.printStackTrace();
}
}
二、建立链接
public static Connection getConnection() {
Connection conn=null;
try {
conn=DriverManager.getConnection(url, username, password);
}
catch (Exception e) {
e.printStackTrace();
}
return conn;
}
,记得用完close.及时释放资源哦
public static void close(Statement st,Connection con,ResultSet rs) {
try {
if(rs!=null) {
rs.close();
}
if(st!=null) {
st.close();
}
if(con!=null) {
con.close();
}
} catch (Exception e) {
e.printStackTrace();
}
这样我们就拥有了一个工具类。DBUtils
那么增删改查的封装如何进行呢?
首先我们思考一下接下来第三步第四步是啥
三、建立操作对象,四、执行sql操作。
那么这里需要注意
Statement对象的增删改查参数如果你还刚学到这里,那么简单封装成String sql即可,但是实际我们的修改查询语句也有一些不确定的参数,比如where group by 等等,所以引入动态数组的概念。
那么我们来进行封装
首先是作为增删改查的封装update()
public int update(String sql,Object...objects) {
Connection conn, =null;
PreparedStatement pre=null;
int count=0;
try {
conn=DBUtil.getconnection();
pre=conn.prepareStatement(sql);
for(int i=0;i
pre.setObject(i+1, objects[i]);
}//statement 的子类prestatement是进行预处理,然后用动态数组Object去填充
count=pre.executeUpdate();
} catch (Exception e) {
e.printStackTrace();
}finally {
DBUtil.close(pre, conn, null);
}
return count;
}
查询
public List> query( String sql,Object...obj){
PreparedStatement pre=null;
Connection conn=null;
ResultSet rs=null;
List> list=new ArrayList>();
try {
conn=DBUtils.getconnection();
pre=conn.prepareStatement(sql);
for (int i = 0; i < obj.length; i++) {
pre.setObject(i+1, obj[i]);
}
rs=pre.executeQuery();
ResultSetMetaData rsmd=rs.getMetaData();//获取列信息
int count=rsmd.getColumnCount();//获取列数
String[] columnName=new String[count];
for(int i=0;i
columnName[i]=rsmd.getColumnName(i+1);
}
while(rs.next()) {
Map map=new HashMap();
for(int i=0;i
map.put(columnName[i],rs.getObject(i+1));
}
list.add(map);
}
} catch (SQLException e) {
e.printStackTrace();
}finally {
DBUtil.close(pre,null,rs);
}
return list;
封装到这里就结束了。