07_数据库创建,添加c3p0操作所需的jar包,编写c3p0-config.xml文件,编写User.java,编写jdbcUtils.java实现操作数据库的模板工具类,UserDao编写,Dao
1? 創(chuàng)建day14數(shù)據(jù)庫,創(chuàng)建user.sql表:
A 創(chuàng)建數(shù)據(jù)庫 day14
B 創(chuàng)建數(shù)據(jù)表 users
create table users
(
??? id int primary keyauto_increment,
??? username varchar(20),
??? password varchar(20)
);
2? 添加依賴的jar包
| c3p0-0.9.1.2.jar |
| mysql-connection-java-5.0.8-bin.jar |
| commons-beanutils-1.8.0.jar |
| commons-logging.jar |
3? 編寫c3p0-config.xml
| <?xml version="1.0" encoding="utf-8"?> <c3p0-config> ??? <default-config> ?????? <property name="initialPoolSize">5</property> ?????? <property name="maxPoolSize">20</property> ?????? <property name="driverClass">com.mysql.jdbc.Driver</property> ?????? <property name="jdbcUrl">jdbc:mysql://localhost:3306/day14</property> ?????? <property name="user">root</property> ?????? <property name="password">123456</property> ??? </default-config> ??? <named-config name="toto"> ?????? <property name="initialPoolSize">5</property> ?????? <property name="maxPoolSize">20</property> ?????? <property name="driverClass">com.mysql.jdbc.Driver</property> ?????? <property name="jdbcUrl">jdbc:mysql://localhost:3306/day14</property> ?????? <property name="user">root</property> ?????? <property name="password">123456</property> ??? </named-config> </c3p0-config> |
4 編寫User.java
| package cn.toto.domain; ? public class User { ??? private int id; ??? private String username; ??? private String password; ??? public int getId() { ?????? return id; ??? } ??? public void setId(int id) { ?????? this.id = id; ??? } ??? public String getUsername() { ?????? return username; ??? } ??? public void setUsername(String username) { ?????? this.username = username; ??? } ??? public String getPassword() { ?????? return password; ??? } ??? public void setPassword(String password) { ?????? this.password = password; ??? } ??? public User() { ?????? super(); ??? } } |
5 編寫jdbcUtils.java
| package cn.toto.utils; ? import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; ? import javax.sql.DataSource; ? import cn.toto.exception.DaoException; ? import com.mchange.v2.c3p0.ComboPooledDataSource; ? public class JdbcUtils { ??? private static DataSource ds; ??? ??? static { ?????? //ds = new ComboPooledDataSource();//默認的缺省的配置 ?????? ds = new ComboPooledDataSource("toto");//配置文件中設置的內(nèi)容 ??? } ??? ??? //獲取與指定數(shù)據(jù)的連接 ??? public static DataSource getSource(){ ?????? return ds; ??? } ??? ??? //獲得與指定數(shù)據(jù)庫的連接 ??? public static Connection getConnection() throws SQLException { ?????? //從連接池返回一個連接 ?????? return ds.getConnection(); ??? } ??? //釋放資源 ??? public static void release(ResultSet rs,Statement stmt,Connection conn) { ?????? if(rs!=null){ ?????????? try{ ????????????? rs.close(); ?????????? }catch(SQLException e){ ????????????? e.printStackTrace(); ?????????? } ?????????? rs = null; ?????? } ?????? if(stmt!=null){ ?????????? try{ ????????????? stmt.close(); ?????????? }catch(SQLException e){ ????????????? e.printStackTrace(); ?????????? } ?????????? stmt=null; ?????? } ?????? if(conn!=null){ ?????????? try{ ????????????? conn.close(); ?????????? }catch(SQLException e){ ????????????? e.printStackTrace(); ?????????? } ?????????? conn = null; ?????? } ??? } ??? ??? //寫一個通過的增刪改方法 ??? public static boolean update(String sql,Object[] params) { ?????? Connection conn = null; ?????? PreparedStatement pstmt = null; ?????? ResultSet rs = null; ?????? ?????? try { ?????????? //獲得連接 ?????????? conn = getConnection(); ?????????? //寫SQL ?????????? //預編譯sql ?????????? pstmt = conn.prepareStatement(sql); ?????????? //替換參數(shù) ?????????? int pos = 1;//設置一個腳標 ?????????? //for(Object param : params)?? 這樣寫是有錯誤的,會有空指針異常,要寫成如下的方法: ?????????? for(int i=0;params!=null&&i<params.length;i++) ????????????? pstmt.setObject(i+1, params[1]);//由于不知道是什么類型的,故可以用Object ? ?????????? //發(fā)送sql ?????????? int num = pstmt.executeUpdate(); ?????????? ?????????? //返回結(jié)果 ?????????? if(num>0) ????????????? return true; ?????????? return false; ?????? } catch (SQLException e) { ?????????? throw new DaoException(e); ?????? }finally{ ?????????? release(rs,pstmt,conn); ?????? } ??? } ??? //實現(xiàn)一個通用的查詢方法 ??? public static Object query(String sql,Object[] params,ResultSetHandler handler){ ?????? Connection conn = null; ?????? PreparedStatement pstmt = null; ?????? ResultSet rs = null; ?????? try{ ?????????? conn = getConnection(); ?????????? //寫sql ?????????? //預編譯sql ?????????? pstmt = conn.prepareStatement(sql); ?????????? //替換參數(shù) ?????????? for(int i=0;params!=null&&i<params.length;i++) ????????????? pstmt.setObject(i+1, params[1]);//由于不知道是什么類型的,故可以用Object ? ?????????? //發(fā)送sql ?????????? rs = pstmt.executeQuery(); ?????????? //處理結(jié)果集 ?????????? ?????????? /*我們在方法中需要一種功能讓調(diào)用者里調(diào)用 ?????????? ?* 在方法的內(nèi)部都有一個模塊不會寫,有變化,需要留給調(diào)用者來處理*/ ?????????? ?????????? //這時我們需要用一種設計模式策略模式 TreeSet ?????????? //TreeSet? 實現(xiàn)排序,只是實現(xiàn)了部分功能(二叉樹,還有沒實現(xiàn)的) ?????????? //(元素的比較) 讓我們傳入比較器來實現(xiàn) ?????????? //讓我們傳入比較器實現(xiàn)Comparator的compare方法 ?????????? /*元素的自然順序? 實現(xiàn)Comparable接口的compareTo方法*/ ?????????? ?????????? //向調(diào)用者要一個結(jié)果集處理器 ?????????? Object result = handler.handle(rs);//調(diào)用結(jié)果處理器的handle方法,它返回的結(jié)果就是我們想要的。將結(jié)果集變成了一個對象 ?????????? return result; ?????? }catch(SQLException e){ ?????????? throw new DaoException(e); ?????? }finally { ?????????? release(rs,pstmt,conn); ?????? } ??? } }?? ??? //寫一個通過的增刪改方法 ??? public static boolean update(String sql,Object[] params) { ?????? Connection conn = null; ?????? PreparedStatement pstmt = null; ?????? ResultSet rs = null; ?????? ?????? try { ?????????? //獲得連接 ?????????? conn = getConnection(); ?????????? //寫SQL ?????????? //預編譯sql ?????????? pstmt = conn.prepareStatement(sql); ?????????? //替換參數(shù) ?????????? int pos = 1;//設置一個腳標 ?????????? for(Object param : params) ????????????? pstmt.setObject(pos, param);//由于不知道是什么類型的,故可以用Object ?????????? ?????????? //發(fā)送sql ?????????? int num = pstmt.executeUpdate(); ?????????? ?????????? //返回結(jié)果 ?????????? if(num>0) ????????????? return true; ?????????? return false; ?????? } catch (SQLException e) { ?????????? throw new DaoException(e); ?????? }finally{ ?????????? release(rs,pstmt,conn); ?????? } ??? } } |
6 編寫UserDao.java
| package cn.toto.dao; ? import java.sql.ResultSet; import java.sql.SQLException; import java.util.ArrayList; import java.util.List; ? import cn.toto.domain.User; import cn.toto.exception.DaoException; import cn.toto.utils.BeanHandler; import cn.toto.utils.BeanListHandler; import cn.toto.utils.JdbcUtils; import cn.toto.utils.ResultSetHandler; ? public class UserDao { ? ??? public List<User> getAll() { ?????? //寫sql ?????? String sql = "select * from users"; ?????? //封裝參數(shù) ?????? ?????? //實現(xiàn)結(jié)果集處理器 也可以用默認的實現(xiàn)類 ?????? List list = (List) JdbcUtils.query(sql, null, new BeanListHandler(User.class)); ?????? ? ?????? return list; ??? } ??? ??? public User find(int id){ ?????? String sql = "select * from users where id = ?"; ?????? //調(diào)用方法 ?????? User user = (User) JdbcUtils.query(sql, new Object[]{id}, new BeanHandler(User.class)); ?????? ?????? return user; ??? } ??? ??? public boolean insert(User user) { ?????? /*//寫Sql ?????? String sql = "insert into users(username,password) values(?,?)"; ?????? //封裝參數(shù) ?????? Object[] params = new Object[2]; ?????? params[0] = user.getUsername(); ?????? params[1] = user.getPassword(); ?????? //調(diào)用新方法 ?????? boolean b = JdbcUtils.update(sql, params); ?????? return b;*/ ?????? ?????? String sql = "insert into users(username,password) values(?,?)"; ?????? boolean b = JdbcUtils.update(sql, new Object[]{user.getUsername(),user.getPassword()}); ?????? return b; ??? } ??? ??? public boolean update(User user) { ?????? String sql = "update users set username=?,password=? where id=?"; ?????? ?????? return JdbcUtils.update(sql, new Object[]{ ????????????? user.getUsername() ????????????? ,user.getPassword() ????????????? ,user.getId() ?????? }); ??? } ??? ??? public boolean delete(int id) { ?????? String sql = "delect from users where id=?"; ?????? ?????? return JdbcUtils.update(sql, new Object[]{id}); ??? } } |
7 編寫自定義異常:DaoException.java
| package cn.toto.exception; ? public class DaoException extends RuntimeException { ? ??? private static final long serialVersionUID = 1L; ? ??? public DaoException() { ??? ??? } ? ??? public DaoException(String message) { ?????? super(message); ??? } ? ??? public DaoException(Throwable cause) { ?????? super(cause); ??? ??? } ? ??? public DaoException(String message, Throwable cause) { ?????? super(message, cause); ??? ??? } } |
8 編寫BeanHandler.java
在測試類中所有的類中都用到的數(shù)據(jù)可以寫在@BeforeClass中。
| package cn.toto.utils; ? import java.sql.ResultSet; import java.sql.ResultSetMetaData; import java.sql.SQLException; ? import org.apache.commons.beanutils.BeanUtils; ? import cn.toto.domain.User; import cn.toto.exception.DaoException; ? public class BeanHandler implements ResultSetHandler { ??? private Class clazz; ??? public BeanHandler(Class clazz) { ?????? this.clazz = clazz; ??? } ??? ??? //將結(jié)果集的第一行數(shù)據(jù)封裝到bean返回,要想返回,得加一個返回的類型,上面的代碼就是獲得類型的代碼 ??? public Object handle(ResultSet rs) { ?????? try { ?????????? if(rs.next()){ ????????????? Object bean = this.clazz.newInstance(); //根據(jù)傳入的創(chuàng)建一個相應類型的bean ????????????? //獲得元數(shù)據(jù) ????????????? ResultSetMetaData metaData = rs.getMetaData(); ????????????? int columnCount = metaData.getColumnCount(); ????????????? for(int i=1;i<=columnCount;i++) { ????????????????? //根據(jù)列的編號獲得列名 ????????????????? String name = metaData.getColumnName(i); ????????????????? //根據(jù)列名獲得這一行中這一列的值 ????????????????? Object value = rs.getObject(name); ????????????????? //使用beanutils實現(xiàn)屬性的封裝 ????????????????? BeanUtils.setProperty(bean, name, value); ????????????? } ????????????? //返回bean ????????????? return bean; ?????????? } ?????????? return null; ?????? } catch (Exception e) { ?????????? throw new DaoException(e); ?????? } ??? } } |
9 編寫BeanListHandler.java
| package cn.toto.utils; ? import java.sql.ResultSet; import java.sql.ResultSetMetaData; import java.sql.SQLException; import java.util.ArrayList; import java.util.List; ? import org.apache.commons.beanutils.BeanUtils; ? import cn.toto.exception.DaoException; ? //它的功能是將數(shù)據(jù)封裝到bean,然后再將數(shù)據(jù)封裝到List集合中 public class BeanListHandler implements ResultSetHandler { ??? private Class clazz; ??? public BeanListHandler(Class clazz){ ?????? this.clazz = clazz; ??? } ??? ??? //實現(xiàn)接口,要實現(xiàn)接口中的方法中。 ??? //將結(jié)果集的每一行封裝到bean,將bean加入一個List返回 ??? public Object handle(ResultSet rs) { ?????? ?????? try{ ?????????? List list = new ArrayList(); ?????????? while(rs.next()){ ????????????? Object bean = this.clazz.newInstance(); ????????????? //知道列名? 把列名作為屬性來用 ????????????? ????????????? //獲得結(jié)果集的元數(shù)據(jù) ????????????? ResultSetMetaData metaData = rs.getMetaData(); ????????????? //獲得列的數(shù)量 ????????????? int columnCount = metaData.getColumnCount(); ????????????? for(int i=1;i<=columnCount;i++){ ????????????????? //獲得類名 ????????????????? String columnName = metaData.getColumnName(i); ????????????????? //獲得列對應的值??? 注意現(xiàn)在結(jié)果集的游標是指向某一行的 ????????????????? Object value = rs.getObject(columnName); ????????????????? BeanUtils.setProperty(bean, columnName, value); ????????????? } ????????????? //將bean存入List集合 ????????????? list.add(bean); ?????????? } ?????????? return list; ?????? }catch(Exception e){ ?????????? throw new DaoException(e); ?????? } ?????? ??? } } |
10 編寫ResultSetHandler.java
| package cn.toto.utils; ? import java.sql.ResultSet; ? public interface ResultSetHandler { ? ??? Object handle(ResultSet rs); } |
12 編寫UserDaoTest.java
| package junit.test; ? import java.util.List; ? import org.junit.Test; ? import cn.toto.dao.UserDao; import cn.toto.domain.User; ? public class UserDaoTest { ? ??? private UserDao dao = new UserDao(); ??? @Test ??? public void testInsert() { ?????? User user = new User(); ?????? ? ?????? user.setUsername("zhangsan"); ?????? user.setPassword("11111111"); ?????? ?????? boolean b = dao.insert(user); ?????? System.out.println(b); ??? } ??? @Test ??? public void testGetAll() { ?????? List all = dao.getAll(); ?????? System.out.println(all); ??? } ??? @Test ??? public void testFind() { ?????? User user = dao.find(0); ?????? System.out.println(user); ??? } } |
?
總結(jié)
以上是生活随笔為你收集整理的07_数据库创建,添加c3p0操作所需的jar包,编写c3p0-config.xml文件,编写User.java,编写jdbcUtils.java实现操作数据库的模板工具类,UserDao编写,Dao的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 杀死福顺女主开的车叫什么
- 下一篇: 生源地助学贷款会不会申请失败