JDBC基于MVC架构项目实例-实现对MySQL数据表的增删改查、调用数据表中的存储过程和函数
2016-10-06 21:48
1456 查看
江畔何人初见月,江月何年初照人?—张若虚《春江花月夜》
工具: MySQL 数据库,Eclipse,Navicat for MySQL数据库管理工具
设计模式:
MVC 三层架构
模型层 对应数据库的映射,对数据库映射的抽象方法(增删改查)
控制层 控制数据的流通,把数据拼装给视图层
视图层 数据的显示
从下往上依次开发
代码分离,分工协作
JDBC-MySQL驱动下载
JDK版本:
项目目录:
数据库名: peng
表名:imooc_goddess
执行结果:
所属包:
当前项目结构:
所属包:
所属包:
当前项目结构:
所属包:
所属包:
当前的项目结构:
在数据库上可以通过
在数据库端测试存储过程
2、存储过程
3、存储过程
在 Navicat 查询里调用
在 java 项目上调用
2、自定义函数
所属包:
当前项目结构:
项目源码(增加调用存储过程和函数)下载地址:http://download.csdn.net/detail/peng_hong_fu/9646696
一 需求分析
目的:实现 Java 程序对 MySQL 数据库的增删改查操作,……。工具: MySQL 数据库,Eclipse,Navicat for MySQL数据库管理工具
设计模式:
MVC 三层架构
模型层 对应数据库的映射,对数据库映射的抽象方法(增删改查)
控制层 控制数据的流通,把数据拼装给视图层
视图层 数据的显示
从下往上依次开发
代码分离,分工协作
二 编写 Java Project
新建项目jdbc,在新建目录
lib下存放驱动
mysql-connector-java-5.1.39-bin.jar,添加为
Build Path。
JDBC-MySQL驱动下载
JDK版本:
1.8.0_91
项目目录:
三 建立数据库层 (db层)
建立数据库的语句:数据库名: peng
表名:imooc_goddess
/* Navicat MySQL Data Transfer Source Server : localhost_3306 Source Server Version : 50712 Source Host : localhost:3306 Source Database : peng Target Server Type : MYSQL Target Server Version : 50712 File Encoding : 65001 Date: 2016-10-04 20:53:44 */ SET FOREIGN_KEY_CHECKS=0; -- ---------------------------- -- Table structure for imooc_goddess -- ---------------------------- DROP TABLE IF EXISTS `imooc_goddess`; CREATE TABLE `imooc_goddess` ( `id` int(11) NOT NULL AUTO_INCREMENT, `user_name` varchar(30) NOT NULL, `sex` int(11) DEFAULT NULL, `age` int(11) DEFAULT NULL, `birthday` date DEFAULT NULL, `email` varchar(30) DEFAULT NULL, `mobile` varchar(11) DEFAULT NULL, `create_user` varchar(30) DEFAULT NULL, `create_date` date DEFAULT NULL, `update_user` varchar(30) DEFAULT NULL, `update_date` date DEFAULT NULL, `isdel` int(11) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=15 DEFAULT CHARSET=utf8; -- ---------------------------- -- Records of imooc_goddess -- ---------------------------- INSERT INTO `imooc_goddess` VALUES ('2', '小彭', null, '23', null, null, null, null, null, null, null, null); INSERT INTO `imooc_goddess` VALUES ('6', '胖子', '0', '78', '2016-10-03', 'hongming@qq.com', '1211555599', 'admin', '2016-10-03', 'admin', '2016-10-03', '1'); INSERT INTO `imooc_goddess` VALUES ('7', '小溪', '0', '34', '2016-10-03', 'hongming@qq.com', '1211555599', 'admin', '2016-10-03', 'admin', '2016-10-03', '1'); INSERT INTO `imooc_goddess` VALUES ('9', '小霞', null, '23', '1990-09-09', 'xiaoxia@qq.com', '232445455', null, '2016-10-03', null, '2016-10-03', null); INSERT INTO `imooc_goddess` VALUES ('10', 'hh', '1', '23', '1990-09-09', 'jkjfskf', '12323', 'Admin', '2016-10-03', 'admin', '2016-10-03', '1'); INSERT INTO `imooc_goddess` VALUES ('11', '平', '1', '23', '2998-04-09', 'jjjj@ww.com', '1323', 'admin', '2016-10-03', 'admin', '2016-10-03', '1'); INSERT INTO `imooc_goddess` VALUES ('12', '航母', '1', '23', '2333-09-09', 'jkksjkjf', '1232', 'admin', '2016-10-03', 'admin', '2016-10-03', '1'); INSERT INTO `imooc_goddess` VALUES ('13', '胖纸', '1', '23', '1991-09-09', 'jjijijij', '1323244', 'admin', '2016-10-03', 'admin', '2016-10-03', '1'); INSERT INTO `imooc_goddess` VALUES ('14', '校长', '1', '18', '1998-09-09', 'jkjijij@qq.com', '112323424', 'admin', '2016-10-03', 'admin', '2016-10-03', '1');
测试数据库连接
所属包:package com.jxust.test
TestDBUtil.java
//package com.jxust.test; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; public class TestDBUtil { private static final String URL = "jdbc:mysql://127.0.0.1:3306/peng?characterEncoding=utf8&useSSL=false"; private static final String USER = "root"; private static final String PASSWORD = "root"; private static Connection conn = null; public static void main(String[] args) throws Exception { // 1.加载驱动程序 Class.forName("com.mysql.jdbc.Driver"); // 2.获得数据库连接 conn = DriverManager.getConnection(URL, USER, PASSWORD); // 3.通过数据库的连接操作数据库,实现增删改查 /** * Statement方法 普通的不带参的查询SQL 每次执行sql语句,数据库都要执行sql语句的编译 * 最好用于仅执行一次查询并返回结果的情形 Statement stmt = conn.createStatement(); * ResultSet rs = stmt.executeQuery("select user_name,age from * imooc_goddess"); */ /** * PreparedStatement 方法 可变参数的SQL,编译一次,执行多次,效率高 */ // 取user_name和age数据 PreparedStatement ptmt = conn.prepareStatement("select user_name,age from imooc_goddess"); ResultSet rs = ptmt.executeQuery(); while (rs.next()) { System.out.println(rs.getString("user_name") + "," + rs.getString("age")); } } }
执行结果:
胖子,78 小溪,34 hh,24 平,32 航母,24 胖纸,26 小那,null 晓华,null
我的数据库连接类-DBUtil
调用getConn方法就可以的到数据库连接对象
conn。
所属包:
package com.jxust.db
DBUtil.java
//package com.jxust.db; import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; public class DBUtil { private static final String URL = "jdbc:mysql://127.0.0.1:3306/peng?characterEncoding=utf8&useSSL=false"; private static final String USER = "root"; private static final String PASSWORD = "root"; private static Connection conn = null; static {// 加载类时会执行这些静态的代码块 try { // 1.加载驱动程序 Class.forName("com.mysql.jdbc.Driver"); // 2.获得数据库连接 conn = DriverManager.getConnection(URL, USER, PASSWORD); } catch (ClassNotFoundException e) { e.printStackTrace(); } catch (SQLException e) { e.printStackTrace(); } } public static Connection getConn() { return conn; } }
当前项目结构:
四 建立模型层 (model层)
创建数据库表对应实体类 Goddess 。所属包:
package com.jxust.model
Goddess.java
//package com.jxust.model; import java.util.Date; public class Goddess { private Integer id; private String user_name; private Integer sex; private Integer age; private Date birthday; private String email; private String mobile; private String create_user; private String update_user; private Date create_date; private Date update_date; private Integer isdel; public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getUser_name() { return user_name; } public void setUser_name(String user_name) { this.user_name = user_name; } public Integer getSex() { return sex; } public void setSex(Integer sex) { this.sex = sex; } public Integer getAge() { return age; } public void setAge(Integer age) { this.age = age; } public Date getBirthday() { return birthday; } public void setBirthday(Date birthday) { this.birthday = birthday; } public String getEmail() { return email; } public void setEmail(String email) { this.email = email; } public String getMobile() { return mobile; } public void setMobile(String mobile) { this.mobile = mobile; } public String getCreate_user() { return create_user; } public void setCreate_user(String create_user) { this.create_user = create_user; } public String getUpdate_user() { return update_user; } public void setUpdate_user(String update_user) { this.update_user = update_user; } public Date getCreate_date() { return create_date; } public void setCreate_date(Date create_date) { this.create_date = create_date; } public Date getUpdate_date() { return update_date; } public void setUpdate_date(Date update_date) { this.update_date = update_date; } public Integer getIsdel() { return isdel; } public void setIsdel(Integer isdel) { this.isdel = isdel; } @Override public String toString() { return "Goddess [id=" + id + ", user_name=" + user_name + ", sex=" + sex + ", age=" + age + ", birthday=" + birthday + ", email=" + email + ", mobile=" + mobile + ", create_user=" + create_user + ", update_user=" + update_user + ", create_date=" + create_date + ", update_date=" + update_date + ", isdel=" + isdel + "]"; } }
五 建立数据库访问层 (dao层)
对应数据库增删改查的方法,用来访问数据库实现数据的持久化。所属包:
package com.jxust.dao
GoddessDao.java
//package com.jxust.dao; import java.sql.Connection; import java.sql.Date; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.List; import java.util.Map; //import com.jxust.db.DBUtil; //import com.jxust.model.Goddess; /** * 类中含有4个查询方法,增删改方法各一个 * @author Peng * */ public class GoddessDao { /** * 增 * 向数据库添加数据 * * @param g * @throws SQLException */ public void addGoddess(Goddess g) throws SQLException { Connection conn = DBUtil.getConn(); String sql = "" + "insert into imooc_goddess" + "(user_name,sex,age,birthday,email,mobile," + "create_user,create_date,update_user,update_date,isdel)" + "values(?,1,?,?,?,?,'admin',current_date(),'admin',current_date(),1)"; PreparedStatement ptmt = conn.prepareStatement(sql); ptmt.setString(1, g.getUser_name()); // ptmt.setInt(2, g.getSex()); ptmt.setInt(2, g.getAge()); ptmt.setDate(3, new Date(g.getBirthday().getTime())); ptmt.setString(4, g.getEmail()); ptmt.setString(5, g.getMobile()); // ptmt.setString(7, g.getCreate_user()); // ptmt.setString(8, g.getUpdate_user()); // ptmt.setInt(9, g.getIsdel()); ptmt.execute(); } /** * 改 * 通过拼接SQL更新语句,更新数据库中的数据 * * @param g * @throws SQLException * @throws ParseException */ public void updateGoddess(Goddess g) throws SQLException, ParseException { Connection conn = DBUtil.getConn(); StringBuilder sb = new StringBuilder(); System.out.println(g.toString()); sb.append("update imooc_goddess set sex = 1 "); if (!g.getUser_name().equals("null")) { sb.append(" ,user_name=" + "'" + g.getUser_name() + "'"); } if (!g.getAge().equals(0)) { sb.append(" ,age=" + g.getAge()); } SimpleDateFormat sf = new SimpleDateFormat("yy-MM-dd"); String DateStr1 = "1970-01-01"; java.util.Date date = null; date = (java.util.Date) sf.parse(DateStr1); if (!((new Date(g.getBirthday().getTime()).compareTo(date)) == 0)) { sb.append(" ,birthday=" + "'" + (new Date(g.getBirthday().getTime()) + "'")); } if (!g.getEmail().equals("null")) { sb.append(" ,email=" + "'" + g.getEmail() + "'"); } if (!g.getMobile().equals("null")) { sb.append(" ,mobile=" + "'" + g.getMobile() + "'"); } if (!g.getId().equals("null")) { sb.append(" where id=" + g.getId()); } // System.out.println(sb.toString()); PreparedStatement ptmt = conn.prepareStatement(sb.toString()); ptmt.execute(); } /** * 删 * 根据id删除数据库的内容 * * @param id * @throws SQLException */ public void delGoddess(Integer id) throws SQLException { Connection conn = DBUtil.getConn(); String sql = "delete from imooc_goddess " + " where id =? "; PreparedStatement ptmt = conn.prepareStatement(sql); ptmt.setInt(1, id); ptmt.execute(); } /** * 查 * 查询数据表中所有内容的id,user_name,age字段 * @return * @throws SQLException */ public List<Goddess> query() throws SQLException { Connection conn = DBUtil.getConn(); List<Goddess> list = new ArrayList<Goddess>(); Statement stmt = conn.createStatement(); ResultSet rs = stmt.executeQuery("select id,user_name,age from imooc_goddess"); Goddess g = null; while (rs.next()) { g = new Goddess(); g.setId(rs.getInt("id")); g.setUser_name(rs.getString("user_name")); g.setAge(rs.getInt("age")); list.add(g); } return list; } /** * 查 * 多条件查询,输入name,mobile,email,3个值,配合通配符查询 * @param name * @param mobile * @param email * @return * @throws SQLException */ public List<Goddess> query(String name, String mobile, String email) throws SQLException { Connection conn = DBUtil.getConn(); List<Goddess> list = new ArrayList<Goddess>(); StringBuilder sb = new StringBuilder(); sb.append("select * from imooc_goddess "); sb.append(" where user_name like ? or mobile like ? or email like ?"); //or 和 and的配合使用 //sb.append(" where user_name like ? and (mobile like ? or email like ?)"); PreparedStatement ptmt = conn.prepareStatement(sb.toString()); ptmt.setString(1, "%" + name + "%");// 通配符 ptmt.setString(2, "%" + mobile + "%"); ptmt.setString(3, "%" + email + "%"); ResultSet rs = ptmt.executeQuery(); Goddess g = null; while (rs.next()) { g = new Goddess(); g.setId(rs.getInt("id")); g.setUser_name(rs.getString("user_name")); g.setAge(rs.getInt("age")); g.setSex(rs.getInt("sex")); g.setBirthday(rs.getDate("birthday")); g.setEmail(rs.getString("email")); g.setMobile(rs.getString("mobile")); g.setCreate_date(rs.getDate("create_date")); g.setCreate_user(rs.getString("create_user")); g.setUpdate_date(rs.getDate("update_date")); g.setUpdate_user(rs.getString("update_user")); list.add(g); } return list; } /** * 查 根据id值,查询所有信息 * * @param id * @return * @throws SQLException */ public Goddess get(Integer id) throws SQLException { Goddess g = null; Connection conn = DBUtil.getConn(); String sql = " select * from imooc_goddess " + " where id =? "; PreparedStatement ptmt = conn.prepareStatement(sql); ptmt.setInt(1, id); ResultSet rs = ptmt.executeQuery(); while (rs.next()) { g = new Goddess(); g.setId(rs.getInt("id")); g.setUser_name(rs.getString("user_name")); g.setAge(rs.getInt("age")); g.setSex(rs.getInt("sex")); g.setBirthday(rs.getDate("birthday")); g.setEmail(rs.getString("email")); g.setMobile(rs.getString("mobile")); g.setCreate_date(rs.getDate("create_date")); g.setCreate_user(rs.getString("create_user")); g.setUpdate_date(rs.getDate("update_date")); g.setUpdate_user(rs.getString("update_user")); } return g; } /** * 查 通过拼接SQL查询语句,结合通配符,实条件查询 * * @param params * @return * @throws SQLException */ public List<Goddess> query(List<Map<String, Object>> params) throws SQLException { List<Goddess> list = new ArrayList<Goddess>(); Connection conn = DBUtil.getConn(); StringBuilder sb = new StringBuilder(); sb.append("select * from imooc_goddess where 1=1 "); if (params != null && params.size() > 0) { for (int i = 0; i < params.size(); i++) { Map<String, Object> map = params.get(i); sb.append(" and " + map.get("name") + " " + map.get("rela") + " " + map.get("value") + " "); } } // System.out.println(sb.toString()); PreparedStatement ptmt = conn.prepareStatement(sb.toString()); ResultSet rs = ptmt.executeQuery(); Goddess g = null; while (rs.next()) { g = new Goddess(); g.setId(rs.getInt("id")); g.setUser_name(rs.getString("user_name")); g.setAge(rs.getInt("age")); g.setSex(rs.getInt("sex")); g.setBirthday(rs.getDate("birthday")); g.setEmail(rs.getString("email")); g.setMobile(rs.getString("mobile")); g.setCreate_date(rs.getDate("create_date")); g.setCreate_user(rs.getString("create_user")); g.setUpdate_date(rs.getDate("update_date")); g.setUpdate_user(rs.getString("update_user")); list.add(g); } return list; } }
当前项目结构:
测试 dao 层代码
为 view 层调用,先行测试所属包:
package com.jxust.test
TestDao.java
//package com.jxust.test; import java.sql.SQLException; import java.util.ArrayList; import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Map; //import com.jxust.dao.GoddessDao; //import com.jxust.model.Goddess; public class TestDao { public static void main(String[] args) throws SQLException { GoddessDao gd = new GoddessDao(); // List<Goddess> list = gd.query("胖子","3","h"); // for(int i=0;i<list.size();i++){ // // System.out.println(i+" "+ list.get(i).toString()); // } List<Map<String, Object>> params = new ArrayList<Map<String, Object>>(); Map<String, Object> param = new HashMap<String, Object>(); param.put("name", "user_name"); param.put("rela", "like"); param.put("value", "'%胖子%'"); params.add(param); param = new HashMap<String, Object>(); param.put("name", "mobile"); param.put("rela", "="); param.put("value", "'1211555599'"); params.add(param); List<Goddess> list = gd.query(params); for (int i = 0; i < list.size(); i++) { System.out.println(list.get(i).toString()); } Goddess g = new Goddess(); g.setUser_name("小溪"); g.setAge(34); g.setSex(0); g.setBirthday(new Date()); g.setEmail("hongming@qq.com"); g.setMobile("1211555599"); g.setCreate_user("admin"); g.setUpdate_user("admin"); g.setIsdel(1); // g.setId(5); // Goddess g2 = gd.get(6); // System.out.println(g2.toString()); // gd.delGoddess(5); // gd.updateGoddess(g); // gd.addGoddess(g); } }
六 建立控制层 (action层)
Action是一个控制器所属包:
package com.jxust.action
GoddessAction.java
//package com.jxust.action; import java.sql.SQLException; import java.text.ParseException; import java.util.List; import java.util.Map; //import com.jxust.dao.GoddessDao; //import com.jxust.model.Goddess; /** * 控制器层 调用dao层的增删改查方法 * @author Peng * */ public class GoddessAction { /** * 增 * @param goddess * @throws SQLException */ public void add(Goddess goddess) throws SQLException { GoddessDao dao = new GoddessDao(); dao.addGoddess(goddess); } /** * 更 * @param g * @throws SQLException * @throws ParseException */ public void edit(Goddess g) throws SQLException, ParseException { GoddessDao dao = new GoddessDao(); dao.updateGoddess(g); } /** * 删 * @param id * @throws SQLException */ public void del(Integer id) throws SQLException { GoddessDao dao = new GoddessDao(); dao.delGoddess(id); } /** * 查 * @param id * @return * @throws SQLException */ public Goddess get(Integer id) throws SQLException { GoddessDao dao = new GoddessDao(); return dao.get(id); } /** * 查 * @return * @throws SQLException */ public List<Goddess> query() throws SQLException { GoddessDao dao = new GoddessDao(); return dao.query(); } /** * 查 * @param params * @return * @throws SQLException */ public List<Goddess> query(List<Map<String, Object>> params) throws SQLException { GoddessDao dao = new GoddessDao(); return dao.query(params); } }
测试 action 层代码
所属包:package com.jxust.test
TestAction.java
//package com.jxust.test; import java.sql.SQLException; import java.util.ArrayList; import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Map; //import com.jxust.action.GoddessAction; //import com.jxust.model.Goddess; public class TestAction { public static void main(String[] args) throws SQLException { GoddessAction action = new GoddessAction(); Goddess g = new Goddess(); g.setUser_name("小青1"); g.setAge(34); g.setSex(0); g.setBirthday(new Date()); g.setEmail("xiaoqing@qq.com"); g.setMobile("1101141146"); g.setCreate_user("admin"); g.setUpdate_user("admin"); g.setIsdel(1); g.setId(8); //action.add(g); //action.edit(g); //action.del(8); List<Map<String,Object>> params = new ArrayList<>(); Map<String,Object> map = new HashMap<>(); map.put("name", "user_name"); map.put("rela", "="); map.put("value", "'小溪'"); params.add(map); List<Goddess> result = action.query(params); for (int i=0;i<result.size();i++){ System.out.println(result.get(i).getId()+":"+result.get(i).getUser_name()); } } }
七 建立视图层 (view层)
所属包:package com.jxust.view
View.java
//package com.jxust.view; import java.sql.SQLException; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Scanner; //import com.jxust.action.GoddessAction; //import com.jxust.model.Goddess; /** * 视图层 * 与用户进行交互的页面,这里使用控制台,没有使用jsp页面 * 页面功能还不完善 * @author Peng * */ public class View { private static final String CONTEXT="欢迎来到女神禁区:\n" + "下面是女神禁区的功能列表:\n" + "[MAIN/M]:主菜单\n" + "[QUERY/Q]:查看全部女神的信息\n" + "[GET/G]:查看某位女神的详细信息\n" + "[ADD/A]:添加女神信息\n" + "[UPDATE/U]:更新女神信息\n" + "[DELETE/D]:删除女神信息\n" + "[SEARCH/S]:查询女神信息(根据姓名、手机号来查询)\n" + "[EXIT/E]:退出女神禁区\n" + "[BREAK/B]:退出当前功能,返回主菜单"; private static final String OPERATION_MAIN = "MAIN"; private static final String OPERATION_QUERY = "QUERY"; private static final String OPERATION_GET = "GET"; private static final String OPERATION_ADD = "ADD"; private static final String OPERATION_UPDATE = "UPDATE"; private static final String OPERATION_DELETE = "DELETE"; private static final String OPERATION_SEARCH = "SEARCH"; private static final String OPERATION_EXIT = "EXIT"; private static final String OPERATION_BREAK = "BREAK"; public static void main(String[] args) { System.out.println(CONTEXT); // 怎么保持一个程序一直运行 Scanner scanner = new Scanner(System.in); Goddess goddess = new Goddess(); GoddessAction action = new GoddessAction(); String previous = null; Integer step = 1; String cha = null; while (scanner.hasNext()) { String in = scanner.next().toString(); if (OPERATION_EXIT.equals(in.toUpperCase())// 大写 || OPERATION_EXIT.substring(0, 1).equals(in.toUpperCase())) {// 输入e System.out.println("您已成功退出女神禁区"); break; }else if (OPERATION_BREAK.equals(in.toUpperCase()) || OPERATION_BREAK.substring(0, 1).equals(in.toUpperCase())) { System.out.println(CONTEXT); previous = null; step = 1; cha = null; continue; }else if (OPERATION_QUERY.equals(in.toUpperCase()) || OPERATION_QUERY.substring(0, 1).equals(in.toUpperCase())) { System.out.println("下面是本禁区女神的基本信息"); try { List<Goddess> list = action.query(); for (Goddess go : list) { System.out.println("编号:" + go.getId() + ",姓名:" + go.getUser_name()); } } catch (SQLException e) { e.printStackTrace(); } continue; } else if (OPERATION_MAIN.equals(in.toUpperCase()) || OPERATION_MAIN.substring(0, 1).equals(in.toUpperCase())) { System.out.println(CONTEXT); continue; } else if (OPERATION_DELETE.equals(in.toUpperCase()) || OPERATION_DELETE.substring(0, 1).equals(in.toUpperCase()) || OPERATION_DELETE.equals(previous)) { previous = OPERATION_DELETE; if (1 == step) { System.out.println("请输入待删除女神的编号"); step++; } else if (2 == step) { step = 1; try { action.del(Integer.parseInt(in)); System.out.println("删除女神成功"); } catch (NumberFormatException e) { e.printStackTrace(); } catch (SQLException e) { e.printStackTrace(); } } continue; } else if (OPERATION_GET.equals(in.toUpperCase()) || OPERATION_GET.substring(0, 1).equals(in.toUpperCase()) || OPERATION_GET.equals(previous)) { previous = OPERATION_GET; if (1 == step) { System.out.println("请输入女神的编号,查看某位女神的详细信息"); step++; } else if (2 == step) { try { step = 1; Goddess go = action.get(Integer.parseInt(in)); System.out.println("编号:" + go.getId()); System.out.println("姓名:" + go.getUser_name()); System.out.println("年龄:" + go.getAge()); System.out.println("性别:" + "女"); System.out.println("生日:" + go.getBirthday()); System.out.println("邮箱:" + go.getEmail()); System.out.println("手机号:" + go.getMobile()); } catch (Exception e) { System.out.println("没有找到这位女神的信息"); } } continue; } else if (OPERATION_SEARCH.equals(in.toUpperCase()) || OPERATION_SEARCH.substring(0, 1).equals(in.toUpperCase()) || OPERATION_SEARCH.equals(previous) || "NAME".equals(cha) || "MOBILE".equals(cha)) { previous = OPERATION_SEARCH; if (1 == step) { System.out.println("输入要查询的字段" + "\n姓名[NAME]" + "\n手机号[MOBILE]"); step++; } else if (2 == step) { if ("NAME".equals(in.toUpperCase())) { cha = "NAME"; System.out.println("请输入要查询的姓名:"); } else if ("MOBILE".equals(in.toUpperCase())) { cha = "MOBILE"; System.out.println("请输入要查询的手机号:"); } else { step = 1; continue; } step++; } else if (3 == step) { if ("NAME".equals(cha)) { List<Map<String, Object>> params = new ArrayList<Map<String, Object>>(); Map<String, Object> param = new HashMap<String, Object>(); param.put("name", "user_name"); param.put("rela", "like"); param.put("value", "'%" + in + "%'"); params.add(param); List<Goddess> list; try { list = action.query(params); for (int i = 0; i < list.size(); i++) { System.out.println("编号:" + list.get(i).getId()); System.out.println("姓名:" + list.get(i).getUser_name()); System.out.println("年龄:" + list.get(i).getAge()); System.out.println("性别:" + "女"); System.out.println("生日:" + list.get(i).getBirthday()); System.out.println("邮箱:" + list.get(i).getEmail()); System.out.println("手机号:" + list.get(i).getMobile()); System.out.println(); } } catch (SQLException e) { e.printStackTrace(); } step = 1; continue; } else if ("MOBILE".equals(cha)) { List<Map<String, Object>> params = new ArrayList<Map<String, Object>>(); Map<String, Object> param = new HashMap<String, Object>(); param.put("name", "mobile"); param.put("rela", "like"); param.put("value", "'%" + in + "%'"); params.add(param); List<Goddess> list; try { list = action.query(params); for (int i = 0; i < list.size(); i++) { System.out.println("编号:" + list.get(i).getId()); System.out.println("姓名:" + list.get(i).getUser_name()); System.out.println("年龄:" + list.get(i).getAge()); System.out.println("性别:" + "女"); System.out.println("生日:" + list.get(i).getBirthday()); System.out.println("邮箱:" + list.get(i).getEmail()); System.out.println("手机号:" + list.get(i).getMobile()); System.out.println(); } } catch (SQLException e) { e.printStackTrace(); } step = 1; continue; } } } else if (OPERATION_ADD.equals(in.toUpperCase()) || OPERATION_ADD.substring(0, 1).equals(in.toUpperCase()) || OPERATION_ADD.equals(previous)) { previous = OPERATION_ADD; // 新增女神 if (1 == step) { System.out.println("请输入女神的[姓名]"); step++; } else if (2 == step) { goddess.setUser_name(in); System.out.println("请输入女神的[年龄]"); step++; } else if (3 == step) { goddess.setAge(Integer.valueOf(in)); System.out.println("请输入女神的[生日],格式如:yy-MM-dd"); step++; } else if (4 == step) { SimpleDateFormat sf = new SimpleDateFormat("yy-MM-dd"); Date birthday = null; try { birthday = sf.parse(in); goddess.setBirthday(birthday); System.out.println("请输入女神的[邮箱]"); } catch (ParseException e) { System.out.println("您输入的格式有误,请重新输入"); step = 3; } step++; } else if (5 == step) { goddess.setEmail(in); System.out.println("请输入女神的[手机号]"); step++; } else if (6 == step) { goddess.setMobile(in); try { action.add(goddess); System.out.println("新增女神成功!"); } catch (SQLException e) { System.out.println("新增女神失败!"); } previous=null; step=1; continue; } } else if (OPERATION_UPDATE.equals(in.toUpperCase()) || OPERATION_UPDATE.substring(0, 1).equals(in.toUpperCase()) || OPERATION_UPDATE.equals(previous)) { previous = OPERATION_UPDATE; // 更新女神 if (1 == step) { System.out.println("请输入女神的编号"); step++; }else if (2 == step) { goddess.setId(Integer.parseInt(in)); System.out.println("请输入女神的[姓名],不更改输入null"); step++; } else if (3 == step) { goddess.setUser_name(in); System.out.println("请输入女神的[年龄],不更改输入0"); step++; } else if (4 == step) { goddess.setAge(Integer.parseInt(in)); System.out.println("请输入女神的[生日],格式如:yy-MM-dd,不更改请输入1970-01-01"); step++; } else if (5 == step) { SimpleDateFormat sf = new SimpleDateFormat("yy-MM-dd"); Date birthday = null; try { birthday = sf.parse(in); goddess.setBirthday(birthday); System.out.println("请输入女神的[邮箱],不更改输入null"); } catch (ParseException e) { System.out.println("您输入的格式有误,请重新输入"); step = 3; } step++; } else if (6 == step) { goddess.setEmail(in); System.out.println("请输入女神的[手机号],不更改输入null"); step++; } else if (7 == step) { goddess.setMobile(in); try { action.edit(goddess); System.out.println("更新女神成功!"); } catch (SQLException | ParseException e) { System.out.println("更新女神失败!"); e.printStackTrace(); } previous=null; step=1; continue; } }else { System.out.println("您输入的值为" + in); } } } }
当前的项目结构:
在数据库上可以通过
call
八 调用数据库上的存储过程和自定义函数
关于向数据库中添加存储过程和自定义函数:http://blog.csdn.net/Peng_Hong_fu/article/details/52737402数据库上的存储过程
1、存储过程selectAll
CREATE PROCEDURE selectAll() BEGIN SELECT * FROM imooc_goddess; END
在数据库端测试存储过程
callselectAll();
2、存储过程
select_filter()
CREATE PROCEDURE `select_filter`(IN `sp_name` varchar(20)) READS SQL DATA BEGIN IF sp_name IS NULL OR sp_name = '' THEN SELECT * FROM imooc_goddess; ELSE IF LENGTH(sp_name)>9 AND SUBSTRING(sp_name,1,1) THEN SELECT * FROM imooc_goddess WHERE mobile=sp_name; ELSE SELECT * FROM imooc_goddess WHERE user_name LIKE CONCAT('%',sp_name,'%'); END if; END IF; END
3、存储过程
select_count()
CREATE PROCEDURE `select_count`(OUT `counts` int) BEGIN SELECT count(*) INTO counts FROM imooc_goddess; END
数据库上的自定义函数
1、自定义函数returnDate()
CREATE DEFINER=`root`@`localhost` FUNCTION `returnDate`() RETURNS varchar(30) CHARSET utf8 RETURN DATE_FORMAT(NOW(),'%Y年%m月%d日:%H时:%i分:%s秒')
在 Navicat 查询里调用
select returnDate();
在 java 项目上调用
CallableStatement cs = conn.prepareCall("{?= callreturnDate()}");
2、自定义函数
returnFloat()
CREATE DEFINER=`root`@`localhost` FUNCTION `returnFloat`(num1 SMALLINT UNSIGNED,num2 SMALLINT UNSIGNED) RETURNS float(10,2) unsigned RETURN (num1+num2)/2
Java 项目上调用
所属包:package com.jxust.dao
ProcedureDao.java
//package com.jxust.dao;
import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Types;
import java.util.ArrayList;
import java.util.List;
//import com.jxust.db.DBUtil;
//import com.jxust.model.Goddess;
public class ProcedureDao {
/**
* 带输出参数的存储过程
*
* @return
* @throws SQLException
*/
public static Integer select_count() throws SQLException {
Integer count;
// 获取连接
Connection conn = DBUtil.getConn();
// 获取CallableStatement
CallableStatement cs = conn.prepareCall("callselect_count(?)");
cs.registerOutParameter(1, Types.INTEGER);
cs.execute();
count = cs.getInt(1);
return count;
}
/**
* 带输入参数的存储过程
*
* @param sp_name
* @return
* @throws SQLException
*/
public static List<Goddess> select_filter(String sp_name) throws SQLException {
List<Goddess> list = new ArrayList<Goddess>();
// 获取连接
Connection conn = DBUtil.getConn();
// 获取CallableStatement
CallableStatement cs = conn.prepareCall("callselect_filter(?)");
cs.setString(1, sp_name);
// 执行存储过程
cs.execute();
ResultSet rs = cs.getResultSet();
Goddess g = null;
while (rs.next()) {
g = new Goddess();
g.setId(rs.getInt("id"));
g.setUser_name(rs.getString("user_name"));
g.setAge(rs.getInt("age"));
g.setMobile(rs.getString("mobile"));
list.add(g);
}
return list;
}
/**
* 带无参数的存储过程
*
* @throws SQLException
*/
public static void selectAll() throws SQLException {
// 1.获取连接
Connection conn = DBUtil.getConn();
// 2.获取CallableStatement
CallableStatement cs = conn.prepareCall("callselectAll()");
// 3.执行存储过程
cs.execute();
// 处理返回的结果:结果集,出参
ResultSet rs = cs.getResultSet();
while (rs.next()) {
System.out.println(rs.getString("user_name") + " " + rs.getString("email") + " " + rs.getString("mobile"));
}
}
/**
* 不带参数的函数
*
* @throws SQLException
*/
public static void returnDate() throws SQLException {
// 1.获取连接
Connection conn = DBUtil.getConn();
// 2.获取CallableStatement
CallableStatement cs = conn.prepareCall("{?= callreturnDate()}");
cs.registerOutParameter(1, Types.VARCHAR);
// or cs.registerOutParameter(1, Types.TIMESTAMP);
// 3.执行存储过程
cs.execute();
String date = cs.getString(1);
System.out.println("时间:" + date);
}
/**
* 带参数的函数
*
* @param num1
* @param num2
* @throws SQLException
*/
public static void returnaAvg(Integer num1, Integer num2) throws SQLException {
// 1.获取连接
Connection conn = DBUtil.getConn();
// 2.获取CallableStatement
CallableStatement cs = conn.prepareCall("{?= callreturnFloat(?,?)}");
cs.registerOutParameter(1, Types.FLOAT);
cs.setInt(2, num1);
cs.setInt(3, num2);
// 3.执行存储过程
cs.execute();
Float f = cs.getFloat(1);
System.out.println("平均值:" + f);
}
}
所属包:
package com.jxust.test
JDBCTestProcedure.java
//package com.jxust.test; import java.sql.SQLException; //import com.jxust.dao.ProcedureDao; public class JDBCTestProcedure { /* * 带输入参数的存储过程 public static void main(String[] args) { String sp_name = "小"; List<Goddess> result = null; try { result =select_filter(sp_name); showResult(result); } catch (SQLException e) { e.printStackTrace(); } } public static List<Goddess> select_filter(String sp_name) throws SQLException{ ProcedureDao dao = new ProcedureDao(); return dao.select_filter(sp_name); } public static void showResult(List<Goddess> result){ for (int i = 0; i < result.size(); i++) { System.out.println(result.get(i).getId()+result.get(i).getUser_name()+result.get(i).getMobile()); } } */ /* * 无参数的输出过程 public static void main(String[] args) { ProcedureDao dao = new ProcedureDao(); try { dao.selectAll(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } } */ /* * 带输出参数的存储过程 public static void main(String[] args) { ProcedureDao dao = new ProcedureDao(); Integer result ; try { result = dao.select_count(); System.out.println("表的行数:"+result); } catch (SQLException e) { e.printStackTrace(); } } */ /* * 不带参数的函数 public static void main(String[] args) { ProcedureDao dao = new ProcedureDao(); try { dao.returnDate(); } catch (SQLException e) { e.printStackTrace(); } } */ /** * 带输入参数的函数 * @param args */ public static void main(String[] args) { ProcedureDao dao = new ProcedureDao(); Integer num1 = 2; Integer num2 = 3; try { dao.returnaAvg(num1, num2); } catch (SQLException e) { e.printStackTrace(); } } }
当前项目结构:
项目源码
项目源码(没有调用存储过程和函数)下载地址:http://download.csdn.net/detail/peng_hong_fu/9646503项目源码(增加调用存储过程和函数)下载地址:http://download.csdn.net/detail/peng_hong_fu/9646696
相关文章推荐
- MySQL 存储过程实例 与 ibatis/mybatis/hibernate/jdbc 如何调用存储过程
- MySQL存储过程实例——实现查询数据表,有则更新无则插入
- 存储过程或自定义函数调用存储过程的变通实现方法
- php调用mysql存储过程和函数的方法
- MySQL 存储过程调用 返回结果集 实现分页
- php调用mysql存储过程和函数的方法
- java下实现调用oracle的存储过程和函数
- 使用ADO.NET 实体数据模型实现SQL存储过程调用
- JDBC调用存储过程和函数
- sql server之触发器调用C#CLR存储过程实现两个表的数据同步
- MySQL存储过程与JDBC调用
- BlogEngine.Net架构与源代码分析系列part3:数据存储——基于Provider模式的实现
- PHP调用MySQL的存储过程的实现代码
- BlogEngine.Net架构与源代码分析系列part3:数据存储——基于Provider模式的实现
- java下实现调用oracle的存储过程和函数
- php调用mysql存储过程和函数的方法
- JDBC调用存储过程实例
- PHP调用mysql存储过程和函数的方法
- PHP调用MySQL的存储过程的实现代码
- JDBC调用存储过程实例