Java Maven:spring boot + Mybatis连接MySQL,通用mapper的增删改查,映射实现多表查询
1. MySQL自带库test添加表user、role
角色表role
用户表user
2. 添加依赖,配置属性
相关依赖:百度即可,此处略
application.properties
spring.application.name=clean-exe
server.port=8845
server.main.class=com.cdqd.app.main.Application
eureka.client.serviceUrl.defaultZone=http://192.168.3.231:8765/eureka/,http://192.168.3.232:8765/eureka/
logging.config=classpath:logback.xml
#测试数据库
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/test
spring.datasource.username=root
spring.datasource.password=password
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
#mybatis&&通用Mapper
mybatis.type-aliases-package=com.cdqd.app.bean
mybatis.mapper-locations=classpath:mapper/*.xml
mapper.mappers=com.cdqd.app.common.TkMapper
mapper.identity=MYSQL
mapper.not-empty=false
- server.port为访问端口,访问方式为:localhost:[server.port]/[控制器名]
- spring.datasource.url后需要添加两个属性,不然会发出警告
3.新建实体类User,Role,UserRole(省略getter、setter)
user.java
import java.util.Date;
import javax.persistence.Column;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;
@Table(name = "user")
public class User {
//自增ID属性
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer id;
//名称
@Column(name = "name")
private String name;
//年龄
@Column(name = "age")
private Integer age;
//身份编号
@Column(name = "card_no")
private Integer cardNo;
//生日
@Column(name = "birthday")
private Date birthday;
//角色id
@Column(name = "r_id")
private int rId;
}
UserRole.java
import com.cdqd.app.bean.User;
public class UserRole extends User {
private int roleId;
private String roleName;
private int atk;
private int armor;
private int penetrate;
}
- Role.java省略,修改后貌似不需要此实体类
4. 通用mapper实现user表的增删改查
(1). 写一个自己的接口继承通用mapper,此接口不能被扫描到
import tk.mybatis.mapper.common.Mapper;
import tk.mybatis.mapper.common.MySqlMapper;
public interface TkMapper<T> extends Mapper<T>, MySqlMapper<T> {
}
(2). 添加UserMapper继承之前写的mapper,用于自己使用
import com.cdqd.app.entity.UserRole;
import com.cdqd.app.bean.User;
import com.cdqd.app.common.TkMapper;
import java.util.List;
public interface UserMapper extends TkMapper<User> {
List<UserRole> getUserRoleByUserId(int id);
}
- 注:此mapper需要被扫描到
- getUserRoleByUserId用于映射多表查询,使用映射文件操作流程为:
- controller调用service,service调用mapper
(3). 编写controller
SqlTestController.java
import com.cdqd.app.bean.User;
import com.cdqd.app.entity.UserRole;
import com.cdqd.app.mapper.UserMapper;
import com.cdqd.app.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.List;
@RestController
public class SqlTestController {
//自动注入,一般放在顶部
@Autowired
UserMapper userMapper;
@Autowired
private UserService userService;
//测试controller用
@PostMapping("/hello")
public String hello(String yourName) {
return "Hello," + yourName;
}
//根据cardNo查询一条数据
//只能用于主键查找,不用于主键的查找没试过
//Get请求,查找user信息
@GetMapping("/select_user_info/{id}")
public Object searchOneDataByCardNo(@PathVariable int id) {
User user = new User();
user.setId(id);
List<User> list = userMapper.select(user);
return list;
//return selsetOne.toString();
}
//根据id查询user表和role表
@RequestMapping("/select/{id}")
public Object searchUserAndRoleById(@PathVariable int id){
List<UserRole> listUser =userService.getUserRoleByUserId(id);
return listUser;
}
//插入一条数据
@PostMapping("/insert")
public String insertOneDate(@RequestParam String name,
@RequestParam String age,
@RequestParam String cardNo,
@RequestParam String sDate,
@RequestParam int roleId) {
try {
User user = new User();
user.setName(name);
user.setAge(Integer.parseInt(age));
user.setCardNo(Integer.parseInt(cardNo));
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
user.setBirthday(sdf.parse(sDate));
user.setrId(roleId);
userMapper.insertSelective(user);
return "插入数据成功:" + user.toString();
} catch (ParseException e) {
e.printStackTrace();
return "ERROR!";
}
}
//用姓名删除数据
@PostMapping("/deleteByName")
public String deleteByName(String name) {
User user = new User();
user.setName(name);
userMapper.delete(user);
return "删除成功";
}
//按主键删除
@PostMapping("/deleteById")
public String deleteById(String id) {
userMapper.deleteByPrimaryKey(Integer.parseInt(id));
return "删除成功";
}
//更新数据
@PostMapping("/updateById")
public String updateById(@RequestParam String id,
@RequestParam String name,
@RequestParam int age,
@RequestParam int cardNo,
@RequestParam String sDate,
@RequestParam int roleId) {
try {
User user = new User();
user.setId(Integer.parseInt(id));
user.setName(name);
user.setAge(age);
user.setCardNo(cardNo);
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
user.setBirthday(sdf.parse(sDate));
user.setrId(roleId);
userMapper.updateByPrimaryKeySelective(user);
return "更新完成:" + user.toString();
} catch (ParseException e) {
e.printStackTrace();
return "ERROR!";
}
}
}
- 第一次边学边用所写,最好用Json返回数据,传入参数过多同样推荐使用Json,而不是String,List等;
- controller里最好不要用try/catch,try/catch在不知道会出现什么异常时使用较为适宜,而在controller中大概了解会出现那个类型的异常;
- 增删改时推荐使用post请求(PostMapping),查询时推荐使用get请求(GetMapping),区别如下:
GET和POST两种基本请求方法的区别(他讲的比我讲的有趣) - PS:命名不规范,不要学我。
5. 映射文件实现多表查询
(1). service
UserService.java
import com.cdqd.app.entity.UserRole;
import java.util.List;
public interface UserService {
List<UserRole> getUserRoleByUserId(int id);
}
service访问接口
UserServiceImpl.java
package com.cdqd.app.service;
import com.cdqd.app.entity.UserRole;
import com.cdqd.app.mapper.UserMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
@Service
public class UserServiceImpl implements UserService {
@Autowired
UserMapper userMapper;
@Override
public List<UserRole> getUserRoleByUserId(int id) {
return userMapper.getUserRoleByUserId(id);
}
}
- service调用mapper实现功能
(2). mapper映射文件
userRoleMapper.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.cdqd.app.mapper.UserMapper">
<resultMap id="UserResultMap" type="com.cdqd.app.entity.UserRole">
<id column="id" property="id" jdbcType="INTEGER"/>
<result column="role_id" property="roleId" jdbcType="INTEGER"/>
<result column="role_name" property="roleName" jdbcType="VARCHAR"/>
<result column="atk" property="atk" jdbcType="INTEGER"/>
<result column="armor" property="armor" jdbcType="INTEGER"/>
<result column="penetrate" property="penetrate" jdbcType="INTEGER"/>
<result column="name" property="name" jdbcType="VARCHAR"/>
<result column="age" property="age" jdbcType="INTEGER"/>
<result column="card_no" property="cardNo" jdbcType="INTEGER"/>
<result column="birthday" property="birthday" jdbcType="DATE"/>
<result column="r_id" property="rId" jdbcType="INTEGER"/>
</resultMap>
<!--查询-->
<select id="getUserRoleByUserId" parameterType="java.lang.Integer" resultMap="UserResultMap">
select
u.*,
r.role_id as role_id,
r.role_name as role_name,
r.atk as atk,
r.armor as armor,
r.penetrate as penetrate
from user u,role r
<where>
u.r_id = r.role_id
and u.id = #{id,jdbcType=INTEGER}
</where>
</select>
</mapper>
- mapper:namespace填写所对应的mapper路径
- resultMap:id为唯一主键;column(列) 为数据库中列名,property(属性)为Java实体类中属性名
- select:id的值为对应mapper的对应方法名;parameterType参数类型;resultMap和上面相结合操作需要的数据
6.程序入口
Application.java
import com.cdqd.app.common.WebUtils;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import tk.mybatis.spring.annotation.MapperScan;
import javax.servlet.http.HttpServletRequest;
@SpringBootApplication
@EnableEurekaClient
@RestController
@MapperScan("com.cdqd.app.mapper" )
@ComponentScan(basePackages="com.cdqd.app")
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
- MapperScan用于扫描mapper,此处填了UserMapper所在包名
- 在浏览器填写对应的url进行访问测试,推荐使用postman,传参较为方便
Java Maven:spring boot + Mybatis连接MySQL,通用mapper的增删改查,映射实现多表查询的更多相关文章
- Spring boot+mybatis+thymeleaf 实现登录注册,增删改查
本文重在实现理解,过滤器,业务,逻辑需求,样式请无视.. 项目结构如下 1.idea新建Spring boot项目,在pom中加上thymeleaf和mybatis支持.pom.xml代码如下 < ...
- (45). Spring Boot MyBatis连接Mysql数据库【从零开始学Spring Boot】
大家在开发的时候,会喜欢jdbcTemplate操作数据库,有喜欢JPA操作数据库的,有喜欢MyBatis操作数据库的,对于这些我个人觉得哪个使用顺手就使用哪个就好了,并没有一定要使用哪个,个人在实际 ...
- ssm框架(Spring Springmvc Mybatis框架)整合及案例增删改查
三大框架介绍 ssm框架是由Spring springmvc和Mybatis共同组成的框架.Spring和Springmvc都是spring公司开发的,因此他们之间不需要整合.也可以说是无缝整合.my ...
- 【Python + Mysql】之用pymysql库连接Mysql数据库并进行增删改查操作
用pip下载pymysql并引用 具体请参考文章: <Python之MySQL数据库增删改查操作> <python3.6 使用 pymysql 连接 Mysql 数据库及 简单的增删 ...
- 通用mapper的增删改查方法 留存 备忘
Mybatis通用Mapper介绍与使用 前言 使用Mybatis的开发者,大多数都会遇到一个问题,就是要写大量的SQL在xml文件中,除了特殊的业务逻辑SQL之外,还有大量结构类似的增删改查SQ ...
- Spring boot +mybatis 连接mysql数据库,获取JDBC失败,服务器时区价值”Oйu±e×¼e±¼的识别或代表多个时区
报出的错误 Cause: org.springframework.jdbc.CannotGetJdbcConnectionException: Failed to obtain JDBC Connec ...
- java连接mysql数据库 三 实现增删改查操作
同以前一样,先写一个数据库打开和关闭操作类 public class DBConnection { String driver = "com.mysql.jdbc.Driver"; ...
- MyBatis初级实战之二:增删改查
欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...
- Mybatis实现简单的CRUD(增删改查)原理及实例分析
Mybatis实现简单的CRUD(增删改查) 用到的数据库: CREATE DATABASE `mybatis`; USE `mybatis`; DROP TABLE IF EXISTS `user` ...
随机推荐
- 2015.07.15——prime素数
prime素数 1.素数也叫质数,定义是一个数只能被1和它自身整除. 素数从2开始,0,1都不是素数. 2.素数的判断(C++) 3.给定某个数,求小于这个数的所有素数 2.素数的判断(C++) bo ...
- PCA主成分分析理解
一.理论概述 1)问题引出 先看如下几张图: 从上述图中可以看出,如果将3个图的数据点投影到x1轴上,图1的数据离散度最高,图3其次,图2最小.数据离散性越大,代表数据在所投影的维度上具有越高的区分度 ...
- Hibernate5笔记6--Hibernate检索优化
Hibernate检索优化: 检索即查询.为了减轻DB的访问压力,提高检索效率,Hibernate对检索进行了优化. 所谓检索优化,指的是对查询语句的执行时机进行了细致.严格的把控:并不是代码中一出现 ...
- 修复TortoiseGit文件夹和文件图标不显示问题的多种解决办法以及重启之后TortoiseGit图标注册表又不见了的解决办法
一 首先进行第一种尝试 打开 regedit.exe ,准备修改注册表 找到 HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\ ...
- python3之pymysql模块
1.python3 MySQL数据库链接模块 PyMySQL 是在 Python3.x 版本中用于连接 MySQL 服务器的一个库,Python2中则使用mysqldb. PyMySQL 遵循 Pyt ...
- aarch64_l4
livestreamer-1.12.2-7.fc26.noarch.rpm 2017-02-11 17:38 537K fedora Mirroring Project lizardfs-adm-3. ...
- Django-模板语言和过滤器
Django模板语言 首先模板只是一个文本文件,它可以生成任何基于文本的格式(HTML.XML.CSS等),模板中包含变量,在模板被渲染的时候替换为最终的值,以及控制模板逻辑的标签. 变量使用{{ 变 ...
- Python-Web框架的本质
Web框架的本质 我们可以这样理解:所有的Web应用本质上就是一个socket服务端,而用户的浏览器就是一个socket客户端. 这样我们就可以自己实现Web框架了. Python中使用socket和 ...
- 正则表达式基础->
描述:(grep) 正则表达式是一种字符模式,用于在查找过程中匹配指定的字符.在大多数程序里,正则表达式都被置于两个正斜杠之间,它匹配被查找的行中任何位置出现的相同模式 基础正则表达式 正则表达式 描 ...
- Session和Cookie,Django的自动登录机制
什么是Cookie? Cookie是浏览器的本地存储机制,存储服务器返回的各种信息,下次发起请求时再发送给服务端,比如访问baidu 什么是Session? 刚才说道,Cookie存储服务端返回的信息 ...