Java 基于数据库实现队列 java编写数据库
转载
1 创建day14数据库,创建user.sql表:
A 创建数据库 day14
B 创建数据表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
<?xmlversion="1.0" encoding="utf-8"?>
<c3p0-config>
<default-config>
<propertyname="initialPoolSize">5</property>
<propertyname="maxPoolSize">20</property>
<propertyname="driverClass">com.mysql.jdbc.Driver</property>
<propertyname="jdbcUrl">jdbc:mysql://localhost:3306/day14</property>
<propertyname="user">root</property>
<propertyname="password">123456</property>
</default-config>
<named-configname="toto">
<propertyname="initialPoolSize">5</property>
<propertyname="maxPoolSize">20</property>
<propertyname="driverClass">com.mysql.jdbc.Driver</property>
<propertyname="jdbcUrl">jdbc:mysql://localhost:3306/day14</property>
<propertyname="user">root</property>
<propertyname="password">123456</property>
</named-config>
</c3p0-config>
|
4 编写User.java
package cn.toto.domain;
publicclass User {
privateint id;
private String username;
private String password;
publicint getId() {
return id;
}
publicvoid setId(int id) {
this.id = id;
}
public String getUsername() {
return username;
}
publicvoid setUsername(String username) {
this.username = username;
}
publicString
return password;
}
publicvoid 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");//配置文件中设置的内容
}
//获取与指定数据的连接
public static DataSource getSource(){
return ds;
}
//获得与指定数据库的连接
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);
//替换参数
int pos = 1;//设置一个脚标
//for(Object param : params) 这样写是有错误的,会有空指针异常,要写成如下的方法:
for(int i=0;params!=null&&i<params.length;i++)
pstmt.setObject(i+1, params[1]);//由于不知道是什么类型的,故可以用Object
//发送sql
int num = pstmt.executeUpdate();
//返回结果
if(num>0)
return true;
return false;
} catch (SQLException e) {
throw new DaoException(e);
}finally{
release(rs,pstmt,conn);
}
}
//实现一个通用的查询方法
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);
//替换参数
for(int i=0;params!=null&&i<params.length;i++)
pstmt.setObject(i+1, params[1]);//由于不知道是什么类型的,故可以用Object
//发送sql
rs = pstmt.executeQuery();
//处理结果集
/*我们在方法中需要一种功能让调用者里调用
* 在方法的内部都有一个模块不会写,有变化,需要留给调用者来处理*/
//这时我们需要用一种设计模式策略模式 TreeSet
//TreeSet 实现排序,只是实现了部分功能(二叉树,还有没实现的)
//(元素的比较) 让我们传入比较器来实现
//让我们传入比较器实现Comparator的compare方法
/*元素的自然顺序 实现Comparable接口的compareTo方法*/
//向调用者要一个结果集处理器
Object result = handler.handle(rs);//调用结果处理器的handle方法,它返回的结果就是我们想要的。将结果集变成了一个对象
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);
//替换参数
int pos = 1;//设置一个脚标
for(Object param : params)
pstmt.setObject(pos, param);//由于不知道是什么类型的,故可以用Object
//发送sql
int num = pstmt.executeUpdate();
//返回结果
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;
importjava.sql.ResultSet;
importjava.sql.SQLException;
importjava.util.ArrayList;
import java.util.List;
import cn.toto.domain.User;
importcn.toto.exception.DaoException;
import cn.toto.utils.BeanHandler;
import cn.toto.utils.BeanListHandler;
import cn.toto.utils.JdbcUtils;
importcn.toto.utils.ResultSetHandler;
publicclass UserDao {
public List<User> getAll() {
//写sql
String sql = "select * from users";
//封装参数
//实现结果集处理器 也可以用默认的实现类
List list = (List) JdbcUtils.query(sql, null, new BeanListHandler(User.class));
returnlist;
}
public User find(int id){
String sql = "select * from users where id = ?";
//调用方法
User user = (User) JdbcUtils.query(sql, new Object[]{id}, new BeanHandler(User.class));
return user;
}
publicbooleaninsert(User user) {
/*//写Sql
String sql = "insert into users(username,password) values(?,?)";
//封装参数
Object[] params = new Object[2];
params[0] = user.getUsername();
params[1] = user.getPassword();
//调用新方法
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;
}
publicboolean update(User user) {
String sql = "update users set username=?,password=? where id=?";
return JdbcUtils.update(sql, new Object[]{
user.getUsername()
,user.getPassword()
,user.getId()
});
}
publicboolean delete(int id) {
String sql = "delect from users where id=?";
return JdbcUtils.update(sql, new Object[]{id});
}
}
|
7 编写自定义异常:DaoException.java
package cn.toto.exception;
publicclass DaoException extends RuntimeException {
privatestaticfinallongserialVersionUID = 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
在测试类中所有的类中都用到的数据可以写在@BeforeClass中。
package cn.toto.utils;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
importjava.sql.SQLException;
import org.apache.commons.beanutils.BeanUtils;
importcn.toto.domain.User;
import cn.toto.exception.DaoException;
publicclassBeanHandlerimplements ResultSetHandler {
privateClass clazz;
public BeanHandler(Class clazz) {
this.clazz = clazz;
}
//将结果集的第一行数据封装到bean返回,要想返回,得加一个返回的类型,上面的代码就是获得类型的代码
public Object handle(ResultSet rs) {
try {
if(rs.next()){
Object bean = this.clazz.newInstance(); //根据传入的创建一个相应类型的bean
//获得元数据
ResultSetMetaData metaData = rs.getMetaData();
int columnCount = metaData.getColumnCount();
for(int i=1;i<=columnCount;i++) {
//根据列的编号获得列名
String name = metaData.getColumnName(i);
//根据列名获得这一行中这一列的值
Object value = rs.getObject(name);
//使用beanutils实现属性的封装
BeanUtils.setProperty(bean, name, value);
}
//返回bean
return bean;
}
returnnull;
} catch (Exception e) {
thrownew DaoException(e);
}
}
}
|
9 编写BeanListHandler.java
package cn.toto.utils;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
importjava.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import org.apache.commons.beanutils.BeanUtils;
import cn.toto.exception.DaoException;
//它的功能是将数据封装到bean,然后再将数据封装到List集合中
publicclass BeanListHandler implements ResultSetHandler {
privateClass clazz;
public BeanListHandler(Class clazz){
this.clazz = clazz;
}
//实现接口,要实现接口中的方法中。
//将结果集的每一行封装到bean,将bean加入一个List返回
public Object handle(ResultSet rs) {
try{
List list = newArrayList();
while(rs.next()){
Object bean = this.clazz.newInstance();
//知道列名 把列名作为属性来用
//获得结果集的元数据
ResultSetMetaData metaData = rs.getMetaData();
//获得列的数量
int columnCount = metaData.getColumnCount();
for(int i=1;i<=columnCount;i++){
//获得类名
String columnName = metaData.getColumnName(i);
//获得列对应的值 注意现在结果集的游标是指向某一行的
Object value = rs.getObject(columnName);
BeanUtils.setProperty(bean, columnName, value);
}
//将bean存入List集合
list.add(bean);
}
return list;
}catch(Exception e){
thrownew DaoException(e);
}
}
}
|
10 编写ResultSetHandler.java
package cn.toto.utils;
import java.sql.ResultSet;
publicinterface 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;
publicclass UserDaoTest {
private UserDao dao = new UserDao();
@Test
publicvoid testInsert() {
User user = new User();
user.setUsername("zhangsan");
user.setPassword("11111111");
boolean b = dao.insert(user);
System.out.println(b);
}
@Test
publicvoid testGetAll() {
List all = dao.getAll();
System.out.println(all);
}
@Test
publicvoid testFind() {
User user = dao.find(0);
System.out.println(user);
}
}
|
本文章为转载内容,我们尊重原作者对文章享有的著作权。如有内容错误或侵权问题,欢迎原作者联系我们进行内容更正或删除文章。