2021.1.27 更新

已更新新版本博客,更新内容很多,因此新开了一篇博客,戳这里

1 概述

使用spring boot作为后端框架与Android端配合mysql进行基本的交互,包含了最基本的增删查改功能.

2 开发环境

  • Win
  • IDEA 2019.2
  • Tomcat 9.0.27
  • MySQL 8.0.17
  • Spring Boot 2.2.1
  • JDK 8

3 后端

3.1 新建一个Spring Boot项目

参考这里.

3.2 实体类

新建User类作为实体类:

@Entity
public class User {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Integer id;
private String name; public Integer getId() {
return id;
} public void setId(Integer id) {
this.id = id;
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
}
}

用的其实是3.1链接中的代码,里面有详细的解释.

3.3 持久层

新建UserRepository实现增删查改:

@Repository
public interface UserRepository extends CrudRepository<User,Integer>
{
@Query(value = "select * from user where name = ?1",nativeQuery = true)
public List<User> findByName(String name); @Modifying
@Query(value = "delete from user where name = ?1",nativeQuery = true)
public int deleteByName(String name);
}

由于CrudRepository中已经包含了"增"与"改",所以按需要实现自己的"查"与"删"即可.

CrudRepository的api很简单,官方文档在这里.

  • "增"使用save即可,参数为实体类
  • "删"使用deleteById,通过主键删除,若不想通过主键删除可以自己编写sql,像上面一样
  • "查"使用findAllfindById,自定义查找的话需要自己编写SQL
  • "改"也可使用save,注意需要设置主键

@Query用于设置SQL语句,nativeQuery表示使用原生SQL.

3.4 业务层

新建一个MainService.java:

@Transactional
@Service
public class MainService {
@Autowired
private UserRepository userRepository; public Iterable<User> getAllUsers()
{
return userRepository.findAll();
} public List<User> findByName(String name)
{
return userRepository.findByName(name);
} public boolean add(String name)
{
User user = new User();
user.setName(name);
userRepository.save(user);
return true;
} public boolean modify(Integer id,String name)
{
User user = new User();
user.setName(name);
user.setId(id);
userRepository.save(user);
return true;
} public boolean deleteByName(String name)
{
return userRepository.deleteByName(name) != 0;
}
}
  • getAllUsers():返回所有行,Iterable<E>类型
  • findByName():根据name返回所有name相同的行
  • add直接使用了save,由于save返回的是实体类,原本的代码是这样写的:
return userRepository.save(user) != null;



但是文档说了不会为null,所以只能强制返回true了.

  • modify使用了id与name作为参数,新建一个user,将其作为setter的参数,然后交给save
  • deleteByName使用了自定义的删除函数,返回的是int,在UserRepository中这个int代表SQL影响的行数,删除成功则行数不为0,删除失败,或者没有这行数据则行数为0.因此将返回值与0进行比较

3.5 控制层

@Controller
@RequestMapping(path = "/demo")
public class MainController {
@Autowired
private MainService mainService; @GetMapping(path = "/getAll")
public @ResponseBody Iterable<User> getAllUsers()
{
return mainService.getAllUsers();
} @PostMapping(path = "/get")
public @ResponseBody List<User> findByName(String name)
{
return mainService.findByName(name);
} @PostMapping(path = "/add")
public @ResponseBody boolean add(@RequestParam String name)
{
return mainService.add(name);
} @PostMapping(path = "/modify")
public @ResponseBody boolean modify(@RequestParam Integer id,@RequestParam String name)
{
return mainService.modify(id,name);
} @PostMapping(path = "/delete")
public @ResponseBody boolean deleteByName(@RequestParam String name)
{
return mainService.deleteByName(name);
}
}

Controller主要就是几个注解,除了getAllUsers使用Get外,其他的都是用Post.另外就是路径设置,直接在path中设置即可.

后端的话到这里就基本完成了,剩下的打包部署操作就不说了,需要的可以参考这里.

4 Android端

什么新建工程之类的就不说了.

贴上部分MainActivity,完整代码见文末:

