spring boot
spring boot 连接虚拟机数据库,对数据库中存在主外键关系的两个表进行增删改查操作,使用了动态sql,resultMap(关联查询自定义的返回值类型,可以在查询主键所在的表时顺便将外键所在表的数据也查出来)
spring boot
1、idea新建项目
1.选择Spring Initializr 项目
注意不要选Default,要选Custom,然后把右侧的网址改为阿里云的下载地址(默认为国外的下载地址,下载比较慢)
然后下一步
修改项目包名和项目名
选择自己要使用的工具,在此页面选中,新建完工程就会自动导入相应的包
此时会使用到:开发工具中的Lombok
Web中的Spring Web
关系型数据库中的MyBatis Framework和MySQL Driver
然后下一步,此时修改项目名,这个在上边修改项目包名的时候已经修改过,直接finish即可
进入后选择自动导包
这个位置为自动导入的包,如果有报红的,到之前maven设置的专门存放包的文件夹中把相应的文件夹删除(箭头所指的冒号前为相应的目录),然后点击刷新即可
2、配置pom.xml文件
Spring-boot的版本号默认为2.3.7,版本相对较高,改为2.2.6,这个版本使用较多
spring webmvc,没有写版本号,随spring-boot版本变化而变化
spring-boot的依赖工程包中可以查看版本号(ctrl+鼠标左键),spring-boot中拥有的所有工具都在这,需要使用哪个依赖就在上方的中导入,因为之前在选择工具的时候选择了4项,所以此时除默认外就只有这4个依赖。【如果还有其他的工具集可以在下方的中导入,然后在上方导入依赖】
mybatis和spring-boot的整合包
数据库,默认版本为8.0的数据库,我的数据库版本为5.1.38,此时不太合理,将数据库版本号改为5.1.38
lombok选择的选项可以删除,使用默认的lombok即可
spring-boot的测试工具,一般放着不动就可以,也可以删除(因为junit与spring web存在冲突,两个只能同一个,所以直接将junit排除)
3、配置application文件,将后缀名properties改为yml
首先给工程起名字
注意格式(前方的缩进,也就是空格也不要改变,此时就相当于spring包下的application包下的name属性,工程名可以自己起,尽量与idea中设置的工程名相同)
设置tomcat启动端口
默认为8080,此时改为9999(因为8080端口可能会被占用)
设置虚拟机地址
然后回车,选中com.mysql.jdbc.Driver,再回车
配置自己的url,username,passwoed
url: jdbc:mysql://192.168.201.150:3306/lianxi
username和password写虚拟机数据的账号和密码,之前设置的
【注意是spring-datasource-***,不要选错了】
补充:
url:统一资源定位符(网络中某个资源的绝对路径)
例
https://www.baidu.com/ 这就是URL
url包括哪几部分?
协议
IP
PORT
资源名
http://182.61.200.7:80/index.html
http:// 通信协议(通信之前就提前定好的数据传送格式)
182.61.200.7 服务器的IP地址
80 服务器上软件的端口
index.html 是服务器上某个资源名
jdbc:mysql://localhost:3306/bankdb
jdbc:mysql:// 协议
localhost IP地址,localhost和127.0.0.1都是本机ip地址
3306 mysql数据库端口号
bankdb 具体的数据库实例名
调用实体类的配置文件(xml文件一般为写完java类后写)
mapper - locations 表示:读取路径为mapper包下的所有xml文件
config - location 表示:mybatis.cfg.xml为给实体类起别名的xml文件
yml文件写完后代码
spring:
application:
name: myspb01
datasource:
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql://192.168.201.150:3306/mydemo
username: root
password: ****
server:
port: 9999
mybatis:
mapper-locations: classpath:mapper/*.xml
config-location: classpath:mybatis.cfg.xml
4、写java类
控制层(controller)–>服务层(业务逻辑层)(service)–>数据链路层(dao)
工程建完之后会自动生成一个java类,自己写的java类必须在这个java类的下面一层
4.1 写实体类
实体类包名一般为domain或者entity/model,类名与数据库表名相对应(首字母大写),类中属性与数据库表中的字段对应
Userinfos类
package com.kgc.myspb01.domain;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.Date;
import java.util.List;
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class Userinfos {
private long userid;
private String username;
private Date birthday;
private List<Scores> scores;
}
Scores类
package com.kgc.myspb01.domain;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class Scores {
private long scid;
private long userid;
private long score;
}
4.2 写实体类的接口,接口中为操作数据库的方法
接口的包名一般为dao或者mapper,接口名实体类名加dao或mapper,dao的话全部大写,mapper的话首字母大写
UserinfosMapper
package com.kgc.myspb01.dao;
import com.kgc.myspb01.domain.Userinfos;
import java.util.List;
public interface UserinfosMapper {
public void addUser(Userinfos user);
public void delUser(long userid);
public List<Userinfos> findUserByCondit(Userinfos user);
// public List<Userinfos> findAllUser();
}
ScoresMapper (ScoresDAO)
package com.kgc.myspb01.dao;
import com.kgc.myspb01.domain.Scores;
import java.util.List;
public interface ScoresMapper {
public List<Scores> findScoresByUserid(long userid);
public void deleteScoreByUserid(long userid);
public void modfiyScore(Scores score);
public void addScore(Scores score);
}
4.3 写xml文件
4.3.1 在resources下创建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.myspb01.domain.Userinfos"
alias="user"></typeAlias>
<typeAlias type="com.kgc.myspb01.domain.Scores"
alias="score"></typeAlias>
</typeAliases>
</configuration>
4.3.2 在resources下创建mapper包,用于存放实体类的xml文件,实体类的xml文件用于写sql语句
注意:实体类的xml文件需要把表头改一下(图片遮挡的部位可以看下方代码)
scores.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">
<!--namespace为dao包下的接口(带包名)-->
<mapper namespace="com.kgc.myspb01.dao.ScoresMapper">
<!--mapper中写sql语句:增删改查insert,delete,update,select-->
<!--id=方法名,parameterType=参数类型,resultType=返回值类型(score为给实体类起的别名)-->
<select id="findScoresByUserid" 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>
userinfos.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.kgc.myspb01.dao.UserinfosMapper">
<!-- resultMap 通常用于关联查询-->
<!--把查询的数据库表中的列(column="userid")往user类中的属性
(property="userid")上映射-->
<!-- collection 一对多
property 查询出成绩的结果存放在哪个属性中
column 用什么列传递给成绩查询做参数
select 成绩查询的方法名 -->
<resultMap id="user_score" type="user">
<result property="userid" column="userid"></result>
<collection property="scores" column="userid" select="com.kgc.myspb01.dao.ScoresMapper.findScoresByUserid">
</collection>
</resultMap>
<!--useGeneratedKeys="true" 改为true,表示如果插入的表userid以自 增列为主键,则允许 JDBC 自动生成主键,并可将自动生成的主键userid返回
keyProperty="userid"
注意:useGeneratedKeys参数只针对insert语句生效(通常用于存在主外键关 系的表中)-->
<insert id="addUser" parameterType="user"
useGeneratedKeys="true"
keyProperty="userid">
insert into userinfos(username,birthday) values(#
{username},#{birthday})
</insert>
<delete id="delUser" parameterType="long">
delete from userinfos where userid=#{userid}
</delete>
<!--动态sql
<where>的作用相当于where条件,只不过里边加了一个判断
如果条件成立的话,才会加上<if>中的语句-->
<select id="findUserByCondit" parameterType="user"
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(#{birthday},'%Y-%m-%d')
</if>
</where>
</select>
</mapper>
4.4 写服务类
服务类的包名一般为service
package com.kgc.myspb01.services;
import com.kgc.myspb01.domain.Scores;
import com.kgc.myspb01.domain.Userinfos;
import java.util.List;
public interface UserinfosService {
public void addUserinfo(Userinfos user, Scores scores);
public void delUserById(long userid);
public void modifyScores(Scores score);
public List<Userinfos> searchUser(Userinfos user);
}
在service包下新建impl包,用于存放服务接口的实现类
package com.kgc.myspb01.services.impl;
import com.kgc.myspb01.dao.ScoresMapper;
import com.kgc.myspb01.dao.UserinfosMapper;
import com.kgc.myspb01.domain.Scores;
import com.kgc.myspb01.domain.Userinfos;
import com.kgc.myspb01.services.UserinfosService;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import javax.annotation.Resource;
import java.util.List;
//此时service接口只有一个实现类,若有多个实现类,可以起别名@service(value = "userService")
@Service //告诉spring自动new当前类,方便其他类的调用
@Transactional //自动提交事务
public class UserinfosServiceImpl implements UserinfosService {
//告诉spring自动去找注解标注的接口的实现类,然后new出来,如果没找到会报空指针异常
@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.delUser(userid);
}
@Override
public void modifyScores(Scores score) {
scoresMapper.modfiyScore(score);
}
@Override
public List<Userinfos> searchUser(Userinfos user) {
return userinfosMapper.findUserByCondit(user);
}
}
4.7 写控制器类controller,用于接收和返回数据
package com.kgc.myspb01.controller;
import com.kgc.myspb01.domain.Scores;
import com.kgc.myspb01.domain.Userinfos;
import com.kgc.myspb01.services.UserinfosService;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.List;
@RestController //告诉spring这是一个控制器,并让spring给new出来
public class InitCtrl {
//@Resource(name = "userService") 指定调用下方接口的哪个实现类, userService为实现类实现接口时起的别名
@Resource
private UserinfosService userinfosService;
//给自己的servlet起别名(在tomcat中使用)
@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,表示当前参数是必须的吗,false表示不是必须的,可有可无,如果不传这个值,则默认值为0,下方的两个参数默认值为空
@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 user = new Userinfos();
user.setUserid(userid);
if(!username.trim().equals("")){
user.setUsername(username);
}
try {
if(!birthday.trim().equals("")){
user.setBirthday(sdf.parse(birthday));
}
} catch (ParseException e) {
e.printStackTrace();
}
return userinfosService.searchUser(user);
}
}
4.8 找到自动生成的java类
package com.kgc.myspb01;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
//dao包中的实体类接口并没有实现类,此注解为通知spring调用第三方工具来实现dao包中的接口,这样spring中就有dao包中所有接口的匿名类
@MapperScan("com.kgc.myspb01.dao")
public class Myspb01Application {
public static void main(String[] args) {
SpringApplication.run(Myspb01Application.class, args);
}
}
写完后直接右键单击运行,进入网页测试,输入localhost:9999/find?userid=122&username=zz
更多推荐
所有评论(0)