注解
主启动类:
@SpringBootApplication
注解一般放在项目的一个启动类上,用来把启动类注入到容器中,用来定义容器扫描的范围,用来加载classpath环境中一些bean。
实体类:
@Data 注解在类的上面
添加@Data注解可以不用书写 getter,setter方法, toString方法 hashCode方法 equals方法
@AllArgsConstructor
会生成一个包含所有变量,同时如果变量使用了NotNull annotation , 会进行是否为空的校验, 全部参数的构造函数的自动生成,该注解的作用域也是只有在实体类上,参数的顺序与属性定义的顺序一致。
@NoArgsConstructor
无参构造函数
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Person {
private String name;
private String address;
private Integer age;
private String hobbit;
private String phone;
}
数据交互层:
@Repository:
对应持久层即Mapper层,主要用于数据库交互操作
@Mapper
目的就是为了不再写mapper映射文件,是注解开发时用的。与如下一起使用
@Insert("insert into sysuser values('e212te','2','jjj','pwd','ljk','男',1)")
@select("select * from sysuser where userid=#{id}")
@select("select * from sysuser where userid=#{id} and uanme=#{uname}")
@Select("select * from sysuser where userid=#{userid} or username=#{username}")
@Repository // 也可以使用@Component,效果都是一样的,只是为了声明为bean
@Mapper
public interface UserDao {
@Insert("insert into user(account, password, user_name) " +
"values(#{user.account}, #{user.password}, #{user.name})")
int insertUser(@Param("user") User user) throws RuntimeException;
}
业务逻辑层:
@Service放业务层实现类上边,注入容器,由Spring管理
@Resource/@Autowired 从spring中拿出,注入到类里
@override
验证下面的方法名是否是你父类中所有的,如果没有则报错
@Slf4j
用作日志输出的,一般会在项目每个类的开头加入该注解,如果不写下面这段代码, private final Logger logger = LoggerFactory.getLogger(当前类名.class);可以直接用下面
log.info("进入账单查询接口");
表示层(控制层)
@Controller
告诉Spring这个类作为控制器,可以看做标记为暴露给前端的入口
@RestController=@ Controller and @ ResponseBody(作用是将控制器的方法返回的对象通过适当的转换器转换为指定的格式之后,写入到Response对象的body区)
@Param( )
对某个函数的参数的各项说明,包括参数名、参数数据类型、描述等
http请求类型:
@PostMapping( )
HTTP POST 请求映射到特定的处理程序方法,作@RequestMapping(method = RequestMethod.POST)的快捷方式。
@GetMapping( )
作@RequestMapping(method = RequestMethod.GET)的快捷方式。
@PutMapping("/users/{userId}")
=@RequestMapping(value="/users/{userId}",method=RequestMethod.PUT)
@DeleteMapping("/users/{userId}")
=@RequestMapping(value="/users/{userId}",method=RequestMethod.DELETE)
@PatchMapping("/profile")
前后端传值:
@PathVariable
用于获取路径参数
@RequestParam
用于获取查询参数
@GetMapping("/klasses/{klassId}/teachers")
public List<Teacher> getKlassRelatedTeachers(
//路径参数
@PathVariable("classId") Long classId,
//查询参数
@RequestParam(value = "type", required = false) String type ) {
...
}
@RequestBody
用于读取 Request 请求(可能是 POST,PUT,DELETE,GET 请求)的 body 部分并且Content-Type 为 application/json 格式的数据,接收到数据之后会自动将数据绑定到 Java 对象上去。
关联查询sql语句
-
外连接
外连接相当于求集合的和(union)
(1)左连接(右)LEFT(RIGHT) JOIN或LEFT(RIGHT) OUTER JOIN
以左表(右)为准,也就是left join左边的表,根据相关联字段进行匹配。若另一表找不到与其匹配的内容,则在另一表中记为Null
select money.realName, money.money,user.id, user.userName from user left join money on user.realName=money.realName
select money.realName, money.money,user.id, user.userName from user right outer join money on user.realName=money.realName
(2)完全连接(MySQL中不支持,要分成左右来写。) FULL JOIN 或 FULL OUTER JOIN
两个表中匹配的所有行记录,左表中那些在右表中找不到匹配的行的记录,这些记录的右边全为null,右表中那些在左表中找不到四配的行的记录,这些记录的左边全为null
select money.realName, money.money,user.id, user.userName from user left join money on user.realName=money.realName
UNION ALL
select money.realName, money.money,user.id, user.userName from user right join money on user.realName=money.realName
-
交叉连接
SELECT money.realName, money.money,user.id, user.userName from user cross join money where user.realName=money .realName
SELECT <字段名> FROM <表1> CROSS JOIN <表2> [WHERE子句] 官方写法
中间CROSS JOIN可以不写,与普通查询无差别。
多表是重复CROSS JOIN或","。
当连接的表之间没有关系时,我们会省略掉 WHERE 子句,这时返回结果就是两个表的笛卡尔积。在交叉连接时使用 WHERE 子句时,MySQL 会先生成两个表的笛卡尔积,然后再选择满足 WHERE 条件的记录。因此,表的数量较多时,交叉连接会非常非常慢。一般情况下不建议使用交叉连接。
-
内连接 join=inner join
内连接相当于求集合的积(intersect),只查询在连接的表中能够有对应的记录
结果集是两个表中所有相匹配的数据,而舍弃不匹配的数据
select money.realName, money.money,user.id, user.userName from user inner join money on user.realName=money.realName
(1)等值连接
使用等于号(=)比较被连接列的列值,在查询结果中列出被连接表中的所有列,包括其中的重复列。
(2)不等连接
在连接条件中,可以使用其他比较运算符,比较被连接的列的列值。这些运算符包括>、>=、<=、<、!>、!<和<>。
select money.realName, money.money,user.id, user.userName from user inner join money on user.realName<>money.realName
4.UNION JOIN联合连接
Oracle、MySQL均不支持
子查询
是一种嵌套在其他 SQL 查询的 WHERE 子句中的查询。
子查询用于为主查询返回其所需数据,或者对检索数据进行进一步的限制。
子查询可以在 SELECT、INSERT、UPDATE 和 DELETE 语句中,同 =、<、>、>=、<=、IN、BETWEEN 等运算符一起使用。
使用子查询必须遵循以下几个规则:
-
子查询必须括在圆括号中。
-
子查询的 SELECT 子句中只能有一个列,除非主查询中有多个列,用于与子查询选中的列相比较。
-
子查询不能使用 ORDER BY,不过主查询可以。在子查询中,GROUP BY 可以起到同 ORDER BY 相同的作用。
-
返回多行数据的子查询只能同多值操作符一起使用,比如 IN 操作符。
-
SELECT 列表中不能包含任何对 BLOB、ARRAY、CLOB 或者 NCLOB 类型值的引用。
-
子查询不能直接用在聚合函数中。
-
BETWEEN 操作符不能同子查询一起使用,但是 BETWEEN 操作符可以用在子查询中。
select:
select user.id, user.realname from user where realName in(select realName from money where money.money>=5000)
insert:
将 一 表中所有的数据复制到另一表中
INSERT INTO CUSTOMERS_BKP
SELECT * FROM CUSTOMERS
WHERE ID IN (SELECT ID
FROM CUSTOMERS) ;
update:
UPDATE CUSTOMERS
SET SALARY = SALARY * 0.25
WHERE AGE IN (SELECT AGE FROM CUSTOMERS_BKP
WHERE AGE >= 27 );
注:
会检查两个表中是否相同名称的列,且假设他们在连接条件中使用,并且在连接条件中仅包含一个连接列。不允许使用ON语句,不允许指定显示列,显示列只能用*表示(ORACLE环境下测试的)。对于每种连接类型(除了交叉连接外),均可指定NATURAL。
MyBatis的常用注解
@Insert:实现新增
@Update:实现更新
@Delete:实现删除
@Select:实现查询
@Result:实现结果集封装
@Results:可以与@Result 一起使用,封装多个结果集
@Results(id = "empMap", //结果集合名
value = { //结果字段
@Result(column = "emp_id",property = "empId",id = true),
@Result(column = "emp_name",property = "empName"),
@Result(column = "emp_tel",property = "empTel"),
@Result(column = "emp_education",property = "empEducation"),
@Result(column = "emp_birthday",property = "empBirthday"),
@Result(column = "fk_dept_id",property = "dept",one = @One(select = "com.yingside.dao.DeptMapper.getById",
fetchType = FetchType.LAZY))
@ResultMap(value="empMap")
@One:实现一对一结果集封装
@Many:实现一对多结果集封装
@ResultMap: 引用结果集合
@SelectKey: 获取最新插入ID
@Param: 入参
int deleteByPrimaryKey(@Param("empId") Integer empId);
@SelectProvider @InsertProvider @DeleteProvider @UpdateProvider
定义功能类并提供获取查询....的 SQL 语句的方法。
生成查询....用的 SQL 语句注解。
type 属性:生成 SQL 语句功能类对象
method 属性:指定调用方法
MySQL批量操作
修改
UPDATE user
SET id = (CASE id
WHEN 123 THEN 1
WHEN 124 THEN 2
WHEN 125 THEN 3
END),
title = (CASE id
WHEN 1 THEN 'New Title 1'
WHEN 2 THEN 'New Title 2'
WHEN 3 THEN 'New Title 3'
END)
WHERE id IN (1,2,3)
新增: 比values快
INSERT INTO tb_test(ID,NAME)
SELECT 4,'zhangsan'
UNION ALL
SELECT 5,'lisi'
UNION ALL
SELECT 6,'wangwu' ;
mybatis批量操作
批量新增
常用:
<insert id="batchSave" parameterType="java.util.List">
INSERT INTO lp_user_test_batch
(
id,
user_id,
user_name,
user_age,
type,
create_time,
update_time
)
VALUES
<foreach collection="list" item="item" index="index" separator=",">
(
#{item.id,jdbcType=BIGINT},
#{item.userId,jdbcType=VARCHAR},
#{item.userName,jdbcType=VARCHAR},
#{item.userAge,jdbcType=INTEGER},
#{item.type,jdbcType=INTEGER},
#{item.createTime,jdbcType=TIMESTAMP},
#{item.updateTime,jdbcType=TIMESTAMP}
)
</foreach>
</insert>
批量新增或更新方式
注:需要给唯一主键添加唯一索引,update才会生效
<!-- 批量新增或更新-->
<insert id="batchSaveOrUpdate" parameterType="java.util.List">
INSERT INTO lp_user_test_batch
(
id,
user_id,
user_name,
user_age,
type,
create_time,
update_time
)
VALUES
<foreach collection="list" item="item" index="index" separator=",">
(
#{item.id,jdbcType=BIGINT},
#{item.userId,jdbcType=VARCHAR},
#{item.userName,jdbcType=VARCHAR},
#{item.userAge,jdbcType=INTEGER},
#{item.type,jdbcType=INTEGER},
#{item.createTime,jdbcType=TIMESTAMP},
#{item.updateTime,jdbcType=TIMESTAMP}
)
</foreach>
ON DUPLICATE KEY UPDATE
user_name = VALUES(user_name),
user_age = VALUES(user_age),
type = VALUES(type),
update_time = VALUES(update_time)
</insert>