public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
register.setOnClickListener(v ->{new Thread(()-> {
OkHttpClient okHttpClient = new OkHttpClient();
String name = ((EditText) findViewById(R.id.name)).getText().toString();
FormBody formBody = new FormBody.Builder().add("name", name).build();
Request request = new Request.Builder()
.url(Constant.ADD)
.post(formBody)
.build();
try (Response response = okHttpClient.newCall(request).execute()) {
Looper.prepare();
if (Boolean.parseBoolean(response.body().string()))
{
Toast.makeText(this, "注册成功", Toast.LENGTH_SHORT).show();
}
else
{
Toast.makeText(this, "注册失败", Toast.LENGTH_SHORT).show();
}
Looper.loop();
}
//...
}).start();}); login.setOnClickListener(v ->{new Thread(()-> {
OkHttpClient okHttpClient = new OkHttpClient();
String name = ((EditText) findViewById(R.id.name)).getText().toString();
FormBody formBody = new FormBody.Builder().add("name", name).build();
Request request = new Request.Builder()
.url(Constant.GET)
.post(formBody)
.build();
try (Response response = okHttpClient.newCall(request).execute()) {
List<User> users = JSONArray.parseArray(response.body().string(),User.class);
Looper.prepare();
if(users.size() == 0)
{
Toast.makeText(this,"登录失败",Toast.LENGTH_SHORT).show();
}
else
{
Toast.makeText(this,"登录成功",Toast.LENGTH_SHORT).show();
}
Looper.loop();
}
//...
}).start();}); delete.setOnClickListener(v ->{new Thread(()-> {
OkHttpClient okHttpClient = new OkHttpClient();
String name = ((EditText) findViewById(R.id.name)).getText().toString();
FormBody formBody = new FormBody.Builder().add("name", name).build();
Request request = new Request.Builder()
.url(Constant.DELETE)
.post(formBody)
.build();
try (Response response = okHttpClient.newCall(request).execute()) {
Looper.prepare();
if (Boolean.parseBoolean(response.body().string()))
{
Toast.makeText(this, "删除成功", Toast.LENGTH_SHORT).show();
}
else
{
Toast.makeText(this, "删除失败", Toast.LENGTH_SHORT).show();
}
Looper.loop();
}
//...
}).start();}); modify.setOnClickListener(v ->{new Thread(()-> {
OkHttpClient okHttpClient = new OkHttpClient();
String name = ((EditText) findViewById(R.id.name)).getText().toString();
String id = ((EditText)findViewById(R.id.id)).getText().toString();
FormBody formBody = new FormBody.Builder()
.add("name", name)
.add("id",id)
.build();
Request request = new Request.Builder()
.url(Constant.MODIFY)
.post(formBody)
.build();
try (Response response = okHttpClient.newCall(request).execute()) {
Looper.prepare();
if (Boolean.parseBoolean(response.body().string()))
{
Toast.makeText(this, "修改成功", Toast.LENGTH_SHORT).show();
}
else
{
Toast.makeText(this, "修改失败", Toast.LENGTH_SHORT).show();
}
Looper.loop();
}
//...
}).start();});
}
}

下面分别进行CRUD操作.

4.1 增

OkHttpClient okHttpClient = new OkHttpClient();
String name = ((EditText) findViewById(R.id.name)).getText().toString();
FormBody formBody = new FormBody.Builder().add("name", name).build();
Request request = new Request.Builder()
.url(Constant.ADD)
.post(formBody)
.build();
try (Response response = okHttpClient.newCall(request).execute()) {
Looper.prepare();
if (Boolean.parseBoolean(response.body().string()))
{
Toast.makeText(this, "注册成功", Toast.LENGTH_SHORT).show();
}
else
{
Toast.makeText(this, "注册失败", Toast.LENGTH_SHORT).show();
}
Looper.loop();
} catch (IOException e) {
e.printStackTrace();
}

使用OkHttp,通过FormBody设置参数,然后创建Request通过OkHttpClient发送.

由于后端"增"的方法返回的是一个true,因此这里将response.body().string()转换成boolean判断是否操作成功.

稍微提一下,

Looper.prepare();
Looper.loop();

这两行可以在非UI线程中使用Toast.

4.2 删

