该博客仅专为我的小伙伴提供参考而附加,没空加上代码具体解析,望各位谅解

1、在MySQL中运行以下脚本

CREATE DATABASE mydatabase;

USE mydatabase;

CREATE TABLE customers (

customerID varchar(8) primary key,

name varchar(40) default NULL,

phone varchar(16) default NULL

);

INSERT INTO customers VALUES ('ADDIFK01','Frank Addinsell',

'(718) 555-3911');

INSERT INTO customers VALUES ('ALBIBB01','Bob Albinoni',

'(213) 555-7566');

 使用 JDBC编写程序读出数据库表中数据并在Console下如下输出内容

2、调试上面实验指导部分“四、数据库分层设计”部分代码

依据上课时教学内容补充SQLHelper类内容,为其增加

1) 执行带参数的SQL语句方法,含执行Select及CUID两个函数;

public static ResultSet executeQuery(String sql,Object[] params) {
try {
rs= getPreparedStatement(sql,params).executeQuery();
return rs;
} catch (SQLException e) {
e.printStackTrace();
return null;
} catch (Exception e) {
e.printStackTrace();
return null;
}
}

2 为其增加返回唯一值得函数(如计算最大值、记录数等);

    public static Object executeQueryScala(String sql) {
Object o=null;
try {
rs=executeQuery(sql, null); if(rs.next()) {
o=rs.getDate(1);
}
if(o!=null)
return o;
else
return null;
} catch (SQLException e) {
e.printStackTrace();
return null;
} catch (Exception e) {
e.printStackTrace();
return null;
}finally {
DBUtil.closeAll(rs, pst, DBUtil.connection);
}
}

 3) 增加返回集合的函数

    public static  List<Object[]> executeQueryList(String sql){
Object[] o=new Object[2];
List<Object[]> obs=new ArrayList<Object[]>();
PreparedStatement pst =null;
ResultSet rs =null;
try {
rs = DBUtil.executeQuery(sql, null);
while(rs.next()) { /*未知列数 因此提取不出所有*/
o[0]=(rs.getObject(0));
o[1]=(rs.getObject(0));
obs.add(o);
}
return obs;
} catch (SQLException e) {
e.printStackTrace();
return null;
} catch (Exception e) {
e.printStackTrace();
return null;
}finally {
DBUtil.closeAll(rs, pst, DBUtil.connection);
}
}

3、运用上面数据库设计思想,继续完成上次实验。以JDBC技术创建一个通讯录应用程序,要求通讯录中必须含有编号、姓名,性别、电话、地址、Email等等。实现该类并包含添加、删除、修改、按姓名查等几个方法。编写主程序测试。

该程序体量较小 没增加server层 (用于连接dao层与view层)

第一步:编写一个Person联系人类

package entity;

