数据库增删改查及优化

创建一个工程,导入所需jar包,本例使用MySQL数据库,Navicat可视化工具,使用开源的c3p0连接池,采用单元测试,结构如下:

例中用到的表:

应用程序直接获取连接有很多缺点:

而使用数据库连接池大大提升程序性能:数据库连接池负责分配,管理和释放数据库连接,它允许应用程序重复使用一个现有的数据库连接,而不是重新建立一个

下面是代码部分:

StudentPO 类:

package po;
import java.util.Date;
public class StudentPO
{
private String sno;
private String name;
private char sex;
private Date birthday;
public StudentPO(String sno, String name, char sex, Date birthday) {
this();
this.sno = sno;
this.name = name;
this.sex = sex;
this.birthday = birthday;
}
public StudentPO()
{
super();
// TODO Auto-generated constructor stub
}

public String getSno()
{
return sno;
}

public void setSno(String sno)
{
this.sno = sno;
}
public String getName()
{
return name;
}

public void setName(String name)
{
this.name = name;
}
public char getSex()
{
return sex;
}
public void setSex(char sex)
{
this.sex = sex;
}
public Date getBirthday()
{
return birthday;
}
public void setBirthday(Date birthday)
{
this.birthday = birthday;
}
}

StudentDAOI 类:

package dao;

import java.util.List;

import po.StudentPO;

public interface StudentDAOI
{
public boolean addStudent(StudentPO student);
public boolean delStudent(String sno);
public boolean updStudent(StudentPO student);
public StudentPO getStudentBySno(String sno);
public List<StudentPO> getStudents();
}

DBUtil 类:

package dao.impl;

import java.beans.PropertyVetoException;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.List;

import com.mchange.v2.c3p0.ComboPooledDataSource;

public abstract class DBUtil {
// c3p0连接池(优化性能)
private static ComboPooledDataSource dataSource;

static {
String url = "jdbc:mysql://localhost:3306/db1?useUnicode=true&characterEncoding=utf-8";
String userName = "root";
String password = "sxh";
String driver = "com.mysql.jdbc.Driver";
dataSource = new ComboPooledDataSource();
try {
dataSource.setDriverClass(driver);
dataSource.setJdbcUrl(url);
dataSource.setUser(userName);
dataSource.setPassword(password);
dataSource.setMaxPoolSize(30);
dataSource.setMinPoolSize(10);
dataSource.setMaxStatements(10000);
} catch (PropertyVetoException e) {
e.printStackTrace();
}
}

public static Connection getConn() {
try {
return dataSource.getConnection();
} catch (SQLException e) {
e.printStackTrace();
}
return null;
}

// 单例模式
/*
* private static Connection conn = null; static {//类加载的时候就执行 String url =
* "jdbc:mysql://localhost:3306/db1?useUnicode=true&characterEncoding=UTF-8"
* ; String userName = "root"; String password = "sxh";
*
* //SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd"); //
* 不转格式就会出错:Incorrect date value: ‘Sat Nov 26 21:27:48 GMT+08:00 2016‘ try {
* Class.forName("com.mysql.jdbc.Driver"); conn =
* DriverManager.getConnection(url,userName,password); } catch (SQLException
* e) { // TODO Auto-generated catch block e.printStackTrace(); } catch
* (ClassNotFoundException e) { // TODO Auto-generated catch block
* e.printStackTrace(); } }
*/

public static boolean cud(String sql, List<Object> params) {
boolean flag = false;
PreparedStatement pstat = null; // 预处理语句
Connection conn = null;
try
{
conn = dataSource.getConnection();
pstat = conn.prepareStatement(sql);

if(params!=null)
{
for(int idx=0;idx<params.size();idx++)
{
pstat.setObject(idx+1, params.get(idx));
}
}

int result = pstat.executeUpdate();
flag = (result>0)?true:false;
}catch (Exception e) {
e.printStackTrace();
}
// TODO Auto-generated method stub
System.out.println(flag);
return flag;
}

public static void close(ResultSet rs,PreparedStatement pstat,Connection conn)
{
try
{
if(rs!=null) rs.close();
if(pstat!=null) pstat.close();
if(conn!=null) conn.close();
}
catch(Exception e)
{
e.printStackTrace();
}
}
}

