一、配置问题:
1. pom.xml:
<!--添加阿里JSon-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.73</version>
</dependency>
<!--阿里数据源-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.15</version>
</dependency>
<!-- jpa配置 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--mybatis相关依赖-->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.1.4</version>
</dependency>
<!--数据库连接 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
spring:
#数据源配置(需要注意时区等问题,如果不加可能会报时区错误):
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
type: com.alibaba.druid.pool.DruidDataSource
url: jdbc:mysql://localhost:3306/chongwu?useUnicode=true&characterEncoding=UTF-8&useSSL=false&autoReconnect=true&failOverReadOnly=false&serverTimezone=GMT%2B8
username: root
password: 123456mjg
#端口配置:
server:
port: 8082
#mybatis配置:
mybatis:
mapper-locations: classpath*:mapper/*.xml
application.yml与application.properties配置文件类似,但application.yml文件具有树形的层次结构,看起来更加直观,缺点就是格式要求严格,字符或空格问题都会导致出现错误。
spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
spring.datasource.url=jdbc:mysql://localhost/epidemic_management?useUnicode=true&characterEncoding=UTF-8&useSSL=false&autoReconnect=true&failOverReadOnly=false&serverTimezone=GMT%2B8
spring.datasource.username=root
spring.datasource.password=123456mjg
server.port=8080
#mybatis.mapper-locations配置信息:
mybatis.mapper-locations=classpath:/src/main/resources/mapper/*.xml
#编码格式
server.servlet.encoding.force=true
server.servlet.encoding.charset=UTF-8
server.servlet.encoding.enabled=true
server.tomcat.uri-encoding=UTF-8
- 在上述的配置文件中首先要添加配置信息以保证该配置文件可以在构建时被找到:
#mybatis.mapper-locations配置信息:
mybatis.mapper-locations=classpath:/src/main/resources/mapper/*.xml
当然还有其他配置方式,比如在pom.xml文件中的构建内容下引入<include>等
- 建立xml文件后注意引用mybatis的xml文件头,使之成为mybatis的配置文件,然后注意建立与dao层之间的命名空间和java实体与数据库实体之间的映射,以实现具体的数据库服务(select、insert、update、delete操作在返回时都一一对应具体的resultMap)。
- 注意:
<where> <!-- 1=1永真条件 --> 1=1 --判断条件,看传过来的参数值是否为null或者'' <if test="{userName!=null and userName!=''}"> --#{}获取当前传参的值 and username=#{userName} </if> <if test="{password!=null and password!=''}"> and password=#{password} </if> </where>
另外在编写的过程中一定要注意SQL的语法格式,如果出现错误则不会有结果。
<?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.hqyj.shixun.dao.BackUserDao">
<resultMap id="BackUserResultMap" type="com.hqyj.shixun.entity.BackUser" >
<id column="id" property="id"/>
<result column="user_name" property="userName"/>
<result column="password" property="password"/>
<result column="nick_name" property="nickName"/>
</resultMap>
<select id="getBackUsers" resultMap="BackUserResultMap">
select * from back_user
<where>
1=1
<if test="userName!=null and userName!=''">
and user_name=#{userName}
</if>
<if test="password!=null and password!=''">
and password=#{password}
</if>
</where>
</select>
<insert id="saveBackUser" parameterType="com.hqyj.shixun.entity.BackUser">
insert into back_user (user_name,password,nick_name) values (#{userName},#{password},#{nickName})
</insert>
<select id="getBackUserNameCount" resultType="java.lang.Integer">
select count(*) from back_user where user_name=#{userName}
</select>
<update id="updateBackUser" parameterType="com.hqyj.shixun.entity.BackUser">
update back_user
<set>
<if test="userName != null">
user_name=#{userName}
</if>
<if test="password!=null">
password=#{password}
</if>
<if test="nickName!=null">
nick_name=#{nickName}
</if>
</set>
where id=#{id}
</update>
<delete id="deleteBackUser" parameterType="java.lang.Integer">
delete from back_user where id=#{id}
</delete>
</mapper>
二、注解问题:
在编写dao层的实现逻辑时,具体的实现都放在了mapper映射文件下,那么首先就要保证dao层文件在启动时被找到,在dao层文件中添加@Repository注解并在启动项目时也应扫描dao层所在的文件以保证mapper映射可以和dao层文件对应(可以找到dao层文件和mapper文件(mapper文件已经配置完毕)):@MapperScan("com.hqyj.shixun.dao"):
当然上述也可以都采用@Mapper注解实现(mybatis)。
@Repository
public interface BackUserDao {
...
}
@SpringBootApplication
@MapperScan("com.hqyj.shixun.dao")
public class ShixunApplication {
public static void main(String[] args) {
SpringApplication.run(ShixunApplication.class, args);
}
}
还有注解:
@RestController
@RequestMapping
@Autowired(自动注入,无需new)
@Service等
注解配置代替了繁冗复杂的xml文件配置,使开发更快速简洁。
不同的框架规定了不同的注解,同时JDK也自带一部分注解,我们可以通过注解机制来简化开发。
三、访问域控制:
在不同的访问域下有不同的限制,如果我们把IP+端口号标记的进程记为一个域,则在该域之外对此域进行访问,称为跨域访问,这里我们需要作以下配置(具体说明请参见注释):
public class WebMvcConfig extends WebMvcConfigurerAdapter {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("*")
.allowedOriginPatterns("*")
.allowedHeaders("*") //添加header
.allowedMethods("GET","POST","PUT","DELETE","OPTIONS") //请求的方式
.allowCredentials(true);//添加验证
}
}
上述抽象类系统会显示已经过时,我们也可以通过直接实现WebConfigurer来配置:/**
* 跨域请求配置
*/
@Configuration
public class CorsConfig implements WebMvcConfigurer {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**") // 匹配了所有的URL
.allowedHeaders("*") // 允许跨域请求包含任意的头信息
.allowedMethods("*") // 设置允许的方法
.allowedOrigins("*") // 设置允许跨域请求的域名
.allowCredentials(true); // 是否允许证书,默认false
}
}
或者直接在主函数(运行)中给出跨域访问限制(有效):
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;
import org.springframework.web.cors.CorsConfiguration;
import org.springframework.web.cors.UrlBasedCorsConfigurationSource;
import org.springframework.web.filter.CorsFilter;
@SpringBootApplication
@MapperScan("com.example.shixun.dao")
public class ShixunApplication {
public static void main(String[] args) {
SpringApplication.run(ShixunApplication.class, args);
}
private CorsConfiguration buildConfig() {
CorsConfiguration corsConfiguration = new CorsConfiguration();
corsConfiguration.addAllowedOrigin("*");
corsConfiguration.addAllowedHeader("*");
corsConfiguration.addAllowedMethod("*");
return corsConfiguration;
}
/**
* 跨域过滤器
* @return
*/
@Bean
public CorsFilter corsFilter() {
UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
source.registerCorsConfiguration("/**", buildConfig()); // 4
return new CorsFilter(source);
}
}
四、后台层级的调用过程:
前端发送来请求(url形式等),然后请求首先传到controller层(可以理解为一个前端与后端的访问接口,该层接收前端的请求并进行简单处理后传送到业务逻辑层Service层),Service处理具体的业务逻辑,由于功能可能较多,一般常设立接口,然后设置imp文件实现接口的方式去实现具体的功能逻辑,对于数据库问题,则由Service层转由Dao层实现,这里采用的是mybatis方式实现java实体与数据库实体对象一一对应的方式并在mapper配置文件下实现具体的增删查改等数据库业务逻辑,因此采用Dao层接口即可。
数据库业务逻辑实现完毕后依次进行结果参数返回(这类于一个递归调用,但只递归一次,逐层向下请求处理,逐层向上返回处理结果),由Dao层转到Service层,然后是Controller层依次进行处理后返回给前端结果(字符串,List,Map,json格式等)进行展示)。