public class Person {
private int pid; //编号
private String name; // 姓名
private String sex; // 性别
private String tel; // 电话
private String address; // 地址
private String email; //email public Person(int pid, String name, String sex, String tel, String address, String email) {
this.pid = pid;
this.name = name;
this.sex = sex;
this.tel = tel;
this.address = address;
this.email = email;
} public int getPid() {
return pid;
}
public void setPid(int pid) {
this.pid = pid;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public String getTel() {
return tel;
}
public void setTel(String tel) {
this.tel = tel;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
@Override
public String toString() {
return "Person [pid=" + pid + ", name=" + name + ", sex=" + sex + ", tel=" + tel + ", address=" + address
+ ", email=" + email + "]";
} }

第二步:编写一个PersonDao封装对联系人类的有关操作

package dao;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import entity.Person;
import util.DBUtil;
public class PersonDao {
//增加人
public void addPerson(Person p){
String sql="insert into customers values(?,?,?,?,?,?);";
Object params[]= {p.getPid(),p.getName(),p.getSex(),p.getTel(),p.getAddress(),p.getEmail()};
DBUtil.executeUpdate(sql, params);
}
// 通过人的编号删除 联系人
public void deletePersonByID(int pid){
String sql="delete from person where pid=?";
Object params[]= {pid};
DBUtil.executeUpdate(sql,params);
}
//通过人的姓名查找联系人,返回一个集合
public List<Person> queryPersonByName(String name){
Person p=null;
List<Person> ps=new ArrayList<Person>();
PreparedStatement pst =null;
ResultSet rs =null;
try {
String sql="select * from person where name=?";
Object params[]= {name};
rs = DBUtil.executeQuery(sql, params);
while(rs.next()) {
int id=rs.getInt("customerID");
String sex=rs.getString("sex");
String tel=rs.getString("tel");
String address=rs.getString("address");
String email=rs.getString("email");
p=new Person(id, name, sex,tel,address,email);
ps.add(p);
}
return ps;
} catch (SQLException e) {
e.printStackTrace();
return null;
} catch (Exception e) {
e.printStackTrace();
return null;
}finally {
DBUtil.closeAll(rs, pst, DBUtil.connection);
}
}
// 查询所有人
public List<Person> quaryall(){
Person p=null;
List<Person> ps=new ArrayList<Person>();
PreparedStatement pst =null;
ResultSet rs =null;
try {
String sql="select * from person";
Object params[]= {};
rs = DBUtil.executeQuery(sql, params);
while(rs.next()) {
int id=rs.getInt("pid");
String name=rs.getString("name");
String sex=rs.getString("sex");
String tel=rs.getString("tel");
String address=rs.getString("address");
String email=rs.getString("email");
p=new Person(id, name, sex,tel,address,email);
ps.add(p);
}
return ps;
} catch (SQLException e) {
e.printStackTrace();
return null;
} catch (Exception e) {
e.printStackTrace();
return null;
}finally {
DBUtil.closeAll(rs, pst, DBUtil.connection);
}
}
public List<Person> quarybyitems(String strsql) {
Person p=null;
List<Person> ps=new ArrayList<Person>();
PreparedStatement pst =null;
ResultSet rs =null;
try {
String sql="select * from person where 1=1 "+strsql;
Object params[]= {};
rs = DBUtil.executeQuery(sql, params);
while(rs.next()) {
int id=rs.getInt("pid");
String name=rs.getString("name");
String sex=rs.getString("sex");
String tel=rs.getString("tel");
String address=rs.getString("address");
String email=rs.getString("email");
p=new Person(id, name, sex,tel,address,email);
ps.add(p);
}
return ps;
} catch (SQLException e) {
e.printStackTrace();
return null;
} catch (Exception e) {
e.printStackTrace();
return null;
}finally {
DBUtil.closeAll(rs, pst, DBUtil.connection);
} }
public boolean update(String strsql) {
String sql="insert person values"+strsql;
Object[] params= {};
return DBUtil.executeUpdate(sql, params);
}
}

第三步:编写一个测试Swing类,有界面使用JTable显示,参考书本上关于JTable控件的使用

演示截图

package view;

import java.awt.BorderLayout;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import java.util.List; import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JTextField; import dao.PersonDao;
import entity.Person; public class TestFrm extends JFrame{
private static final long serialVersionUID = 1L;
PersonDao pd=new PersonDao();
JPanel jp1=new JPanel();
Object[] Names1 = {"编号","姓名","性别","电话","地址","email"};
JTable table1;
TestFrm(){
JLabel label1=new JLabel("编号");
JLabel label2=new JLabel("姓名");
JLabel label3=new JLabel("性别");
JLabel label4=new JLabel("电话");
JLabel label5=new JLabel("地址");
JLabel label6=new JLabel("email");
JTextField jt1=new JTextField();
JTextField jt2=new JTextField();
JTextField jt3=new JTextField();
JTextField jt4=new JTextField();
JTextField jt5=new JTextField();
JTextField jt6=new JTextField();
JButton jb1=new JButton("查询");
JButton jb2=new JButton("增加");
JButton jb3=new JButton("删除");
JButton jb4=new JButton("显示所有"); jp1.setLayout(new GridLayout(4, 4));
jp1.add(label1);
jp1.add(jt1);
jp1.add(label2);
jp1.add(jt2);
jp1.add(label3);
jp1.add(jt3);
jp1.add(label4);
jp1.add(jt4);
jp1.add(label5);
jp1.add(jt5);
jp1.add(label6);
jp1.add(jt6);
jp1.add(jb1);
jp1.add(jb2);
jp1.add(jb3);
jp1.add(jb4);
jb1.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
String strsql="";
if(!jt1.getText().isEmpty())
strsql+=" and pid="+jt1.getText();
if(!jt2.getText().isEmpty())
strsql+=" and name='"+jt2.getText()+"'";
if(!jt3.getText().isEmpty())
strsql+=" and sex='"+jt3.getText()+"'";
if(!jt4.getText().isEmpty())
strsql+=" and tel='"+jt4.getText()+"'";
if(!jt5.getText().isEmpty())
strsql+=" and address='"+jt5.getText()+"'";
if(!jt6.getText().isEmpty())
strsql+=" and email='"+jt6.getText()+"'";
List<Person> list = pd.quarybyitems(strsql); reset(list);
}
});
jb2.addActionListener(new ActionListener() { @Override
public void actionPerformed(ActionEvent e) {
if(jt1.getText().isEmpty()||jt2.getText().isEmpty()||jt3.getText().isEmpty()||jt4.getText().isEmpty()||jt5.getText().isEmpty()||jt6.getText().isEmpty())
JOptionPane.showMessageDialog(null, "请输入完整!!");
else {
String strsql="("+jt1.getText()+",\""+jt2.getText()+"\",\""+jt3.getText()+"\",\""+jt4.getText()+"\",\""+jt5.getText()+"\",\""+jt6.getText()+"\")";
if(pd.update(strsql)) {
JOptionPane.showMessageDialog(null, "插入成功");
List<Person> list = pd.quaryall();
reset(list);
}else {
JOptionPane.showMessageDialog(null, "插入失败");
}
}
}
});
jb3.addActionListener(new ActionListener() { @Override
public void actionPerformed(ActionEvent e) {
int pid= (int)table1.getModel().getValueAt(table1.getSelectedRow(), 0);
pd.deletePersonByID(pid);
List<Person> list = pd.quaryall();
reset(list);
}
});
jb4.addActionListener(new ActionListener() { @Override
public void actionPerformed(ActionEvent e) {
List<Person> list = pd.quaryall();
reset(list);
}
});
List<Person> list = pd.quaryall();
reset(list); setTitle("我的通讯录");
setBounds(600,400,600,350);
setVisible(true);
setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
}
private void reset(List<Person> list){
List<Object[]> b=new ArrayList<Object[]>();
for(Person p:list) {
Object[] o= {p.getPid(),p.getName(),p.getSex(),p.getTel(),p.getAddress(),p.getEmail()};
b.add(o);
}
Object[][] a = (Object[][])b.toArray(new Object[b.size()][]);
table1=new JTable(a,Names1);
getContentPane().removeAll();
add(jp1,BorderLayout.NORTH);
add(new JScrollPane(table1),BorderLayout.CENTER);
validate();
}
public static void main(String[] args) {
new TestFrm();
}
}