StudentDAOImpl类:

package dao.impl;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;

import po.StudentPO;
import dao.StudentDAOI;

public class StudentDAOImpl extends DBUtil implements StudentDAOI {
public boolean addStudent(StudentPO student) {
String sql = "insert into t_student values(?,?,?,?)";
List<Object> params = new ArrayList<Object>();
params.add(student.getSno());
params.add(student.getName());
params.add(student.getSex() + "");
params.add(student.getBirthday());
System.out.println(student.getClass());
// 静态方法的使用 ,可用类名或对象名来调用
System.out.println(DBUtil.cud(sql, params));
return DBUtil.cud(sql, params);
}

public boolean delStudent(String sno) {
String sql = "delete from t_student where sno = ?";
List<Object> params = new ArrayList<Object>();
params.add(sno);
return DBUtil.cud(sql, params);
}

public boolean updStudent(StudentPO student) {
// SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd");
String sql = "update t_student set name=?,sex=?,birthday=? where sno=?";
List<Object> params = new ArrayList<Object>();
// 四个参数的添加顺序跟SQL语句的参数顺序一致
params.add(student.getName());
params.add(student.getSex() + "");
params.add(student.getBirthday());
params.add(student.getSno());
System.out.println(DBUtil.cud(sql, params));
return DBUtil.cud(sql, params);
}

public StudentPO getStudentBySno(String sno) {
String sql = "select * from t_student where sno = ?";
List<Object> params = new ArrayList<Object>();
params.add(sno);
List<StudentPO> students = gets(sql, params);
return (students.size() > 0) ? students.get(0) : null;
}

public List<StudentPO> getStudents() {
String sql = "select * from t_student";
return gets(sql, null);
}

private List<StudentPO> gets(String sql, List<Object> params) {
List<StudentPO> students = new ArrayList<StudentPO>();

Connection conn = DBUtil.getConn();
PreparedStatement pstat = null;
ResultSet rs = null;
try {
pstat = conn.prepareStatement(sql);

if (params != null) {
for (int idx = 0; idx < params.size(); idx++) {
pstat.setObject(idx + 1, params.get(idx));
}
}

rs = pstat.executeQuery();

StudentPO student = null;
// 用反射可以实现通用
while (rs.next()) {
student = new StudentPO();
student.setSno(rs.getString("sno"));
student.setName(rs.getString("name"));
student.setSex(rs.getString("sex").charAt(0));
student.setBirthday(rs.getDate("birthday"));
students.add(student);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
DBUtil.close(rs, pstat, conn);
}
return students;
}
}

AppMain类:

package app;

import java.util.Date;
import org.junit.Test;

import dao.StudentDAOI;
import dao.impl.StudentDAOImpl;

import po.StudentPO;

public class AppMain
{
private StudentDAOI studentDAO;

public AppMain()
{
studentDAO = new StudentDAOImpl();
}
@Test
public void testAddStudent()
{
StudentPO student = new StudentPO("2","刘嘉玲",‘m‘,new Date());
studentDAO.addStudent(student);
}

@Test
public void testDelStudent()
{
studentDAO.delStudent("1");
}

@Test
public void testUpdStudent()
{
StudentPO student = new StudentPO("2","海星叔",‘m‘,new Date());
studentDAO.updStudent(student);
}

@Test
public void testGetStudentBySno()
{
StudentPO student = studentDAO.getStudentBySno("s001");
System.out.println(student.getName());
}

@Test
public void testGetStudents()
{
List<StudentPO> students = studentDAO.getStudents();
System.out.println(students.size());
}

}

进行单元测试

代码地址:

http://pan.baidu.com/s/1ciRPcq

时间: 2024-08-25 19:16:42

数据库增删改查及优化的相关文章

【Android】Sqlite数据库增删改查

Android系统内置一个Sqlite数据库,如果app需要使用Sqlite数据库数据库存储数据,Android会为此app生成一个.db文件.这个数据库在data/data/<package_name>/databases里面,其中<package_name>为该安卓app的工程包名,这个目录必须root后才能看到.在Windows,单机的应用程序,存储数据,基本放到一个文件里面,正如游戏的存档,基本就是把当前的游戏状态存到一个用户很难找到的文件里面.每次存档读档就是一个从这个存

(转)SQLite数据库增删改查操作

原文:http://www.cnblogs.com/linjiqin/archive/2011/05/26/2059182.html SQLite数据库增删改查操作 一.使用嵌入式关系型SQLite数据库存储数据 在Android平台上,集成了一个嵌入式关系型数据库--SQLite,SQLite3支持NULL.INTEGER.REAL(浮点数字).TEXT(字符串文本)和BLOB(二进制对象)数据类型,虽然它支持的类型只有五种,但实际上sqlite3也接受varchar(n).char(n).d

Yii2.0高级框架数据库增删改查的一些操作(转)

yii2.0框架是PHP开发的一个比较高效率的框架,集合了作者的大量心血,下面通过用户为例给大家详解yii2.0高级框架数据库增删改查的一些操作 ----------------------------------------------------------------------------------------------------- User::find()->all();    //返回所有用户数据:User::findOne($id);   //返回 主键 id=1  的一条数

Yii2.0高级框架数据库增删改查的一些操作

yii2.0框架是PHP开发的一个比较高效率的框架,集合了作者的大量心血,下面通过用户为例给大家详解yii2.0高级框架数据库增删改查的一些操作 ----------------------------------------------------------------------------------------------------- User::find()->all();    //返回所有用户数据:User::findOne($id);   //返回 主键 id=1  的一条数

MVC——数据库增删改查

MVC: V(View) :视图→就是页面的模板 C(Control): 控制器→客户主要面对的就是控制器, M(Model):模板→在模板里面主要就是写关于数据库的各种增删改查的方法 它们之间的关系就是→ 在控制器里调用模板里的方法,然后把得到的数据传到视图里,视图就会把得到的数据添加到自己的页面上,在通过视图里反馈的值传到控制器上.以实现对数据库的操作和控制器页面的显示.(大概是这样) 下面是对数据库增删改查的代码 一.各种数据库操作的方法(增删改查) namespace 数据库增删改查.M

Java+MyEclipse+Tomcat (六)详解Servlet和DAO数据库增删改查操作

此篇文章主要讲述DAO.Java Bean和Servlet实现操作数据库,把链接数据库.数据库操作.前端界面显示分模块化实现.其中包括数据的CRUD增删改查操作,并通过一个常用的JSP网站前端模板界面进行描述.参考前文: Java+MyEclipse+Tomcat (一)配置过程及jsp网站开发入门 Java+MyEclipse+Tomcat (二)配置Servlet及简单实现表单提交 Java+MyEclipse+Tomcat (三)配置MySQL及查询数据显示在JSP网页中 Java+MyE

Android中内容提供者ContentProvider实现数据库增删改查

1.我们首先new一个我们自己的类集成ContentProvider,并实现方法如下 package com.wzw.sqllitedemo.providers; import com.wzw.sqllitedemo.db.PersonSQLiteOpenHelper; import android.content.ContentProvider; import android.content.ContentUris; import android.content.ContentValues;

Java连接MySQL数据库增删改查通用方法

Java连接MySQL数据库增删改查通用方法 运行环境:eclipse+MySQL 以前我们Java连接MySQL数据库都是一个数据库写一个类,类下面写好多方法,要是多个数据库,就要写多个类多个方法,导致代码编写太过于繁琐,所以为了改变这样的繁琐,我将连接数据库的方法进行了一系列的封装,使用户传入一个对象值Object就可以得到想要的. 我在之前写过一篇普通的Java连接MySQL数据库,大家可以看看,以便对比参考之后就知道差距了  数据库--MySQL-->Java篇 接下来我给大家讲讲如何将

go——beego的数据库增删改查

一直都不理解使用go语言的时候,为什么还要自己去装beego,以为使用go便可以解决所有的问题,结果在朋友的点拨下,才意识到: go与beego的关系就好比是nodejs与thinkjs的关系,因此也就不怎么存在疑问为什么还要继续安装beego来完成项目运行了,beego其实就是一个快速开发Go应用的http框架,go 语言方面技术大牛,可以用来快速开发API.Web.后端服务等各种应用,是一个RESTFul的框架.再次附上beego的官网(http://beego.me/docs/intro/