创建你的SpringBoot项目
引入mybatis依赖
在pom.xml中添加需要的依赖
<!-- JDBC -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<!-- MySQL驱动 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<!--引入mybatis依赖-->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.0.1</version>
</dependency>
注意!!
mybatis和mybatis-spring-boot-starter是不同的两个包,版本也不一样,后者是mybatis专为springboot发布的,所以导入依赖时要注意版本问题!笔者出现过将mybatis版本号加在mybatis-spring-boot-starter版本号中导致无法找到依赖的情况!
application.properties
在application.properties中设置
server.port=8080
spring.datasource.url=jdbc:mysql://localhost:端口号/数据库名称?&useSSL=false&serverTimezone=UTC&characterEncoding=utf-8
spring.datasource.username=mysql账号名
spring.datasource.password=密码
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
mybatis.configuration.map-underscore-to-camel-case=true
笔者使用的是mysql数据库,配置文件为application.properties,当然也有使用application.yml的,推荐使用后者,更方便。
请不要直接复制,注意其中的中文部分,将它根据你的数据库设置进行修改。最后一行为开启驼峰映射,会消除相当一部分数据库名无法对应出现的错误,数据库中字段名和数据库名不建议使用大写,识别时容易出错。
在IDEA的数据库选项中连接自己的数据库,找到选定的表:
使用该脚本可以快速构建实体类,会直接在你选定的包下生成如下文件:
定义Mapper
package com.example.springdemo.mapper;
import com.example.springdemo.entity.User;
import org.apache.ibatis.annotations.*;
import org.springframework.stereotype.Component;
import java.util.List;
@Mapper
@Component
public interface UserMapper {
//查询所有记录
// @Select("select * from user")
List<User> getUsers();
//根据id删除某条记录
int deleteUsers(@Param("userId") long userId);
// 新增用户
boolean addUsers(User user);
//更新用户
boolean updateUsers(User user);
int addUsersByJson(User user);
}
在mapper中编辑好相应的函数后,需要在mapper.xml中写mysql数据,以前的写法中有把sql语句直接卸载mapper.java中,不建议这样写。
在resources文件夹下创建我们的mapper/UserMapper.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.example.springdemo.mapper.UserMapper">
<select id="getUsers" resultType="com.example.springdemo.entity.User">
select user_id,user_name,user_address,user_tel,case u.user_sex when '1' then '男' when '0' then
'女' else '未知'
end as user_sex from user u;
<!--userId,user_name,user_address,user_tel-->
</select>
<delete id="deleteUsers" >
delete from user where user_id =#{userId};
</delete>
<insert id="addUsers">
insert into user(user_name,user_address,user_tel,user_sex)value (#{userName},#{userAddress},#{userTel},#{userSex});
</insert>
<insert id="addUsersByJson" parameterType="com.example.springdemo.entity.User">
insert into user(user_name,user_address,user_tel,user_sex)value (#{userName},#{userAddress},#{userTel},#{userSex});
</insert>
<update id="updateUsers" parameterType="com.example.springdemo.entity.User">
update user set user_name=#{userName},user_address=#{userAddress},user_tel=#{userTel},user_sex=#{userSex} where user_id=#{userId};
</update>
</mapper>
namespace是我们的UserMapper.java所在的位置,需要有返回User对象的方法中parameterType是我们脚本生成的实体类所在位置,sql语句不再赘述,其中查询所有的语句增加了性别设置0/1显示女/男的语法。
实体类中类别修改成了String,数据库中为tinyint,因为想要显示男女,需要字符串类型,原来的tinyint映射的类型会报错。实体类中类型和数据库类型不完全一致没有关系,字段能对应就可以。
addUsersByJson新增方法是使用json类型数据传参。
mapper写完了之后需要写Service。
定义Service
package com.example.springdemo.service;
import com.example.springdemo.entity.User;
import org.springframework.stereotype.Component;
import org.springframework.stereotype.Service;
import java.util.List;
@Service
@Component
public interface UserService {
List<User> getUsers();
int deleteUsers(long userId);
boolean addUsers(User user);
boolean updateUsers(User user);
String addUsersByJson(User user);
}
UserService并不直接声明方法,需要另一个文件来声明
package com.example.springdemo.service.impl;
import com.example.springdemo.entity.User;
import com.example.springdemo.mapper.UserMapper;
import com.example.springdemo.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
@Service
public class UserServiceImpl implements UserService {
@Autowired
private UserMapper userMapper;
@Override
public List<User> getUsers() {
return userMapper.getUsers();
}
@Override
public int deleteUsers(long userId) {
int i=userMapper.deleteUsers(userId);
if(i>0){
return 200;
//删除成功
}else{
return 500;
//删除失败
}
}
@Override
public boolean addUsers(User user){
return userMapper.addUsers(user);
}
@Override
public boolean updateUsers(User user) {
return userMapper.updateUsers(user);
}
@Override
public String addUsersByJson(User user) {
int i=userMapper.addUsersByJson(user);
if(i>0){
String s="新增成功,增加了"+i+"条数据";
return s;
}else{
return "新增失败";
}
}
}
这里声明的是UserService的方法,本文加了一些判断和返回语句,这些判断语句可以加在mapper或service中,再往后一个模块不适合加了。
定义Controller
package com.example.springdemo.controller;
import com.example.springdemo.entity.User;
import com.example.springdemo.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.util.List;
@RestController
public class UserController {
@Autowired
private UserService userService;
@GetMapping("/users")
public List<User> getUsers() {
return userService.getUsers();
}
@PostMapping("/deleteUser")
public int deleteUsers(long userId) {
int msg=userService.deleteUsers(userId);
return msg;
}
@PostMapping("/addUser")
public boolean addUsers(User user){
return userService.addUsers(user);
}
@PostMapping("/updateUser")
public boolean updateUsers(User user){
return userService.updateUsers(user);
}
@RequestMapping("/addUserByJson")
public String addUsersByJson(@RequestBody User user){
System.out.println(user.toString());
return userService.addUsersByJson(user);
}
}
如果对注解的含义不太懂,可以去搜一下SpringBoot常用注解。这里这只说明一件事,不需要传参的方法一般用@GetMapping,需要传参的比较常用的是@PostMapping。用错注解可能会导致报错。
使用方式:
localhost:端口号/users
就可以调用getUsers()方法,以此类推。
总结
我们可以看到一条有序的线,mapper—service—controller。
mapper定义的方法和语句,被service引用。同样的,controller也引用了service的方法。
写本文的主要目的是记录自己学习的过程,以及为和我一样的萌新小白提供一些小小的帮助,所以有些地方讲的比较口语化,还望海涵。