日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

07_数据库创建,添加c3p0操作所需的jar包,编写c3p0-config.xml文件,编写User.java,编写jdbcUtils.java实现操作数据库的模板工具类,UserDao编写,Dao

發(fā)布時間:2024/9/27 数据库 27 豆豆


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)Comparatorcompare方法

?????????? /*元素的自然順序? 實現(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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。