两小时一个Java小项目---TelBook
来源:互联网 发布:淘宝上怎么添加旺旺 编辑:程序博客网 时间:2024/05/16 05:28
两小时一个Java小项目—TelBook
今天和大家分享一下最近两天的学习成果。
涉及到Java 通讯录源码 JDBC DAO 配置文件 工具类这些知识。
直接上代码,本人CSDN新人若有疑问可以私聊。lfw615@foxmail.com
1.工程建包范例
配置文件的创建与书写
为了方便像我一样的小白共同学习,插入下图:
123步骤完成后输入“db.properties”点击“Finish”
在新建的文件左下角选择“source”
在文件的空白处键入连接数据库所需要的必要的文本信息。
2.创建一个工程
2.1 配置文件的书写
db.properties 文件:
//加载数据库所需驱动jdbc.driver=oracle.jdbc.OracleDriver//书写URLLjdbc.url=jdbc:oracle:thin:@localhost:1521:xe//登陆数据库的用户名jdbc.user=hr//登陆用户的密码jdbc.p=sys
2.2数据库中的表 sql
为了更直接的说明问题,在这里我把本项目中用到的数据库的建表代码也附带上。
//序列create sequence person_seq; //建表create table person(id number(7) primary key,name varchar2(15) not null,mobile varchar2(11) not null unique check( length(mobile)=11 ),telphone varchar2(13) check( telphone like '___%-_______%'),email varchar2(30) unique check( email like '_%@%_' ),city varchar2(20),birthday date);
2.3实体类 Entity
首先根据数据库中的表来创建实体类。
我们可以看出有七个变量: 对其进行封装等操作。
package com.baizhi.lfw.entity;import java.util.Date;/** * * @author LiuFw * @类的描述:对象类 person对象模板 */public class Person {private int id;private String name;private String mobile;private String telphone;private String email;private String city;private java.util.Date brithday;//无参有参public Person(){}public Person(String name, String mobile, String telphone, String email, String city, Date brithday) { super(); this.name = name; this.mobile = mobile; this.telphone = telphone; this.email = email; this.city = city; this.brithday = brithday;}/*省略get set方法 注意日期类型的get set方法 */public java.util.Date getBrithday() { return brithday;}public void setBrithday(java.util.Date brithday) { this.brithday = brithday;}//toString@Overridepublic String toString() { return "Person [id=" + id + ", name=" + name + ", mobile=" + mobile + ", telphone=" + telphone + ", email=" + email + ", city=" + city + ", brithday=" + brithday + "]";}}
2.4工具类书写 Util
2.4.1作用
加载配置文件,创建Connection对象,优化代码,提高复用性。
2.4.2 工具类的书写
//导入要用到的包import java.io.*;import java.sql.*;import java.util.*;//创建工具类public class JDBCUtil {//创建一个Properties对象来向DB(date base)发送sql语句private static Properties p = new Properties();//创建线程的存放 为了保障多个类完成一个事务走的是一个线程链private static final ThreadLocal<Connection> tl = new ThreadLocal<Connection>();//静态代码块·· 加载配置文件static{//创建一个写入流 InputStream is =null; try { //加载配置文件(“配置文件路径”) is = JDBCUtil.class.getResourceAsStream("/com/baizhi/lfw/config/db.properties"); //处理配置文件(可以让配置文件跟随工具类一同进行类加载) p.load(is); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); }finally{ try { //关闭流释放资源 is.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } }}//获取 线程绑定的 connpublic static Connection getConn(){ //首先Conn对象访问线程的存放 若无则创建conn对象 Connection conn = tl.get(); if(conn == null){ try { //类加载 (加载链接数据库的驱动) Class.forName(p.getProperty("jdbc.driver")); //填充相关数据信息 conn = DriverManager.getConnection(p.getProperty("jdbc.url"),p.getProperty("jdbc.user"),p.getProperty("jdbc.pass")); //把创建好的Connection对象存在threadlocal中 tl.set(conn); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } return conn;}//释放资源 public static void close(Connection conn,Statement stmt,ResultSet rs){ if(rs != null){ try { rs.close(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } } if(stmt != null){ try { stmt.close(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } } if(conn != null){ try { conn.close(); //这里要注意:关闭conn时 同时移除线程 tl.remove(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } }}}
工具类稍微难理解一些,初步阶段做到会用,懂原理就好。
2.5DAO java执行sql语句
DAO :Data Access Object
2.5.1 作用
书写完工具类后我们就可以通过conn对象链接数据库。
接下来我们开始创建DAO
为了防止以后系统升级带来的不便,在这里建议大家使用DAO操作的时候先创建接口类,定义相应的DB中的数据表需要实现的操作,然后用实现类去实现各个方法。
2.5.2 IPersonDAO.java
package com.baizhi.lfw.dao;import java.util.List;public interface IPersonDAO { //增 public void addPerson(Person p); //删 public void deletePerson(int id); //改 public void updatePerson(Person p); //查一个 public Person selectPerson(int id); //查所有 public List<Person> selectAll(); //手机号模糊查 public List<Person> selectCell(String cell); //名字模糊查 public List<Person> selectName(String name);}
2.5.3 PersonDAO.java
package com.baizhi.lfw.dao;import java.sql.*;import java.util.*;import com.baizhi.lfw.entity.Person;import com.baizhi.lfw.util.JDBCUtil;public class PersonDAO implements IPersonDAO{ Connection conn = null; PreparedStatement pstmt = null; ResultSet rs = null;@Override// 添加联系人信息public void addPerson(Person p) { // TODO Auto-generated method stub //书写sql String sql = "insert into person values(person_seq.nextval,?,?,?,?,?,?)"; try { //获取连接 conn = JDBCUtil.getConn(); //把sql发送给DB pstmt = conn.prepareStatement(sql); //给sql中的6个问号赋值 pstmt.setString(1, p.getName()); pstmt.setString(2, p.getMobile()); pstmt.setString(3, p.getTelphone()); pstmt.setString(4, p.getEmail()); pstmt.setString(5, p.getCity()); pstmt.setDate(6, new Date(p.getBrithday().getTime())); //执行sql语句 并获得返回值 int i = pstmt.executeUpdate(); if(i != 0 ){ System.out.println("添加成功!"); } } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); }finally{ //释放资源 JDBCUtil.close(null, pstmt, rs); }}@Override// 删除联系人public void deletePerson(int id) { // TODO Auto-generated method stub String sql = "delete from person where id = ?"; try { conn = JDBCUtil.getConn(); pstmt = conn.prepareStatement(sql); pstmt.setInt(1, id); int i = pstmt.executeUpdate(); if(i != 0){ System.out.println("删除id:"+id+"成功!!"); } } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); }finally{ JDBCUtil.close(null, pstmt, rs); }}@Override// 修改联系人public void updatePerson(Person p) { // TODO Auto-generated method stub String sql = "update person set name = ?,mobile = ?, telphone = ?, email = ?, city = ?, birthday = ? where id = ?"; try { conn = JDBCUtil.getConn(); pstmt = conn.prepareStatement(sql); pstmt.setString(1, p.getName()); pstmt.setString(2, p.getMobile()); pstmt.setString(3, p.getTelphone()); pstmt.setString(4, p.getEmail()); pstmt.setString(5, p.getCity()); pstmt.setDate(6, new Date(p.getBrithday().getTime())); pstmt.setInt(7, p.getId()); System.out.println(p); int i = pstmt.executeUpdate(); if(i != 0){ System.out.println("修改成功!!"); }else{ System.out.println("修改失败!!"); } } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); }finally{ JDBCUtil.close(null, pstmt, rs); }}@Override//通过id查询一个联系人public Person selectPerson(int id) { // TODO Auto-generated method stub String sql = "select * from person where id = ?"; try { conn = JDBCUtil.getConn(); pstmt = conn.prepareStatement(sql); pstmt.setInt(1, id); rs = pstmt.executeQuery(); Person per = null; if(rs.next()){ per = new Person(); per.setId(rs.getInt(1)); per.setName(rs.getString(2)); per.setMobile(rs.getString(3)); per.setTelphone(rs.getString(4)); per.setEmail(rs.getString(5)); per.setCity(rs.getString(6)); per.setBrithday(rs.getDate(7)); } return per; } catch (Exception e) { System.out.println("查询出错!!"); // TODO Auto-generated catch block e.printStackTrace(); }finally{ JDBCUtil.close(null, pstmt, rs); } return null;}@Override//显示所有联系人@Testpublic List<Person> selectAll() { // TODO Auto-generated method stubid,name,mobile,telphone,email,city,birthday from person"; String sql = "select * from person"; List<Person> list = new ArrayList<Person>(); try { conn = JDBCUtil.getConn(); pstmt = conn.prepareStatement(sql); rs = pstmt.executeQuery(); while(rs.next()){ Person per = new Person(); per.setId(rs.getInt(1)); per.setName(rs.getString(2)); per.setMobile(rs.getString(3)); per.setTelphone(rs.getString(4)); per.setEmail(rs.getString(5)); per.setCity(rs.getString(6)); per.setBrithday(rs.getDate(7)); System.out.println("读取:"+per); list.add(per); } return list; } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); }finally{ JDBCUtil.close(null, pstmt, rs); } return null;}@Override//电话号码模糊查询联系人public List<Person> selectCell(String cell) { // TODO Auto-generated method stub String sql = "select * from person where mobile like ?"; try { conn = JDBCUtil.getConn(); pstmt = conn.prepareStatement(sql); String cells = "%"+cell+"%"; pstmt.setString(1, cells); rs = pstmt.executeQuery(); List<Person> list = new ArrayList<Person>(); while(rs.next()){ Person per = new Person(); per.setId(rs.getInt(1)); per.setName(rs.getString(2)); per.setMobile(rs.getString(3)); per.setTelphone(rs.getString(4)); per.setEmail(rs.getString(5)); per.setCity(rs.getString(6)); per.setBrithday(rs.getDate(7)); System.out.println("读取:"+per); list.add(per); } return list; } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); }finally{ JDBCUtil.close(null, pstmt, rs); } return null;}@Override//名字模糊查找联系人public List<Person> selectName(String name) { // TODO Auto-generated method stub String sql = "select * from person where name like ?"; try { conn = JDBCUtil.getConn(); pstmt = conn.prepareStatement(sql); String cells = "%"+name+"%"; pstmt.setString(1, cells); rs = pstmt.executeQuery(); List<Person> list = new ArrayList<Person>(); while(rs.next()){ Person per = new Person(); per.setId(rs.getInt(1)); per.setName(rs.getString(2)); per.setMobile(rs.getString(3)); per.setTelphone(rs.getString(4)); per.setEmail(rs.getString(5)); per.setCity(rs.getString(6)); per.setBrithday(rs.getDate(7)); System.out.println("读取:"+per); list.add(per); } return list; } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); }finally{ JDBCUtil.close(null, pstmt, rs); } return null;}}
程序写到这里,我们可以运用”@Test”方法对基本的功能进行测试。
如果不会使用”@Test”方法的战友们请翻阅我的其他文章,会有相关的介绍。
2.6 业务层 Service
写到这里我们的项目即将大功告成。
业务类是为了实现不同业务,可以同时操作多个DAO方法,完成相关的操作
2.6.1TelBookService.java
该层的类中方法实际上已经是面向用户的需求而定制的。
同DAO 我们先创建一个接口。
package com.baizhi.lfw.service;import java.util.List;import com.baizhi.lfw.entity.*;;/** * * @author LiuFw * @类的描述: 业务类 实现不同业务 可以同时操作 多个DAO方法 */public interface TelbookService {//添加联系人需要使用的业务方法public void regist(Person person) ;//修改联系人时需要调用的业务方法public void changePersonMessage(Person person);//通过Id查找联系人public Person getOnePerson(Integer id) ;//获得所有的联系人的业务方法public List<Person> getAllPersons() ;//根据联系人姓名查找联系人的业务方法public List<Person> getPersonByName(String name);//根据手机号码查询相关的联系人的业务方法public List<Person> getPersonByMobile(String mobile);//删除联系人时需要调用的业务方法public void dropPerson(Integer id);
}
2.6.2 TelBookServiceImpl.java
实现类中实现各个方法的步骤是:
1.获取conn 链接到数据库,同时也是为了保证在同一线程中
2.关闭自动提交,手动提交事务,在操作多个DAO时候若有异常可数据回滚
3.执行相应的DAO操作,即调用操作sql语句的类方法
4.提交事务
5.若有返回值,return *;
package com.baizhi.lfw.service;import java.sql.*;import java.util.*;import java.security.Provider.Service;import com.baizhi.lfw.dao.*;import com.baizhi.lfw.entity.Person;import com.baizhi.lfw.util.JDBCUtil;public class TelbookServiceImpl implements TelbookService{private static Connection conn = null;private static IPersonDAO dao = new PersonDAO();private static List<Person> list = new ArrayList<Person>();@Override//添加联系人public void regist(Person person) { try { //获取同一线程的conn conn = JDBCUtil.getConn(); //关闭自动提交 conn.setAutoCommit(false); //DAO操作 dao.addPerson(person); //提交 conn.commit(); } catch (Exception e) { // TODO Auto-generated catch block try {conn.rollback(); } catch (Exception e1) {e1.printStackTrace();} e.printStackTrace(); //结果回滚 }finally{ JDBCUtil.close(conn, null, null); }}@Override//修改联系人public void changePersonMessage(Person person) { // TODO Auto-generated method stub try { conn = JDBCUtil.getConn(); conn.setAutoCommit(false); dao.updatePerson(person); conn.commit(); } catch (Exception e) { try { conn.rollback(); } catch (SQLException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } // TODO: handle exception }finally{ JDBCUtil.close(conn, null, null); }}@Override//通过id查找public Person getOnePerson(Integer id) { // TODO Auto-generated method stub try { conn = JDBCUtil.getConn(); conn.setAutoCommit(false); //操作 Person p = dao.selectPerson(id); conn.commit(); return p; } catch (SQLException e) { // TODO Auto-generated catch block try {System.out.println("查询失败!!"); conn.rollback(); } catch (SQLException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } e.printStackTrace(); }finally{ JDBCUtil.close(conn, null, null); } return null;}@Override//获取所有的联系人的业务public List<Person> getAllPersons() { // TODO Auto-generated method stub try { conn = JDBCUtil.getConn(); conn.setAutoCommit(false); list = dao.selectAll(); for (Person p : list) { System.out.println("111111····测试:"+p); } conn.commit(); return list; } catch (Exception e) { try {conn.rollback();} catch (SQLException e1) {e1.printStackTrace(); } e.printStackTrace(); }finally{ JDBCUtil.close(conn, null, null); } return null;}@Override//通过名字 模糊查询public List<Person> getPersonByName(String name) { // TODO Auto-generated method stub try { conn = JDBCUtil.getConn(); conn.setAutoCommit(false); list = dao.selectName(name); conn.commit(); return list; } catch (Exception e) { try { conn.rollback(); } catch (SQLException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } // TODO Auto-generated catch block e.printStackTrace(); } return null;}@Override//通过手机号模糊查询public List<Person> getPersonByMobile(String mobile) { // TODO Auto-generated method stub try { conn = JDBCUtil.getConn(); conn.setAutoCommit(false); list = dao.selectCell(mobile); conn.commit(); return list; } catch (SQLException e) { try { conn.rollback(); } catch (SQLException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } // TODO Auto-generated catch block e.printStackTrace(); } return null;}@Override//通过id删除联系人public void dropPerson(Integer id) { // TODO Auto-generated method stub try { conn = JDBCUtil.getConn(); conn.setAutoCommit(false); dao.deletePerson(id); conn.commit(); } catch (SQLException e) { // TODO Auto-generated catch block try { conn.rollback(); } catch (SQLException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } e.printStackTrace(); }finally{ JDBCUtil.close(conn, null, null); } }}
2.7 测试类
在这里,为了能够简单有效的限额出整体的操作数据,使用了测试类。
测试类通过业务层来间接操作DAO方法。
package com.baizhi.lfw.test;import java.text.*;import java.util.*;import org.junit.Test;import com.baizhi.lfw.entity.Person;import com.baizhi.lfw.service.TelbookService;import com.baizhi.lfw.service.TelbookServiceImpl;class Main{public static void main(String[] args) { TelBookView t = new TelBookView(); t.showMainView();}}public class TelBookView {private Scanner sc = new Scanner(System.in);private TelbookService service = new TelbookServiceImpl();//菜单@Testpublic void showMainView(){ while(true){ System.out.println("***************欢迎访问通讯录***************"); System.out.println("1.显示所有联系人 2.按姓名查找联系人 3.按号码查找联系人"); System.out.println("4.添加联系人 5.删除联系人 6.修改联系人信息"); System.out.println("7.退出"); System.out.println("请选择操作:"); int selected = sc.nextInt(); //调用选择方法 requestDispatcher(selected); }}//选择方法public void requestDispatcher(int selected) { try { switch(selected){ case 1:{ showAllPerson(); break;} case 2:{ showPersonsByName(); break;} case 3:{ showPersonsByMobil();break;} case 4:{ addPerson(); break;} case 5:{ dropPerson(); break;} case 6:{changePersonMessage(); break;} case 7:{ System.out.println("--------------------谢谢使用,再见------------------"); System.exit(0); break; } default:{ throw new Exception("输入错误,请考虑重新选择!"); } } } catch (Exception e) { e.printStackTrace(); }}//用户选择功能1,显示所有联系人public void showAllPerson() { //调用service的查询方法,查询所有的联系人 List<Person> list=service.getAllPersons(); //调用本类的方法显示联系人信息 showPersons(list);}//只供本类其他方法是用,用表格形式显示list集合里的联系人信息private void showPersons(List<Person> list) { System.out.println("Id\tName\t Mobile \t Telphone \t Email \t City \t Birthday "); for(Person p:list){ System.out.println(p.getId()+"\t"+p.getName()+"\t"+p.getMobile()+"\t"+p.getTelphone()+"\t"+p.getEmail()+"\t"+p.getCity()+"\t"+p.getBrithday()); }}//用户选择功能2,按姓名查询联系人,允许模糊查询public void showPersonsByName() { System.out.println("请输入需要查询的联系人姓名(可以模糊查询):"); String name=sc.next(); //调用service方法查询相关数据 List<Person> list=service.getPersonByName(name); //调用本类的方法显示联系人信息 showPersons(list); }//用户选择功能3,按手机查询联系人,允许模糊查询public void showPersonsByMobil() { System.out.println("请输入需要查询的联系人手机号码(可以模糊查询):"); String mobile=sc.next(); //调用service方法查询相关数据 List<Person> list=service.getPersonByMobile(mobile); //调用本类的方法显示联系人信息 showPersons(list);}//用户选择功能4,添加联系人,允许用户名重复@Testpublic void addPerson() { Person p = null; try { System.out.println("请输入联系人姓名:"); String name=sc.next(); System.out.println("请输入联系人手机号码:"); String mobile=sc.next(); System.out.println("请输入联系人座机号码:"); String telphone=sc.next(); System.out.println("请输入联系人email:"); String email=sc.next(); System.out.println("请输入联系人地址:"); String city=sc.next(); System.out.println("请输入生日(1980-6-23):"); String date=sc.next(); System.out.println("输入的日期是:"+date); SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); java.util.Date utilDate = sdf.parse(date); p = new Person(name,mobile,telphone,email,city,utilDate); } catch (ParseException e) { // TODO Auto-generated catch block e.printStackTrace(); } //调用service的regist()方法 service.regist(p); //System.out.println("添加联系人成功!!!!");}//用户选择功能5,删除联系人,需要输入联系人的idpublic void dropPerson() { System.out.println("请输入需要删除的联系人的id:"); int id=sc.nextInt(); //调用service的方法删除联系人 service.dropPerson(id); System.out.println("-----------删除成功----------");}//用户选择功能6//首先需要用户输入被修改用户的id,将该用户信息显示在屏幕上.//目前修改联系人只能全表修改,必须给定除id以外的所有值public void changePersonMessage() { System.out.println("请输入需要修改的联系人的编号(id): "); int id=sc.nextInt(); //调用service的根据id查询联系人方法,获得联系人具体信息并且显示 Person p=service.getOnePerson(id); try { System.out.println("您要修改的联系人具体信息如下:"); System.out.println("Id\tName\t Mobile \t Telphone \t Email \t City \t Birthday "); System.out.println(p.getId()+"\t"+p.getName()+"\t"+p.getMobile()+"\t"+p.getTelphone()+"\t"+p.getEmail()+"\t"+p.getCity()+"\t"+p.getBrithday()); //用户输入修改信息 System.out.println("请输入联系人姓名:"); String name=sc.next(); System.out.println("请输入联系人手机号码:"); String mobile=sc.next(); System.out.println("请输入联系人座机号码:"); String telphone=sc.next(); System.out.println("请输入联系人email:"); String email=sc.next(); System.out.println("请输入联系人地址:"); String city=sc.next(); System.out.println("请输入生日(1980-6-23):"); String date=sc.next(); SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); java.util.Date utilDate; utilDate = sdf.parse(date); Person per = new Person(); per = new Person(name,mobile,telphone,email,city,utilDate); per.setId(id); //调用service里的修改联系人的方法 service.changePersonMessage(per); } catch (ParseException e) { // TODO Auto-generated catch block e.printStackTrace(); }}}
在书写完业务类之后我们一定要仔细品味类与类之间的关系。
今天的分享到此为止,如有意见或者建议欢迎大家给我提出。谢谢
- 两小时一个Java小项目---TelBook
- servlet两小时项目
- remind 一个问号两小时 :)
- 一个java的小项目
- 两小时做好项目沟通计划
- JAVA两小时快速入门:基础
- JAVA两小时快速入门:基础
- 一个小错误,消耗4小时
- 一个小错误,消耗4小时
- 两小时
- telbook雏形
- Java一个小应用项目打包心得
- 一个java web的ssh小项目
- Java获取一个小时前的时间
- 使用OC和Swift两种语言写一个发射烟花的小项目
- 一个小项目
- 一个H5小项目
- 一个小项目
- 【安卓学习笔记】JAVA基础Lesson8-函数的复写与super用法
- django rest framework使用django-filter
- 图解电容充放电
- 当前时代信息收集技巧初步总结
- 移动端 滑屏
- 两小时一个Java小项目---TelBook
- 仿真软件Udacity Self-Driving Car Simulator
- 和为S的两个数字
- 欢迎使用CSDN-markdown编辑器
- Memcached缓存服务器安装部署
- 网易校招第7题
- error:chrome控制台警告:Synchronous XMLHttpRequest on the main thread...
- QWidget类
- storm教程(一):storm基本概念和集群架构