Spring Boot 七步走。
1.勾选包
Spring Boot是自带TomCat的。
创建Spring Boot工程文件,创建时需要更改资源下载地址,我选择阿里云的这个地址;
而且Spring Boot不需要导包,只需要勾选需要的包,进入后会自动下载(不过第一次非常非常慢!请耐心等待)。常用的需要勾选的包如下
2.修改原始配置文件
2.1.修改spring-boot版本为2.2.6。
2.2.修改mysql版本为5.1.38。
2.3.将lombok下面的“true”那一行删掉。
2.4.将原有的application配置文件改为.yml后缀。
2.5.注意:后面的java文件全部都要写在自动生成的“项目名+Application”类的下一级,否则不能被读到。
2.6.application.yml配置文件内容
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
3.实体类及配置文件
思路:本次需要用到两表关联查询、动态sql查询,所以建立对应着两张表的两个实体类、两个接口类、两个配置文件。
注:两张表提前已经建立了主外键关系,后面不再赘言。
3.1.实体类1:
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class Userinfos {
private long userid;
private Date birthday;
private String username;
private List<Scores> scores;//这是为了后面查询一个用户信息就能带出分数
}
3.2.实体类2:
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class Scores {
private long scid;
private long userid;
private long score;
}
4.接口dao类
对每个表有几种操作方法(增删改查),每一个方法对应一个配置文件中的sql语句
4.1.用户表对应dao接口类
public interface UserinfosMapper {
public void addUser(Userinfos user);
public void deleteUser(long userid);
public List<Userinfos> findUserByCondit(Userinfos user);//按条件查
}
4.2.分数表对应dao接口类
public interface ScoresMapper {
public List<Scores> findScoreByUserid(long userid);//查
public void deleteScoreByUserid(long userid);//删
public void modfiyScore(Scores scores);//改
public void addScore(Scores scores);//增
}
5.配置文件
5.1.用mybatis.cfg.xml配置文件给实体类起别名,方便后续使用
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration PUBLIC
"-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<typeAliases>
<typeAlias type="com.kgc.myspb2.domain.Userinfos" alias="user"></typeAlias>
<typeAlias type="com.kgc.myspb2.domain.Scores" alias="score"></typeAlias>
</typeAliases>
</configuration>
5.2.分数表对应的配置文件
从上到下依次是查、增、删、改的sql语句。
为了防止输入错误,文件中的方法名可以复制粘贴。因为上面已经给实体类起过别名了,所以部分方法的属性值/返回值只需要写别名"score"(下面的"user"同理)
<?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.kgc.myspb2.dao.ScoresMapper">
<select id="findScoreByUserid" parameterType="long" resultType="score">
select * from scores where userid=#{userid}
</select>
<insert id="addScore" parameterType="score">
insert into scores (userid,score) values (#{userid},#{score})
</insert>
<delete id="deleteScoreByUserid" parameterType="long">
delete from scores where userid=#{userid}
</delete>
<update id="modfiyScore" parameterType="score">
update scores set score=#{score} where userid=#{userid}
</update>
</mapper>
5.3.用户表对应配置文件
从上到下是增、删、查方法。
查询方法在这里用到了关联查询和动态sql查询:
(1)关联查询:为了让查询用户的结果带上分数表的对应信息,返回值选用resultMap,返回一个名为“user_score”的东西,以“userid”关联到分数表。
(2)动态sql查询:若想查询一个表的所有列很简单,若想按某列为条件查询也很简单,但想要做到任意列为条件排列组合查询就需要写非常多条sql语句(如果一个表有4列,那么条件查询方式就会有16种,也就是需要写16条sql语句才能实现)。动态sql就是简化了这一过程,一个<where>标签中每个<if>标签下的语句都以and连接,如果检索存在就组合语句,如果不存在就当这个条件语句也不存在。
<?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.kgc.myspb2.dao.UserinfosMapper">
<resultMap id="user_score" type="user">
<result property="userid" column="userid"></result>
<collection property="scores" column="userid"
select="com.kgc.myspb2.dao.ScoresMapper.findScoreByUserid"></collection>
</resultMap>
<insert id="addUser" parameterType="user" useGeneratedKeys="true" keyProperty="userid">
insert into userinfos (username,birthday) values(#{username},#{birthday})
</insert>
<delete id="deleteUser" parameterType="long">
delete from userinfos where userid=#{userid}
</delete>
<select id="findUserByCondit" parameterType="long" resultMap="user_score">
select * from userinfos
<where>
<if test="userid!=0">
userid=#{userid}
</if>
<if test="username!=null">
and username=#{username}
</if>
<if test="birthday!=null">
and date_format(birthday,'%Y-%m-%d')=date_format(#{birthady},'%Y-%m-%d')
</if>
</where>
</select>
</mapper>
6.用服务类把上面的两表连起来
6.1.服务类接口
增(因为存在主外键,所以增加数据需要传两个参数)、删、改、查的方法。
public interface UserinfosService {
public void addUserinfo(Userinfos user , Scores scores);
public void delUserById(long userid);
public void modifyScores(Scores scores);
public List<Userinfos> searchUser(Userinfos user);
}
6.2.接口实现类
检索两表对应的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<Userinfos> searchUser(Userinfos user) {
return userinfosMapper.findUserByCondit(user);
}
}
7.控制类
@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<Userinfos> 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”,查看数据库是否已经完成了操作,如果已经完成那就成功了。