OkHttpClient okHttpClient = new OkHttpClient();
String name = ((EditText) findViewById(R.id.name)).getText().toString();
FormBody formBody = new FormBody.Builder().add("name", name).build();
Request request = new Request.Builder()
.url(Constant.DELETE)
.post(formBody)
.build();
try (Response response = okHttpClient.newCall(request).execute()) {
Looper.prepare();
if (Boolean.parseBoolean(response.body().string()))
{
Toast.makeText(this, "删除成功", Toast.LENGTH_SHORT).show();
}
else
{
Toast.makeText(this, "删除失败", Toast.LENGTH_SHORT).show();
}
Looper.loop();
} catch (IOException e) {
e.printStackTrace();
}

删这部分也是差不多的,就是改一下url,然后....然后没有了....好像很简单的样子?2333333

4.3 查

OkHttpClient okHttpClient = new OkHttpClient();
String name = ((EditText) findViewById(R.id.name)).getText().toString();
FormBody formBody = new FormBody.Builder().add("name", name).build();
Request request = new Request.Builder()
.url(Constant.GET)
.post(formBody)
.build();
try (Response response = okHttpClient.newCall(request).execute()) {
List<User> users = JSONArray.parseArray(response.body().string(),User.class);
Looper.prepare();
if(users.size() == 0)
{
Toast.makeText(this,"登录失败",Toast.LENGTH_SHORT).show();
}
else
{
Toast.makeText(this,"登录成功",Toast.LENGTH_SHORT).show();
}
Looper.loop();
} catch (IOException e) {
e.printStackTrace();
}

查这里注意一下后端返回的是List,这里借助阿里的fastjson转换成List.

List<User> users = JSONArray.parseArray(response.body().string(),User.class);

然后判断有没有的话就判断长度是否为0即可.

4.4 改

OkHttpClient okHttpClient = new OkHttpClient();
String name = ((EditText) findViewById(R.id.name)).getText().toString();
String id = ((EditText)findViewById(R.id.id)).getText().toString();
FormBody formBody = new FormBody.Builder()
.add("name", name)
.add("id",id)
.build();
Request request = new Request.Builder()
.url(Constant.MODIFY)
.post(formBody)
.build();
try (Response response = okHttpClient.newCall(request).execute()) {
Looper.prepare();
if (Boolean.parseBoolean(response.body().string()))
{
Toast.makeText(this, "修改成功", Toast.LENGTH_SHORT).show();
}
else
{
Toast.makeText(this, "修改失败", Toast.LENGTH_SHORT).show();
}
Looper.loop();
} catch (IOException e) {
e.printStackTrace();
}

改的话只需一个额外的ID参数,在FormBody中add一个即可,不难.

4.5 UI

UI不详细说了,就几个简单的Button,具体可以看代码中的xml文件.

4.6 依赖与其他



注意一下依赖,还有设置java8.

compileOptions{
sourceCompatibility=1.8
targetCompatibility=1.8
} dependencies{
implementation 'com.squareup.okhttp3:okhttp:x.x.x'
implementation 'com.alibaba:fastjson:x.x.x'
}
  • OkHttp最新版本戳这里查看
  • fastjson最新版本戳这里查看

4.7 网络权限

这个笔者之前的文章有说,主要就是AndroidManifest.xml中的权限设置,请看这里.

5 测试

原始数据库:



注册一个:



看看数据库:



测试登录:



试试登录一个不存在的:



修改:







最后是删除:





删除一个不存在的会删除失败.

6 源码

如果觉得文章好看,欢迎点赞。

同时欢迎关注微信公众号:氷泠之路。

