Spring Boot 七步走。
Spring Boot是自带TomCat的。
创建Spring Boot工程文件,创建时需要更改资源下载地址,我选择阿里云的这个地址;
而且Spring Boot不需要导包,只需要勾选需要的包,进入后会自动下载(不过第一次非常非常慢!请耐心等待)。常用的需要勾选的包如下
spring:
application:
name: myspb2
datasource:
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql://192.168.133.150:3306/mydemo
username: root
password: ok
server:
port: 9988
mybatis:
mapper-locations: classpath:mapper/*.xml
config-location: classpath:mybatis.cfg.xml
思路:本次需要用到两表关联查询、动态sql查询,所以建立对应着两张表的两个实体类、两个接口类、两个配置文件。
注:两张表提前已经建立了主外键关系,后面不再赘言。
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class Userinfos {
private long userid;
private Date birthday;
private String username;
private List scores;//这是为了后面查询一个用户信息就能带出分数
}
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class Scores {
private long scid;
private long userid;
private long score;
}
对每个表有几种操作方法(增删改查),每一个方法对应一个配置文件中的sql语句
public interface UserinfosMapper {
public void addUser(Userinfos user);
public void deleteUser(long userid);
public List findUserByCondit(Userinfos user);//按条件查
}
public interface ScoresMapper {
public List findScoreByUserid(long userid);//查
public void deleteScoreByUserid(long userid);//删
public void modfiyScore(Scores scores);//改
public void addScore(Scores scores);//增
}
从上到下依次是查、增、删、改的sql语句。
为了防止输入错误,文件中的方法名可以复制粘贴。因为上面已经给实体类起过别名了,所以部分方法的属性值/返回值只需要写别名"score"(下面的"user"同理)
insert into scores (userid,score) values (#{userid},#{score})
delete from scores where userid=#{userid}
update scores set score=#{score} where userid=#{userid}
从上到下是增、删、查方法。
查询方法在这里用到了关联查询和动态sql查询:
(1)关联查询:为了让查询用户的结果带上分数表的对应信息,返回值选用resultMap,返回一个名为“user_score”的东西,以“userid”关联到分数表。
(2)动态sql查询:若想查询一个表的所有列很简单,若想按某列为条件查询也很简单,但想要做到任意列为条件排列组合查询就需要写非常多条sql语句(如果一个表有4列,那么条件查询方式就会有16种,也就是需要写16条sql语句才能实现)。动态sql就是简化了这一过程,一个
insert into userinfos (username,birthday) values(#{username},#{birthday})
delete from userinfos where userid=#{userid}
增(因为存在主外键,所以增加数据需要传两个参数)、删、改、查的方法。
public interface UserinfosService {
public void addUserinfo(Userinfos user , Scores scores);
public void delUserById(long userid);
public void modifyScores(Scores scores);
public List searchUser(Userinfos user);
}
检索两表对应的dao接口,并调用他们的增删改查方法,合并。
@Service
@Transactional//Spring自动提交事务
public class UserServiceImpl implements UserinfosService {
@Resource//自动搜索及注入接口
private UserinfosMapper userinfosMapper;
@Resource
private ScoresMapper scoresMapper;
@Override
public void addUserinfo(Userinfos user, Scores scores) {
userinfosMapper.addUser(user);
scores.setUserid(user.getUserid());//把主表中的主键拿出来填充到外表的外键列(如画图所讲)
scoresMapper.addScore(scores);
}
@Override
public void delUserById(long userid) {
//先删从表再删主表
scoresMapper.deleteScoreByUserid(userid);
userinfosMapper.deleteUser(userid);
}
@Override
public void modifyScores(Scores scores) {
scoresMapper.modfiyScore(scores);
}
@Override
public List searchUser(Userinfos user) {
return userinfosMapper.findUserByCondit(user);
}
}
@RestController
public class InitCtrl {
@Resource
private UserinfosService userinfosService;
@RequestMapping("/add")
public String add(String username,String birthday,long score){
try {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
Userinfos us = Userinfos.builder().username(username).birthday(sdf.parse(birthday)).build();
Scores scores = Scores.builder().score(score).build();
userinfosService.addUserinfo(us,scores);
} catch (ParseException e) {
e.printStackTrace();
}
return "ok";
}
@RequestMapping("/del")
public String del(long userid){
userinfosService.delUserById(userid);
return "ok";
}
@RequestMapping("/update")
public String update(long userid,long score){
Scores scores = Scores.builder().userid(userid).score(score).build();
userinfosService.modifyScores(scores);
return "ok";
}
@RequestMapping("/find")
public List find(
@RequestParam(required = false,defaultValue = "0")long userid,
@RequestParam(required = false,defaultValue = "") String username,
@RequestParam(required = false,defaultValue = "") String birthday){
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
Userinfos userinfos = new Userinfos();
userinfos.setUserid(userid);
if(!username.trim().equals("")){
userinfos.setUsername(username);
}
try {
if (!birthday.trim().equals("")){
userinfos.setBirthday(sdf.parse(birthday));
}
} catch (ParseException e) {
e.printStackTrace();
}
return userinfosService.searchUser(userinfos);
}
}
最后别忘了@MapperScan,把dao包也给Spring看一下。然后就可以运行这个main方法了。
localhost:9988(你写的端口号是多少就是多少)/update?(想用哪个方法就写哪个注释)userid=1(这个方法有几个参数就写几个参数,之间用&连接)&score=80
除了查询方法,其他方法执行后若返回“ok”,查看数据库是否已经完成了操作,如果已经完成那就成功了。