zoukankan      html  css  js  c++  java
  • 数据库增删改查及优化

    创建一个工程,导入所需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

  • 相关阅读:
    PHP 数组函数整理
    HTML5多文件上传
    ttf字体转换成web中使用的woff、svg、eot格式字体
    jQuery之防止冒泡事件
    HTTP协议详解(真的很经典)
    selenium + python自动化测试unittest框架学习(七)随机生成姓名
    selenium + python自动化测试unittest框架学习(四)python导入模块及包知识点
    selenium + python自动化测试unittest框架学习(五)webdriver的二次封装
    selenium + python自动化测试unittest框架学习(三)webdriver对页面其他控件操作(三)
    selenium + python自动化测试unittest框架学习(三)webdriver元素操作(二)
  • 原文地址:https://www.cnblogs.com/MissSu/p/6129617.html
Copyright © 2011-2022 走看看