一个RESTful+MySQL程序
前言
本章内容适合初学者(本人也是初学者)。
上一章内容(http://www.cnblogs.com/vanezkw/p/6414392.html)是在浏览器中显示Hello World,今天我们要讲的是把Hello World这样的字符串从数据库里面取出来(比较接近实际开发)。
准备工作
1、安装mysql。
2、安装mysql可视化工具Navicat。(由于本人偏好,所以暂时用这个可视化工具)。
3、Intellij安装mysql jdbc驱动。
4、在GlassFish中加入mysql jdbc驱动。
安装启动mysql
1、下载地址https://www.mysql.com/downloads/ (虽然你可以搜到很多下载的渠道,但是建议在官方下载,你懂的)。
2、根据提示进行安装配置。(这不是重点,不清楚的自己google)。
3、如果出现安装不上那应该是系统权限问题,采用系统管理员权限安装就可以了。(我在win10下进行安装遇到了权限问题)。
4、启动mysql服务。
5、加入测试数据。数据库我们命名成RESTful,加一个表Product,里面包括4个字段:id、name、cover、price。具体如图:
为了方便测试就先加了一条记录。
安装Navicat
我们用Navicat进行可视化操作,当然你可以直接在mysql提供的工具或命令行进行数据操作。
1、下载地址https://www.navicat.com/download,至于是否付费或者破解就看你自己了,你懂的。
2、根据提示进行安装。
Intellij安装mysql jdbc驱动
1、在Intellij在主菜单中选择View|Tool Windows|Databases。
2、右边弹出Database栏目,选择上面的“+”,依次选择DataSource|MySQL,此时弹出一个Data Source and Drive的对话框。
3、点击左上方“+”,选择MySQL。根据提示填写右边的字段。
4、点击右边面板的Driver:MySQL,下载MySQL驱动。
在GlassFish中加入mysql jdbc驱动。
1、把mysql的驱动(eg:mysql-connector-java-5.1.35-bin.jar)放入..\glassfish4\glassfish\lib (具体参考你的GlassFish的安装目录)。
编码
1、加入mysql驱动jar包。
2、目录结构如下:
3、目录结构介绍。bo里面是实体类,dao是数据库相关的操作类(为了方便理解流程所以不涉及ORM之类的东西)。下面来看看每个类的具体情况:
BoProduct.java
package bo; /** * Created by Administrator on 2017/2/19 0019. */ public class BoProduct { private int id; private String name; private String cover; private long price; public BoProduct(int id, String name, String cover, long price) { this.id = id; this.name = name; this.cover = cover; this.price = price; } public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getCover() { return cover; } public void setCover(String cover) { this.cover = cover; } public long getPrice() { return price; } public void setPrice(long price) { this.price = price; } @Override public String toString() { return "BoProduct{" + "id=" + id + ", name='" + name + '\'' + ", cover='" + cover + '\'' + ", price=" + price + '}'; } }
DbConnection.java
package dao; /** * Created by Administrator on 2017/2/19 0019. */ import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; public class DbConnection { public Connection getConnection() throws Exception { try { String connectionURL = "jdbc:mysql://localhost:3306/RESTful"; Connection connection = null; Class.forName("com.mysql.jdbc.Driver").newInstance(); connection = DriverManager.getConnection(connectionURL, "root", "root"); return connection; } catch (SQLException e) { e.printStackTrace(); throw e; } catch (Exception e) { e.printStackTrace(); throw e; } } }
DbProductManager.java
package dao; import bo.BoProduct; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.util.ArrayList; import java.util.List; /** * Created by Administrator on 2017/2/19 0019. */ public class DbProductManager { public List<BoProduct> getAllProduct() { List<BoProduct> reuslt = null; DbConnection database = new DbConnection(); Connection connection = null; try { connection = database.getConnection(); PreparedStatement ps = connection .prepareStatement("SELECT * FROM product"); ResultSet rs = ps.executeQuery(); reuslt = new ArrayList<>(); while (rs.next()) { BoProduct item = new BoProduct(rs.getInt("id"),rs.getString("name"),rs.getString("cover"),rs.getLong("price")); reuslt.add(item); } } catch (Exception e) { e.printStackTrace(); } return reuslt; } }
HelloWorld.java
import bo.BoProduct; import dao.DbProductManager; import javax.ws.rs.GET; import javax.ws.rs.Path; import javax.ws.rs.Produces; import javax.ws.rs.core.MediaType; import java.util.List; /** * Created by Administrator on 2017/2/18 0018. */ @Path("/helloworld") public class HelloWorld { @GET @Produces(MediaType.TEXT_PLAIN) public String getClichedMessage() { StringBuilder stringBuilder = new StringBuilder(); stringBuilder.append("data being\n"); DbProductManager dbProductManager = new DbProductManager(); List<BoProduct> allProduct = dbProductManager.getAllProduct(); if (null != allProduct && !allProduct.isEmpty()) { for (BoProduct item : allProduct) { stringBuilder.append(item.toString()).append("\n"); } } stringBuilder.append("data end\n"); return stringBuilder.toString(); } }
MyApplication
import javax.ws.rs.ApplicationPath; import javax.ws.rs.core.Application; import java.util.HashSet; import java.util.Set; /** * Created by Administrator on 2017/2/18 0018. */ //Defines the base URI for all resource URIs. @ApplicationPath("/") //The java class declares root resource and provider classes public class MyApplication extends Application { //The method returns a non-empty collection with classes, that must be included in the published JAX-RS application @Override public Set<Class<?>> getClasses() { HashSet h = new HashSet<Class<?>>(); h.add(HelloWorld.class); return h; } }
运行程序
1、点击运行按钮。
2、此时IDE为你做了一些你并不需要关系的事情(非业务的):编译并部署到服务器,启动浏览器。
3、此时看到浏览器如下显示则说明你成功了。
总结
1、基本流程已经跑起来,后期需求学习的目前比较流行的一些框架。
2、下一个版本我们使用ORM框架来写数据库这一部分。
3、本人初学服务器相关知识,有错误的地方欢迎各位读者指出纠正,如果你对android开发感兴趣请加qq群196761677、311536202。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架