在之前的  (1条消息) java图书管理系统(io操作)_may10的博客-CSDN博客  基础上,将普通记事本存储信息改为MySQL数据库存储。

使用前最好提前准备好  MySQL  (1条消息) java连接MySQL_may10的博客-CSDN博客 ,

这篇文章有该过程中所需全部资源以及教程,亲测有效,一路踩坑,一路出坑,自己终于整理好了一份详细资料。

注:

准备好工程   bookManager  子包 Work   Demo  libs

以下.java文件都放在work包下

最好先初始化建立数据库   bookData

将jdbc内的账号,密码改成自己的。(建议全部设成root)

导入jar包(mysql-connector-java-8.0.11.jar),在项目内创建libs目录,将jar包复制到libs目录下
在idea内右键libs目录选择 Add As Library

Main:

package Work;/******主函数,程序入口*****/public class Main {/*** 此方法是程序入口,只需创建menu对象即可开启本程序.* @param args main方法,大家都懂*/public static void main(String[] args) {Menu menu = new Menu();}
}

Menu:

package Work;import java.util.ArrayList;
import java.util.Scanner;/******菜单页面*****/public class Menu {/*** 菜单方法,所有的功能入口,使用本程序只需在main方法中创建本类对象即可.*/public Menu() {//创建数据库连接类对象String str = "jdbc:mysql://localhost:3306/bookData?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone = GMT";String id = "root";String password = "root";Jdbc db = new Jdbc(str, id, password);//创建图书操作类对象ChangeBook change = new ChangeBook();//创建图书排序类对象BookList bList = new BookList();Scanner sc = new Scanner(System.in);//创建图书列表(初始数据从文件导入)ArrayList<Book> list = change.read(db);while(true){System.out.println("================================");System.out.println("           图书管理系统\n");System.out.println("          1.查看图书列表");System.out.println("          2.添加图书");System.out.println("          3.图书排行");System.out.println("          4.历史记录");System.out.println("          5.重置数据");System.out.println("          6.退出系统\n");System.out.println("         请选择服务项目\n                ");switch (sc.nextInt()){case 1:change.printList(list);//先打印列表change.search(list, db);//再查询break;case 2:change.insert(list, db);//插入方法break;case 3:bList.demo(list);//排序方法break;case 4:change.printMessage(db);break;case 5:db.restart();break;default:db.close();System.exit(0);break;}//文件重新存储读取,刷新数据list = change.read(db);}}
}

ChangBook:

package Work;import java.util.ArrayList;
import java.util.Scanner;/******图书查询、修改、创建、存储*****/public class ChangeBook {//修改public void change(ArrayList<Book> list, String id, Jdbc db){int c;String str;double d;Scanner sc = new Scanner(System.in);System.out.println("确认修改 ‘" + id + "’这本书吗?(键入1确认)");c = sc.nextInt();if(c==1){for (Book book : list) {if (book.getId().equals(id)) {System.out.println(book.toString());System.out.println("请输入图书新的name(输入-1,不修改):");str = sc.next();//记录修改信息String s = "";if (!str.equals("-1")) {s += "name: ‘" + book.getName() + "’ --> ‘";book.setName(str);s += book.getName() + "’; ";db.sql("update book set name = '" + str + "' where id = '" + Integer.parseInt(id) + "'");}System.out.println("请输入图书新的author:");str = sc.next();if (!str.equals("-1")) {s += "author: ‘" + book.getAuthor() + "’ --> ‘";book.setAuthor(str);s += book.getAuthor() + "’; ";db.sql("update book set author = '" + str + "' where id = '" + Integer.parseInt(id) + "'");}System.out.println("请输入图书新的price:");d = sc.nextDouble();if (!(d + "").equals("-1") && d >= 0) {s += "price: ‘" + book.getPrice() + "’ --> ‘";book.setPrice(d);s += book.getPrice() + "’; ";db.sql("update book set price = '" + d + "' where id = '" + Integer.parseInt(id) + "'");}System.out.println("请输入图书新的url:");str = sc.next();if (!str.equals("-1")) {s += "url: ‘" + book.getUrl() + "’ --> ‘";book.setUrl(str);s += book.getUrl() + "’; ";db.sql("update book set url = '" + str + "' where id = '" + Integer.parseInt(id) + "'");}System.out.println("修改完毕(id不可以修改)!");db.record("修改图书信息", id, s);System.out.println(book.toString());return;}}}else {System.out.println("已经取消修改!");}}//打印列表public void printList(ArrayList<Book> list){System.out.println("\n\n《图书列表》\n");System.out.println("ID\t\t\t\tName\t\t\t\tAuthor\t\t\t\tPrice\t\tURL");//遍历book列表,并打印对应属性for(Book book:list){System.out.println(book.getId()+"\t\t"+book.getName()+"\t\t\t\t"+book.getAuthor()+"\t\t\t\t"+book.getPrice()+"\t\t"+book.getUrl());}}//查询public void search(ArrayList<Book> list, Jdbc db){Scanner sc = new Scanner(System.in);String str,demoStr;while(true){System.out.println("\n\n请输入您想要查询的图书的“name”或者“id”(输入“-1”退出查询系统):");str=sc.next();boolean flag = false;if(str.equals("-1")){return;}else{//不适用 for-each 因为可能出现删除操作for(int i=0;i<list.size();i++) {//查找到对应的id或者nameif (str.equals(list.get(i).getId()) || str.equals(list.get(i).getName())) {System.out.println(list.get(i).getId() + "\t\t" + list.get(i).getName() + "\t\t"+ list.get(i).getAuthor() + "\t\t" + list.get(i).getPrice() + "\t\t" + list.get(i).getUrl());demoStr = list.get(i).getId();flag = true;int c;System.out.println("修改图书属性(1)--删除图书(2)--取消操作(-1)");c = sc.nextInt();if (c == 1) {change(list, demoStr, db);break;} else if (c == 2) {delete(list, demoStr, db);break;} else {break;}}}if(!flag){System.out.println("您输入的图书name或id ‘" + str + "’ 不存在,请重新输入。");}}}}//创建public void insert(ArrayList<Book> list, Jdbc db){String str1, str2, str3, s="";double d;Scanner sc = new Scanner(System.in);while(true){boolean flag = true;//判断图书名称是否合法System.out.println("输入-1退出增加图书(输入其他内容则继续添加):");str1 = sc.next();if(str1.equals("-1")){return;}Book book = new Book();System.out.println("请输入您要添加的图书的name:");str1 = sc.next();for(Book bookDemo:list){//图书名称不得重复if(bookDemo.getName().equals(str1)){System.out.println("已经存在此图书,请勿添加重复图书。\n" +"若是在那个要添加同名书籍,请在书名后方加上大写字母区分\n");flag = false;break;}}if(flag){book.setName(str1);System.out.println("请输入您要添加的图书的author:");str2 = sc.next();book.setAuthor(str2);System.out.println("请输入您要添加的图书的price:");d = sc.nextDouble();if(d >= 0){book.setPrice(d);}System.out.println("请输入您要添加的图书的url:");str3 = sc.next();book.setUrl(str3);System.out.println(book.toString());list.add(book);db.sql("insert into book (name, author, price, url) " +"value ('" + str1 + "', '" + str2 + "', '" + book.getPrice() + "', '" + str3 + "')");db.record("创建图书信息", str1, "创建成功");}}}//删除public void delete(ArrayList<Book> list, String id, Jdbc db){int c;Scanner sc = new Scanner(System.in);System.out.println("确认删除 ‘" + id + "’这本书吗?(键入1确认)");c = sc.nextInt();if(c==1){for(int i=0; i<list.size();i++) {if (list.get(i).getId().equals(id)) {Book demo = list.remove(i);System.out.println("图书 ‘" + demo.getName() + "’ 已经删除!");db.sql("delete from book where id = " + Integer.parseInt(demo.getId()));db.record("删除图书信息", demo.getId(), "删除成功");printList(list);return;}}}else {System.out.println("已经取消删除!");}}//读取数据库文件public ArrayList<Book> read(Jdbc db){ArrayList<Book> list = null;//初始化Book类的count和idCountBook.setCount();try{list=db.searchBook();System.out.println("读取数据成功");return list;}catch (Exception e){e.printStackTrace();}return list;}public void printMessage(Jdbc db){ArrayList<Message> list = db.searchMessage();System.out.println("\n\n《记录列表》\n");System.out.println("ID\t\t\t\tBook\t\t\t\tType\t\t\t\tTime\t\tInfo");//遍历book列表,并打印对应属性for(Message message:list){System.out.println(message.getId()+"\t\t"+message.getBook()+"\t\t\t\t"+message.getType()+"\t\t\t\t"+message.getTime()+"\t\t"+message.getInfo());}}}

Book:

package Work;import java.util.Objects;/*****图书类*****/public class Book {private String id;//图书号private String name;//书名private String author;//作者private double price;//价格private String url;//网址//计数与id分配变量private static int count=0;//书本计数//全参构造public Book(String id, String name, String author, double price, String url) {this.id = id;this.name = name;this.author = author;if(price >= 0){this.price = price;}else{System.out.println("price不能小于0,请使用修改方法修改price!");}this.url = url;count++;//书本数量加一}public Book() {count++;//书本数量加一}//比较判断方法@Overridepublic boolean equals(Object o) {if (this == o) return true;if (o == null || getClass() != o.getClass()) return false;Book book = (Book) o;return name.equals(book.name);}//未知@Overridepublic int hashCode() {return Objects.hash(name);}//toString@Overridepublic String toString() {return "Book{" +"id='" + id + '\'' +", name='" + name + '\'' +", author='" + author + '\'' +", price=" + price +", url='" + url + '\'' +'}';}public String getName() {return name;}public void setName(String name) {this.name = name;}public String getAuthor() {return author;}public void setAuthor(String author) {this.author = author;}public double getPrice() {return price;}public void setPrice(double price) {if(price >= 0){this.price = price;}else{System.out.println("price不能小于0,请重新使用使用修改方法修改price!");}}public String getUrl() {return url;}public void setUrl(String url) {this.url = url;}public String getId() {return id;}public void setId(String id) { this.id = id; }public static int getCount() { return count; }//书本数量只许清零public static void setCount() {  Book.count=0;}
}

BookList:

package Work;import java.util.*;/******图书排序类*****/public class BookList {/*** @param list 图书列表*///图书排序public void demo(ArrayList<Book> list){ChangeBook change = new ChangeBook();int s;Scanner sc = new Scanner(System.in);while(true){System.out.println("\n请选择排序方式(1.价格升序--2.价格降序--3.id升序--4.id降序,-1.退出排序):");s = sc.nextInt();if(s==1){/*//集合排序,价格升序list.sort(new Comparator<Book>() {@Overridepublic int compare(Book o1, Book o2) {return (int) o1.getPrice() - (int) o2.getPrice();}});*///集合排序,价格升序list.sort((o1, o2) -> (int) o1.getPrice() - (int) o2.getPrice());change.printList(list);}else if(s==2){//集合排序,价格降序list.sort((o1, o2) -> (int) o2.getPrice() - (int) o1.getPrice());change.printList(list);}else if(s==3){//集合排序,id降序list.sort((o1, o2) -> Integer.parseInt(o1.getId()) - Integer.parseInt(o2.getId()));change.printList(list);}else if(s==4){//集合排序,价格降序list.sort((o1, o2) -> Integer.parseInt(o2.getId()) - Integer.parseInt(o1.getId()));change.printList(list);}else{return;}}}
}

Message:

package Work;/******记录信息类*****/public class Message {private String id;private String book;private String type;private String time;private String info;public Message(String id, String book, String type, String time, String info) {this.id = id;this.book = book;this.type = type;this.time = time;this.info = info;}public Message() {}public String getId() {return id;}public void setId(String id) {this.id = id;}public String getBook() {return book;}public void setBook(String book) {this.book = book;}public String getType() {return type;}public void setType(String type) {this.type = type;}public String getTime() {return time;}public void setTime(String time) {this.time = time;}public String getInfo() {return info;}public void setInfo(String info) {this.info = info;}
}

Jdbc:

package Work;import java.sql.*;
import java.util.ArrayList;
import java.util.Calendar;/*****MySQL数据库连接类*****/public class Jdbc {/*private String path;//数据库连接IP地址及端口号和数据库名//例: "localhost:3306/data"//     IP      端口号   数据库名private String str = "jdbc:mysql://" + path+ "?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone = GMT";//例:"jdbc:mysql://localhost:3306/data?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone = GMT"*/private String path;//数据库地址及设置//标准格式参考上面注释部分private String id;//数据库账号private  String password;//数据库密码Connection con;//连接对象Statement state;//执行对象public Jdbc(String path, String id, String password) {//1.导入jar包,在项目内创建libs目录,将jar包复制到libs目录下//在idea内右键libs目录选择 Add As Library//注册数据库驱动try {Class.forName("com.mysql.cj.jdbc.Driver");} catch (ClassNotFoundException e) {e.printStackTrace();}this.path = path;this.id = id;this.password = password;dataBase();init();}//创建连接对象和执行对象private void dataBase(){//获取连接对象try {this.con = DriverManager.getConnection( this.path, this.id, this.password);//获取执行对象this.state = this.con.createStatement();} catch (Exception e) {e.printStackTrace();}}//执行SQL语句(查询之外)public void sql(String str){try {boolean execute = this.state.execute(str);if(execute){System.out.println("执行失败");}else{System.out.println("执行成功.");}} catch (Exception e) {e.printStackTrace();}}//执行查询SQL语句(使用集合返回)public ArrayList<Book> searchBook(){ArrayList<Book> array = new ArrayList<>();String str = "select * from book";try {//获取结果集ResultSet resultSet = this.state.executeQuery(str);while (resultSet.next()){Book book = new Book();//补足八位,不够前导0book.setId(String.format("%08d", Integer.parseInt(resultSet.getString("id"))));book.setName(resultSet.getString("name"));book.setAuthor(resultSet.getString("author"));book.setPrice(Double.parseDouble(resultSet.getString("price")) );book.setUrl(resultSet.getString("url"));array.add(book);}return array;} catch (Exception e) {e.printStackTrace();}return null;}//查询记录信息public ArrayList<Message> searchMessage(){ArrayList<Message> array = new ArrayList<>();String str = "select * from message";try {//获取结果集ResultSet resultSet = this.state.executeQuery(str);while (resultSet.next()){Message message = new Message();//补足八位,不够前导0message.setId(String.format("%08d", Integer.parseInt(resultSet.getString("id"))));message.setBook(resultSet.getString("book"));message.setType(resultSet.getString("type"));message.setTime(resultSet.getString("time"));message.setInfo(resultSet.getString("info"));array.add(message);}return array;} catch (Exception e) {e.printStackTrace();}return null;}//执行查询SQL语句(返回所需图书的id)public String find(String str, ArrayList<Book> array){for(Book book:array){//如果id或者名称相符if(book.getId().equals(str) || book.getName().equals(str)){return book.getId();}}return null;}//初始化数据库public void init(){//新创建的数据库要开启使用String[] str = {"use bookData","create table book (id INT AUTO_INCREMENT, PRIMARY KEY (id)" +", name varchar(30), author varchar(20), price double, url varchar(255))","insert into book (name , author, price, url) value ('西游记', '吴承恩', 88.88, 'www.bookGood.com')","insert into book (name , author, price, url) value ('红楼梦', '曹雪芹', 99.99, 'www.bookNice.com')","insert into book (name , author, price, url) value ('三国演义', '罗贯中', 77.77, 'www.bookWe.com')","insert into book (name , author, price, url) value ('水浒传', '施耐庵', 66.66, 'www.bookOld.com')","create table message (id INT AUTO_INCREMENT, PRIMARY KEY (id)" +", book varchar(30), type varchar(30), time varchar(30), info varchar(255))","insert into message (book, type, time, info) value ('null', '创建表格 book', '" + Calendar.getInstance().getTime() + "', 'ok')","insert into message (book, type, time, info) value ('null', '导入demo数据', '" + Calendar.getInstance().getTime() + "', 'ok')","insert into message (book, type, time, info) value ('null', '创建表格 message', '" + Calendar.getInstance().getTime() + "', 'ok')","insert into message (book, type, time, info) value ('null', '导入初始化信息', '" + Calendar.getInstance().getTime() + "', 'ok')"};/*//创建图书列表String str1 = "create table book (id INT AUTO_INCREMENT, PRIMARY KEY (id)" +", name varchar(30), author varchar(20), price double, url varchar(255))";//导入demo数据(id不导入)String str2 = "insert into book (name , author, price, url) value ('西游记', '吴承恩', 88.88, 'www.bookGood.com')";String str3 = "insert into book (name , author, price, url) value ('红楼梦', '曹雪芹', 99.99, 'www.bookNice.com')";String str4 = "insert into book (name , author, price, url) value ('三国演义', '罗贯中', 77.77, 'www.bookWe.com')";String str5 = "insert into book (name , author, price, url) value ('水浒传', '施耐庵', 66.66, 'www.bookOld.com')";//创建信息列表String str6 = "create table message (id INT AUTO_INCREMENT, PRIMARY KEY (id)" +", type varchar(30), time varchar(30), info varchar(255))";//导入创建数据库及表格数据String str7 = "insert into message (type, time, info) value ('创建表格 book', '" + Calendar.getInstance().getTime() + "', 'ok')";String str8 = "insert into message (type, time, info) value ('导入demo数据', '" + Calendar.getInstance().getTime() + "', 'ok')";String str9 = "insert into message (type, time, info) value ('创建表格 message', '" + Calendar.getInstance().getTime() + "', 'ok')";String str10 = "insert into message (type, time, info) value ('导入初始化信息', '" + Calendar.getInstance().getTime() + "', 'ok')";*///验证语句(判断数据库中是否有表)try {ResultSet count = state.executeQuery(" SELECT COUNT(*) AS cou FROM information_schema.`TABLES` WHERE table_schema = 'bookData' AND (table_name = 'book' OR table_name = 'message') ");if(count.next()){//数据库与表格完整if(Integer.parseInt(count.getString("cou")) == 2){System.out.println("初始化完成");}//数据库存在表格不存在else if (Integer.parseInt(count.getString("cou")) == 0){//执行初始化语句for(String s:str){try {this.state.execute(s);} catch (SQLException e) {e.printStackTrace();}}System.out.println("初始化完成");}else {//数据库存在但是表格数量不对,直接删除数据库重新初始化state.execute("DROP DATABASE bookData");init();System.out.println("初始化完成");}}else{//数据库不存在则创建数据库,并且初始化state.execute("create  database  bookData");//新创建的数据库要开启使用state.execute("use bookData");init();System.out.println("初始化完成");}} catch (SQLException e) {e.printStackTrace();}}//存储操作记录public void record(String type, String book, String info){try {state.execute("insert into message (book, type, time, info) " +"value ( '"+ book +"', '" + type +"', '"+ Calendar.getInstance().getTime() + "', '" + info + "')");System.out.println("记录完成");} catch (Exception e) {e.printStackTrace();}}public void close(){try {this.state.close();this.con.close();} catch (Exception e) {e.printStackTrace();}}//出现异常情况,数据库和表格数量没变但是出现其他不可逆现象,使用这方法重置数据库public void restart(){try {//删除数据库state.execute("DROP DATABASE bookData");System.out.println("删除表");//创建数据库state.execute("create  database  bookData");System.out.println("创建表");init();System.out.println("重置完成");} catch (Exception e) {e.printStackTrace();}}public String getPath() {return path;}public void setPath(String path) {this.path = path;}public String getId() {return id;}public void setId(String id) {this.id = id;}public String getPassword() {return password;}public void setPassword(String password) {this.password = password;}}

java图书管理系统(MySQL)相关推荐

  1. 视频教程-手把手实现Java图书管理系统(附源码)-Java

    手把手实现Java图书管理系统(附源码) 南京大学软件工程硕士,曾就职于擎天科技.中软国际.华为等上市公司,擅长Java开发.Web前端.Python爬虫.大数据等领域技术. 全栈工程师,从事软件开发 ...

  2. [附源码]计算机毕业设计JAVA图书管理系统

    [附源码]计算机毕业设计JAVA图书管理系统 项目运行 环境配置: Jdk1.8 + Tomcat7.0 + Mysql + HBuilderX(Webstorm也行)+ Eclispe(Intell ...

  3. java图书管理系统源码

    java图书管理系统源码 系统主要功能 读者:登录注册,借阅还书,查询书籍,查看当前借阅信息以及历史借阅信息,查看.查询读者借阅榜以及借阅书籍借阅榜,问题反馈以及查询反馈结果等功能. 管理员:对图书. ...

  4. Java图书管理系统练习程序(四)

    2019独角兽企业重金招聘Python工程师标准>>> Java图书管理系统练习程序(四) 本部分主要介绍List的基本操作与Java中泛型的使用. 一.Java中泛型的使用 泛型, ...

  5. java图书管理系统技术难度_Java图书管理系统练习程序(一)

    Java图书管理系统练习程序 第一部分 该部分主要实现命令行方式的界面与无数据库访问的练习,通过本练习.主要掌握Java的基础知识与面向对象程序设计思想.面向接口编程技术的知识与运用. 一.练习程序功 ...

  6. java图书管理系统源代码_高校社团管理系统(ssm+mysql)

    高校社团管理系统(ssm+mysql)https://www.zhihu.com/video/1225527405491630080 本文以java为开发技术,实现了一个高校社团管理系统.高校社团管理 ...

  7. MySQL+Java 图书管理系统

    一.设计目的 通过对图书管理系统的系统分析.系统设计.编码和调试等工作的实践,熟悉管理信息系统的开发过程.设计方法及相关编程技术,熟练掌握数据库设计的基本理论及方法. 二.设计任务 要求完成一个具有一 ...

  8. 我的第一个项目----Java图书管理系统

    项目参考自:http://www.java1234.com/a/yuanchuang/swing2/ 项目视频及代码下载地址:链接:http://pan.baidu.com/s/1pLpQw2J 密码 ...

  9. javaee图书管理系统mysql,图书管理系统设计与实现—看这篇就够了

    图书管理系统设计与实现 > 图书馆人员结构复杂,人员数量有限,涉及方面很广,如果还使用手工操作处理图书借阅问题,工作将非常繁琐,需要大量的人力.物理.财力,极大的浪费了资源,对于图书管理人员来说 ...

  10. java图书管理系统目的_java_图书管理系统java版,本文的目的就是通过图书管理 - phpStudy...

    图书管理系统java版 本文的目的就是通过图书管理系统掌握数据库编程技术,能正确连接数据库,能对数据库中信息进行查询.插入.删除.修改. 内容:在数据库中创建一张书目信息表,包括书名.作者.出版社.出 ...

最新文章

  1. Android中的网络(字节跳动)
  2. 网络管理技术(Network Administrative Techniques)
  3. oracle如何进入管理器,oracle 启动管理器
  4. 超级猩猩获 3.6 亿元 D 轮融资,计划今年新开100家门店
  5. TablePlus 3中文版
  6. rabbitMQ简单使用
  7. java怎么防止表单重复提交_如何防止表单重复提交
  8. python入门难?几个练习实例 全会就入门了
  9. The 6th Zhejiang Provincial Collegiate Programming Contest-ProblemA:Second-price Auction
  10. 详述一次大量删除导致MySQL慢查的过程
  11. 大一C语言大作业ip合法性,c语言实现判断ip地址是否合法
  12. 公链史记 | 从鸿蒙初辟到万物生长的十年激荡
  13. 浅谈BeanDefinition、BeanDefinitionMap、RootBeanDefintion三者的关系
  14. VC 界面库 皮肤库
  15. Cisco路由器之IPSec 虚拟专用网(内附配置案例)
  16. 浅夏,绿色延伸,就连邻家墙角的蔷薇也羞红了脸
  17. 鸿蒙思维闪卡训练,提高孩子智力,父母不妨使用思维导图来提升孩子记忆力和创造力...
  18. 生活随记 - 申通快递鸡蛋全碎了
  19. 电阻、电容及电感的高频等效电路及特性曲线
  20. Silane-PEG-NH2 氨基聚乙二醇硅烷 NH2-PEG-Silane结构式

热门文章

  1. PAT(甲级)2019年冬季考试 7-1 Good in C (20分)
  2. linux连接本地文件夹,llinux除了软连接本地文件夹同步:mount
  3. 004-读书笔记-企业IT架构转型之道-阿里巴巴中台战略思想与架构实战-共享服务中心建设原则...
  4. c语言music算法,PROJECT:以music算法为基础的几种DOA算法的研究及性能分析
  5. u9系统的使用方法仓库_用友U9--INV库存管理手册.pdf
  6. linux基础期末考,Linux基础期末考试试题.pdf
  7. trucksim安装教程
  8. JDK源码系列 下载源码
  9. 异贝,通过移动互联网技术,为中小微实体企业联盟、线上链接、线上线下自定义营销方案推送。案例14
  10. 第一节-戴师兄数据分析学习笔记