2021.1.27 Обновить
Новая версия блога была дополнена большим количеством обновленного контента, поэтому был открыт новый блог,кликните сюда.
1 Обзор
Используйте Spring Boot в качестве серверной среды для взаимодействия с mysql на стороне Android для базового взаимодействия, включая самые основные функции добавления, удаления и изменения.
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 уже включает в себя «добавить» и «изменить», вы можете реализовать свою собственную «проверку» и «удаление» по мере необходимости. API CrudRepository очень прост,Официальная документация здесь.
- «Увеличить» использование
save
Вот и все, параметр — это класс сущности - "удалить" использовать
deleteById
, удалить через первичный ключ, если не хотите удалять через первичный ключ, можете написать свой sql, как выше - «проверить» использование
findAll
илиfindById
, если вы хотите настроить поиск, вам нужно написать свой собственный 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()
: возвращает все строки с одинаковым именем в соответствии с именем -
add
используется напрямуюsave
,из-заsave
Возвращается класс сущности, исходный код написан так:
return userRepository.save(user) != null;
Но в документации сказано, что оно не будет нулевым, поэтому его можно только заставить вернуть true.
-
modify
Используя id и имя в качестве параметров, создайте нового пользователя, используйте его в качестве параметра сеттера, а затем отдайте его для сохранения -
deleteByName
Используется пользовательская функция удаления, которая возвращает целое число. В UserRepository это целое число представляет количество строк, затронутых 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);
}
}
Контроллер - это в основном несколько аннотаций.За исключением того, что getAllUsers использует Get, другие используют Post.Другой параметр - это параметр пути, который можно установить непосредственно в пути. На этом бэкенд в основном закончен, а остальные операции по упаковке и развертыванию обсуждать не будем, можете сослаться на то, что вам нужно.здесь.
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();
Эти две строки можно использовать в потоке, отличном от пользовательского интерфейса.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, это не сложно.
4.5 UI
Пользовательский интерфейс не детализирован, всего несколько простых кнопок, подробности можно посмотреть в файле 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'
}
4.7 Сетевые разрешения
В предыдущей статье этого автора говорилось, что основнойAndroidManifest.xml
Настройки разрешений в ,посмотреть здесь.
5 тест
Исходная база данных:Зарегистрируйте:Взгляните на базу данных:Тестовый вход:Попробуйте войти в несуществующий:Исправлять: И, наконец, удалите: Удаление несуществующего не приведет к удалению.
6 Исходный код
Если вы считаете, что статья хорошая, ставьте лайк.
В то же время приглашаем обратить внимание на публичный аккаунт WeChat: Bingling Road.