DBUtil包代码

 此句话作用 用于设置写入数据库与读取数据库数据编码

若遇到mysql中文编码问题 赶紧戳这里解决mysql编码常见问题分享

package util;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement; //通用的数据库操作方法
public class DBUtil {
//sql数据库连接字符串
private static final String URL="jdbc:mysql://127.0.0.1:3306/mydatabase?useUnicode=true&characterEncoding=utf8";
//sql用户名 和密码 用作连接用
private static final String USERNAME="root";
private static final String PWD="cc123nice"; public static Connection connection=null;
public static PreparedStatement pst =null;
public static ResultSet rs =null; /*
* 得到PreparedStatement减少代码冗余
*/
public static PreparedStatement getPreparedStatement(String sql,Object[] params) {
//导入驱动,加载具体驱动类
try {
Class.forName("com.mysql.jdbc.Driver");
//与数据库建立链接
connection = DriverManager.getConnection(URL, USERNAME, PWD);
pst=connection.prepareStatement(sql);
if(params!=null) {
for(int i=0;i<params.length;i++){
pst.setObject(i+1,params[i]);
}
}
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}
return pst;
}
/*
* 最后关闭所有
*/
public static void closeAll(ResultSet rs,Statement stmt,Connection connection) {
try {
if(rs!=null) rs.close();
if(stmt!=null) stmt.close();
if(connection!=null) connection.close();
} catch (SQLException e) {
e.printStackTrace();
}
} /*
* 通用的增删改 通过传入的sql和obj数组确认语句
*/
public static boolean executeUpdate(String sql,Object[] params) {
try {
int count = getPreparedStatement(sql,params).executeUpdate();
if(count>0)
return true;
else
return false;
} catch (SQLException e) {
e.printStackTrace();
return false;
} catch (Exception e) {
e.printStackTrace();
return false;
}finally {
closeAll(null, pst, connection);
}
} /*
* 通用的查询(只能返回到ResultSet)之后必须与具体类型耦合
*/
public static ResultSet executeQuery(String sql,Object[] params) { try {
rs= getPreparedStatement(sql,params).executeQuery();
return rs;
} catch (SQLException e) {
e.printStackTrace();
return null;
} catch (Exception e) {
e.printStackTrace();
return null;
}
} }