后端Spring Boot+前端Android交互+MySQL增删查改的更多相关文章

  1. 后端Spring Boot+前端Android交互+MySQL增删查改(Java+Kotlin实现)

    1 前言&概述 这篇文章是基于这篇文章的更新,主要是更新了一些技术栈以及开发工具的版本,还有修复了一些Bug. 本文是SpringBoot+Android+MySQL的增删查改的简单实现,用到 ...

  2. php mysql增删查改

    php mysql增删查改代码段 $conn=mysql_connect('localhost','root','root');  //连接数据库代码 mysql_query("set na ...

  3. mysql 增删查改

    非关系型数据库关系型数据库Oracle mysql sqlserver db2 Postgresql Sqlite access sqlserver 微软db2 ibm================ ...

  4. node.js+mysql增删查改

    数据库和表: -- -- 数据库: `test` -- -- -------------------------------------------------------- -- -- 表的结构 ` ...

  5. MySQL 增删查改 必知必会

    MySQL 数据库中的基础操作 3.表的修改 对表的表名.字段.字段类型.字段长度.约束等进行修改. 3.1 表的名称修改 -- 语法: ALTER TABLE 库名.表名 RENAME TO 新表名 ...

  6. python操作mysql增删查改

    # coding=utf-8 ''' python操作mysql,需安装MySQLdb驱动 安装MySQLdb,请访问 http://sourceforge.net/projects/mysql-py ...

  7. 靠谱好用,ANDROID SQLITE 增删查改

    布局文件main实现简单的功能: 1 <?xml version="1.0" encoding="utf-8"?> 2 <LinearLayo ...

  8. MySQL增删查改语句(入门)

    目录 create alter: insert delete update select 数据库定义语句: create:创建数据库及表对象 drop:删除数据库及表对象 alter:修改数据库及表对 ...

  9. mysql增删查改练习

    建表 班级表 create table class( cid int auto_increment unique, caption varchar(32) not null default '' )c ...

随机推荐

  1. Python3网络爬虫-- 使用代理,轮换使用各种IP访问

    # proxy_list 代理列表 run_times = 100000 for i in range(run_times): for item in proxy_list: proxies = { ...

  2. 关于各种Formatting context

    Formatting context 我们把网页看作是由很多个盒子组成的,而这些盒子的展示方式,就是由display这个属性来决定的. 这里出现了一个概念,叫做Formatting context(格 ...

  3. Navicat Premium的数据传输功能----将远程Mysql数据库复制到本地数据库的方法

    1.先连上本地.远程的数据库 2.在本地建一个和你要复制的远程数据库的名称一样的数据库 3.数据转移.工具-->数据传输-->填写源数据库和目标数据库-->下一步-->开始 注 ...

  4. Java基础语法:包机制

    为了更好地组织类,Java 提供了包(package)机制. 这种机制是为了防止命名冲突,访问控制,提供搜索和定位类(class).接口(interface).枚举(enumerations)和注释( ...

  5. Markdown(2)基本语法

    ​ Markdown 是一种轻量级标记语言 , 通过简单的标记语法,使文本内容具有一定的格式 . 一.段落 1. 标题 语法格式: 符号 "#" 可以标记 1~6级标题.一级标题对 ...

  6. 公钥基础设施PKI利用SRAM物理不可克隆函数PUF实现芯片标识唯一性

    下面给出PKI利用SRAM PUF实现芯片标识唯一性的方法思路: PKI利用SRAM PUF实现芯片标识唯一性的方式 (1)使用PUF原因 物理上不可克隆函数利用硅制造的自然变化来产生每个芯片统计上唯 ...

  7. pytorch(04)简单的线性回归

    线性回归 线性回归是分析一个变量与另外一个变量之间关系的方法 因变量:y 自变量:x 关系:线性 y = wx+b 分析:求解w,b 求解步骤: 确定模型,Model:y = wx+b 选择损失函数, ...

  8. 靶场练习-Sqli-labs通关记录(1-4关)

                              0x00 实验环境 本地:Win 10 靶场:sqli-labs(共65关,每日一关) 0x02 通关记录 简介:一天一关! (1)第一关: 简单的 ...

  9. 使用当前主流的github管理项目代码(记我的第一次项目创建)

    先创建一个github的账号 网址:https://github.com/ 然后下载一个git工具并安装 网址:https://gitforwindows.org/ 下载安装注册完成后, 创建一个新的 ...

  10. 扫盲贴|如何评价一款App的稳定性和质量?

    作者:友盟+移动开发专家 张文 「崩溃」与「卡顿」.「异常退出」等一样,是影响App稳定性常见的三种情况.相关数据显示,当iOS的崩溃率超过0.8%,Android的崩溃率超过0.4%的时候,活跃用户 ...