今天我们来说一下关于JDBC的相关知识,关于JDBC我想大家都不陌生了,而且我记得早就开始使用它了,记得那是大二的时候做课程设计,但是那时候是为了完成任务,所以遇到问题就google,那时候也没有时间去整理,所以这次就来详细说一下关于JDBC的知识
摘要:
JDBC(Java Data Base Connectivity,java数据库连接),由一些接口和类构成的API。
J2SE的一部分,由java.sql,javax.sql包组成。
应用程序、JDBC API、数据库驱动及数据库之间的关系
JDBC的使用步骤
1.注册驱动 (只做一次)
方式一:Class.forName(“com.mysql.jdbc.Driver”);
推荐这种方式,不会对具体的驱动类产生依赖。
方式二:DriverManager.registerDriver(com.mysql.jdbc.Driver);
会造成DriverManager中产生两个一样的驱动,并会对具体的驱动类产生依赖。
方式三:System.setProperty(“jdbc.drivers”, “driver1:driver2”);
虽然不会对具体的驱动类产生依赖;但注册不太方便,所以很少使用。
驱动类型(四种类型)
2.建立连接(Connection)
Connection conn = DriverManager.getConnection(url, user, password);
url格式:
JDBC:子协议:子名称//主机名:端口/数据库名?属性名=属性值&…
User,password可以用“属性名=属性值”方式告诉数据库;
其他参数如:useUnicode=true&characterEncoding=GBK。
3.创建执行SQL的语句(Statement)
StatementStatement st = conn.createStatement();st.executeQuery(sql);PreparedStatementString sql = “select * from table_name where col_name=?”;PreparedStatement ps = conn.preparedStatement(sql);ps.setString(1, “col_value”);ps.executeQuery();
4.处理执行结果(ResultSet)
ResultSet rs = statement.executeQuery(sql);While(rs.next()){rs.getString(“col_name”);rs.getInt(“col_name”);//…}
5.释放资源
释放ResultSet, Statement,Connection.数据库连接(Connection)是非常稀有的资源,用完后必须马上释放,如果Connection不能及时正确的关闭将导致系统宕机。Connection的使用原则是尽量晚创建,尽量早的释放。
下面来看一下完整的Demo:
工具类:JdbcUtils
package com.weijia.firstdemo;import java.sql.Connection;import java.sql.DriverManager;import java.sql.ResultSet;import java.sql.SQLException;import java.sql.Statement;import javax.sql.DataSource;public class JdbcUtils { private static String user = "root"; private static String password = "123456"; private static String dbName = "test"; private static String url = "jdbc:mysql://localhost:3306/"+dbName+"?user="+user+"&password="+password+"&useUnicode=true&characterEncoding=gb2312"; private static DataSource dataSource = null; /** * 加载驱动 */ static{ try{ Class.forName("com.mysql.jdbc.Driver"); }catch(Exception e){ System.out.println("Exception:"+e.getMessage()+""); throw new ExceptionInInitializerError(e); } } private JdbcUtils(){ } /** * 获取连接 * @return * @throws SQLException */ public static Connection getConnection() throws SQLException{ return DriverManager.getConnection(url); } public static DataSource getDataSource(){ return dataSource; } /** * 释放资源 * @param rs * @param st * @param conn */ public static void free(ResultSet rs,Statement st,Connection conn){ try{ if(rs != null){ rs.close(); } }catch(SQLException e){ e.printStackTrace(); }finally{ try{ if(st != null){ st.close(); } }catch(SQLException e){ e.printStackTrace(); }finally{ try{ if(conn != null){ conn.close(); } }catch(SQLException e){ e.printStackTrace(); } } } }}
测试类:
package com.weijia.firstdemo;import java.sql.Connection;import java.sql.DriverManager;import java.sql.ResultSet;import java.sql.SQLException;import java.sql.Statement;public class Demo { public static void main(String[] args) throws Exception{ //测试代码: test(); //标准规范代码: template(); } //模板代码 public static void template(){ Connection conn = null; Statement st = null; ResultSet rs = null; try { conn = JdbcUtils.getConnection(); //创建语句 st = conn.createStatement(); //执行语句 rs = st.executeQuery("select * from user"); //处理结果 while(rs.next()){ System.out.println(rs.getObject(1) + "\t" + rs.getObject(2) + "\t" + rs.getObject(3) + "\t"); } }catch(SQLException e){ e.printStackTrace(); }catch(Exception e){ e.printStackTrace(); }finally{ JdbcUtils.free(rs, st, conn); } } //测试 static void test() throws Exception{ //注册驱动 DriverManager.registerDriver(new com.mysql.jdbc.Driver()); //通过系统属性来注册驱动 System.setProperty("jdbc.drivers",""); //静态加载驱动 Class.forName("com.mysql.jdbc.Driver"); //建立连接 String url = "jdbc:mysql://localhost:3306"; String userName = "root"; String password = ""; Connection conn = DriverManager.getConnection(url,userName,password); //创建语句 Statement st = conn.createStatement(); //执行语句 ResultSet rs = st.executeQuery("select * from user"); //处理结果 while(rs.next()){ System.out.println(rs.getObject(1) + "\t" + rs.getObject(2) + "\t" + rs.getObject(3) + "\t"); } //释放资源 rs.close(); st.close(); conn.close(); }}
注意:这里还要记住引入额外的jar.这个网上很多的,这里使用的是MySql,搜一下MySql驱动的jar就行了。这里我们将一些操作都放到一个工具类中,这种方式是很优雅的。
使用JDBC来实现CRUD的操作
我们这里就采用分层操作:Dao层,Service层
首先看一下domain域中的User实体
package com.weijia.domain;import java.util.Date;public class User { private int id; private String name; private Date birthday; private float money; public User(){ } public User(int id,String name,Date birthday,float money){ this.id = id; this.name = name; this.birthday = birthday; this.money = money; } public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Date getBirthday() { return birthday; } public void setBirthday(Date birthday) { this.birthday = birthday; } public float getMoney() { return money; } public void setMoney(float money) { this.money = money; } @Override public String toString(){ return "[id="+id+",name="+name+",birthday="+birthday+",money="+money+"]"; }}
再来看一下Dao层结构:
接口:
package com.weijia.domain;public interface UserDao { //添加用户 public void addUser(User user); //通过userid查询用户,id是唯一的,所以返回的是一个user public User getUserById(int userId); //更新用户信息 public int update(User user); //删除用户信息 public int delete(User user); }
实现类:
package com.weijia.domain;import java.sql.Connection;import java.sql.Date;import java.sql.PreparedStatement;import java.sql.ResultSet;import com.weijia.firstdemo.JdbcUtils;public class UserDaoImpl implements UserDao{ /** * 添加用户 */ public void addUser(User user) { Connection conn = null; PreparedStatement st = null; try{ conn = JdbcUtils.getConnection(); String sql = "insert into user(id,name,birthday,money) values(?,?,?,?)"; st = conn.prepareStatement(sql); st.setInt(1,user.getId()); st.setString(2,user.getName()); //日期格式的转换(utils.date转化成sql.date) st.setDate(3,new Date(user.getBirthday().getTime())); st.setFloat(4, user.getMoney()); int count = st.executeUpdate(); System.out.println("添加记录条数:"+count); }catch(Exception e){ throw new DaoException(e.getMessage(),e); }finally{ JdbcUtils.free(null, st, conn); } } /** * 删除用户 */ public int delete(User user) { Connection conn = null; PreparedStatement st = null; try{ conn = JdbcUtils.getConnection(); String sql = "delete from user where id=?"; st = conn.prepareStatement(sql); st.setInt(1,user.getId()); int count = -