JavaEE-实验三 Java数据库高级编程的更多相关文章

  1. 20145208 实验三 Java面向对象程序设计

    20145208 实验三 Java面向对象程序设计 实验内容 初步掌握单元测试和TDD 理解并掌握面向对象三要素:封装.继承.多态 初步掌握UML建模 熟悉S.O.L.I.D原则 了解设计模式 实验步 ...

  2. 实验三 Java基本程序设计(2)

                                             实验三 Java基本程序设计(2)                                           ...

  3. 20145325张梓靖 实验五 "JAVA的网络编程"

    20145325张梓靖 实验五 "JAVA的网络编程" 实验内容 使用 JVAV语言 进行网络编程 对明文进行加密 设计过程 我完成的是客户端,服务端同伴 20145308刘昊阳 ...

  4. 实验三 Java基本程序设计

    第一部分:理论知识复习部分 第一章:第一章介绍的是Java程序设计的概述,通过两周的Java学习中,重温了Java“白皮书的关键术语,更深一步理解乐11个关键术语. 第二章:本章主要介绍如何安装JDK ...

  5. Java Web高级编程(三)

    使用过滤器改进应用程序 一.过滤器的目的 过滤器是可以拦截访问资源的请求.资源的响应或者同时拦截两者的应用组件.过滤器可以检测和修改请求和响应,同时也可以拒绝.重定向或转发请求.javax.servl ...

  6. 实验三 java敏捷开发与XP

    一.实验内容 (一)敏捷开发与XP 软件开发流程的目的是为了提高软件开发.运营.维护的效率,并提高软件的质量.用户满意度.可靠性和软件的可维护性. 光有各种流程的思想是不够的,我们还要有一系列的工具来 ...

  7. Java Web高级编程(一)

    Servlet 一.创建Servlet类 在Java EE中,Servlet用来接收和响应终端用户的请求.Servlet是所有Web应用程序的核心类,是唯一既可以直接处理和响应用户请求,也可以将处理工 ...

  8. 实验三 Java敏捷开发与xp实现

    实验内容: 1. XP基础 2. XP核心实践 3. 相关工具 实验要求 1.没有Linux基础的同学建议先学习<Linux基础入门(新版)><Vim编辑器> 课程 2.完成实 ...

  9. 实验三 Java猜数字游戏开发

    课程:Java实验   班级:201352     姓名:程涵  学号:20135210 成绩:             指导教师:娄佳鹏   实验日期:15.06.03 实验密级:         ...

随机推荐

  1. ansible常用模块详解(三)

    1.模块介绍 明确一点:模块的执行就类似是linux命令的一条命令,就单单的是为了执行一条语句,不是批量的操作,批量操作需要用到playbook内类似shell编写脚本进行批量. 1.1 模块的使用方 ...

  2. 架构师成长之路5.7-Saltstack数据系统

    点击架构师成长之路 架构师成长之路5.7-Saltstack数据系统 1. Saltstack的两种数据系统 Grains Pollars 2. Saltstack数据系统---Grains Grai ...

  3. JVM-类加载原理

    写在前面 我们知道我们编写的java代码,会经过编译器编译成字节码文件(class文件),再把字节码文件装载到JVM中,映射到各个内存区域中,我们的程序就可以在内存中运行了.那么字节码文件是怎样装载到 ...

  4. PAT Basic 1093 字符串A+B (20 分)

    给定两个字符串 A 和 B,本题要求你输出 A+B,即两个字符串的并集.要求先输出 A,再输出 B,但重复的字符必须被剔除. 输入格式: 输入在两行中分别给出 A 和 B,均为长度不超过 1的.由可见 ...

  5. PHP 随机字符

    随机字符生成 function randStr($length=4,$type="1"){ $array = array( '1' => '0123456789', '2' ...

  6. Java 实现《编译原理》简单词法分析功能 - 程序解析

    Java 实现<编译原理>简单词法分析功能 - 程序解析 简易词法分析功能 要求及功能 (1)读取一个 txt 程序文件(最后的 # 作为结束标志,不可省去) { int a, b; a ...

  7. mongodb 3.0 WT 引擎性能测试(转载)

    网上转载来的测试,仅供参考.原文地址:http://www.mongoing.com/benchmark_3_0 类机器. 测试均在单机器,单实例的情况下进行. 机器A(cache 12G,即内存&g ...

  8. inode,软硬链接

    如何查看inode ll -di /boot / /app查看文件和文件夹的inode号 df -i查看挂载点文件夹的inode号 做inode增长实验 创建60万个文件的方法1(效率不高):for ...

  9. 【鸽】poj3311 Hie with the Pie[状压DP+Floyd]

    题解网上一搜一大坨的,不用复述了吧. 只是觉得网上dp方程没多大问题,但是状态的表示含义模糊.不同于正常哈密顿路径求解,状态表示应当改一下. 首先定义一次移动为从一个点经过若干个点到达另一个点,则$f ...

  10. Adboost几个要点分析

    1.本质就是前向步进算法和加法模型,每一步计算分类器权重alpha和基分类器. 2.总体降低指数误差函数,转化为每一步降低分类误差率. 因为右边可以看作常数,所以相当于对这个进行优化 但是这一步可能做 ...