一直想用maven建立一个父子项目,对现有的架构进行重构一下,减少代码的耦合度,直到冗余的代码越来越多,维护得有些吃力了,才痛下决心,把这个项目建立起来。
环境说明
开发工具:Spring Tool Suite 3.8.3.RELEASE
org.springframework.boot 2.1.4.RELEASE
开发环境jdk、maven路径等等,一定要提前配置好了。
架构说明
实体类、Dao层、Service层、Controller层、公共类、管理后台、前台等各为一个项目。
目的:实现实体类、Dao层、Service层、公共类代码复用,管理后台、前台不再只需维护一套以上的代码,减少维护的压力。
第一步,file->new maven project,建立父项目。
图-1图-2
删除父项目下的src文件,只留pom文件。
图-3 pom文件的配置如下:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<!-- 指定依赖关系 -->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.4.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.example</groupId>
<artifactId>example-root</artifactId>
<version>0.0.1-SNAPSHOT</version>
<!-- 父项目的packaging必须为pom -->
<packaging>pom</packaging>
<name>这是一个父项目</name>
<description>所有子项目的父项目</description>
<properties>
<java.version>1.8</java.version>
<spring-cloud.version>Greenwich.SR1</spring-cloud.version>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<!-- 依赖的架包 -->
<dependencies>
</dependencies>
<!-- 子模块 -->
<modules>
</modules>
</project>
第二步建立子项目,选中父项目,点击右键,选择 other,在other里面选择maven moudle,然后next,最后finish。
图-4图-5
这时,建成的子项目已经在父项目之中了。
图-6
从父项目的pom中可以看到,已经把子项目生成进去了。
图-7
打开子项目的pom文件,有些冗余的内容,就删掉了一些,只留必要的。
<?xml version="1.0" encoding="UTF-8"?>
<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.example</groupId>
<artifactId>example-root</artifactId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<artifactId>example-entity</artifactId>
<name>example-entity</name>
<packaging>jar</packaging>
<url>http://maven.apache.org</url>
<dependencies>
</dependencies>
<build>
<finalName>example-entity</finalName>
</build>
</project>
就这样,以此类推,把其他需要的项目也创建好了。
图-8
第三步,项目建立好,就是项目之间的关系,对于example-service是需要调用example-dao和example-entity中的类的,这时只需要在pom以架包的形式引入即可。
<dependency>
<groupId>com.example</groupId>
<artifactId>example-dao</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>com.example</groupId>
<artifactId>example-entity</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
对于每个项目都需要的架包,则在父类中引入,如果架包只是某一个项目中才用到的,就只需要在用到的项目中引入即可。
这时最后生成的项目的结构,也就是父子项目。
图-9
第四步,把每个项目中的代码完善一下。
1)连接数据库的配置文件,放在了common项目中。
import javax.sql.DataSource;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import com.alibaba.druid.pool.DruidDataSource;
@Configuration
@MapperScan("com.example.dao")
public class DruidDatabaseConfig {
/**
* DruidDataSource数据源中默认的是取druid开头的,所以这里需要设置一下前缀prefix
* 使用com.alibaba的DruidDataSource数据源
* @return
*
*/
@Bean
@ConfigurationProperties(prefix="spring.datasource")
public DataSource dataSource() {
return new DruidDataSource();
}
}
2)增加配置文件:
spring.datasource.url=jdbc:mysql://localhost:3306/test1?useUnicode=true&characterEncoding=utf-8&autoReconnect=true&serverTimezone=GMT%2B8
spring.datasource.username=root
spring.datasource.password=123456
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
mybatis.mapper-locations=classpath:mapper/*.xml
mybatis.type-aliases-package=com.example.entity
pom文件如下:
<?xml version="1.0" encoding="UTF-8"?>
<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.example</groupId>
<artifactId>example-root</artifactId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<artifactId>example-common</artifactId>
<name>example-common</name>
<packaging>jar</packaging>
<url>http://maven.apache.org</url>
<dependencies>
</dependencies>
<build>
<finalName>example-common</finalName>
</build>
</project>
service项目,一个接口,一个实现类;
import java.util.List;
import com.example.entity.Test;
public interface ITestService {
public void addTest(Test test);
public void updateTest(Test test);
public Test getTest(Test test);
public List<Test> findTests();
}
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.example.dao.TestMapper;
import com.example.entity.Test;
import com.example.service.ITestService;
@Service("testServiceImpl")
public class TestServiceImpl implements ITestService {
@Autowired
private TestMapper testMapper;
@Override
public void addTest(Test test) {
testMapper.insertSelective(test);
}
@Override
public void updateTest(Test test) {
testMapper.updateByPrimaryKeySelective(test);
}
@Override
public Test getTest(Test test) {
return testMapper.selectByPrimaryKey(test.getUserUid());
}
@Override
public List<Test> findTests() {
return null;
}
}
dao项目,一个mapper类,一个mapper.xml配置文件,特别是xml文件,里面的类名对象名都要写对。这两个文件也有可能是工具生成的,生成的时候,包名一定要设置对了。
import com.example.entity.Test;
public interface TestMapper {
int deleteByPrimaryKey(String userUid);
int insert(Test record);
int insertSelective(Test record);
Test selectByPrimaryKey(String userUid);
int updateByPrimaryKeySelective(Test record);
int updateByPrimaryKey(Test record);
}
<?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.dao.TestMapper">
<resultMap id="BaseResultMap" type="com.example.entity.Test">
<id column="user_uid" jdbcType="VARCHAR" property="userUid" />
<result column="create_date" jdbcType="DATE" property="createDate" />
<result column="create_user" jdbcType="VARCHAR" property="createUser" />
<result column="status" jdbcType="TINYINT" property="status" />
<result column="update_date" jdbcType="DATE" property="updateDate" />
<result column="update_user" jdbcType="VARCHAR" property="updateUser" />
<result column="user_mobile" jdbcType="VARCHAR" property="userMobile" />
<result column="user_name" jdbcType="VARCHAR" property="userName" />
<result column="user_pwd" jdbcType="VARCHAR" property="userPwd" />
<result column="user_birthday" jdbcType="DATE" property="userBirthday" />
</resultMap>
<sql id="Base_Column_List">
user_uid, create_date, create_user, status, update_date, update_user, user_mobile,
user_name, user_pwd, user_birthday
</sql>
<select id="selectByPrimaryKey" parameterType="java.lang.String" resultMap="BaseResultMap">
select
<include refid="Base_Column_List" />
from t_test
where user_uid = #{userUid,jdbcType=VARCHAR}
</select>
<delete id="deleteByPrimaryKey" parameterType="java.lang.String">
delete from t_test
where user_uid = #{userUid,jdbcType=VARCHAR}
</delete>
<insert id="insert" parameterType="com.example.entity.Test">
insert into t_test (user_uid, create_date, create_user,
status, update_date, update_user,
user_mobile, user_name, user_pwd,
user_birthday)
values (#{userUid,jdbcType=VARCHAR}, #{createDate,jdbcType=DATE}, #{createUser,jdbcType=VARCHAR},
#{status,jdbcType=TINYINT}, #{updateDate,jdbcType=DATE}, #{updateUser,jdbcType=VARCHAR},
#{userMobile,jdbcType=VARCHAR}, #{userName,jdbcType=VARCHAR}, #{userPwd,jdbcType=VARCHAR},
#{userBirthday,jdbcType=DATE})
</insert>
<insert id="insertSelective" parameterType="com.example.entity.Test">
insert into t_test
<trim prefix="(" suffix=")" suffixOverrides=",">
<if test="userUid != null">
user_uid,
</if>
<if test="createDate != null">
create_date,
</if>
<if test="createUser != null">
create_user,
</if>
<if test="status != null">
status,
</if>
<if test="updateDate != null">
update_date,
</if>
<if test="updateUser != null">
update_user,
</if>
<if test="userMobile != null">
user_mobile,
</if>
<if test="userName != null">
user_name,
</if>
<if test="userPwd != null">
user_pwd,
</if>
<if test="userBirthday != null">
user_birthday,
</if>
</trim>
<trim prefix="values (" suffix=")" suffixOverrides=",">
<if test="userUid != null">
#{userUid,jdbcType=VARCHAR},
</if>
<if test="createDate != null">
#{createDate,jdbcType=DATE},
</if>
<if test="createUser != null">
#{createUser,jdbcType=VARCHAR},
</if>
<if test="status != null">
#{status,jdbcType=TINYINT},
</if>
<if test="updateDate != null">
#{updateDate,jdbcType=DATE},
</if>
<if test="updateUser != null">
#{updateUser,jdbcType=VARCHAR},
</if>
<if test="userMobile != null">
#{userMobile,jdbcType=VARCHAR},
</if>
<if test="userName != null">
#{userName,jdbcType=VARCHAR},
</if>
<if test="userPwd != null">
#{userPwd,jdbcType=VARCHAR},
</if>
<if test="userBirthday != null">
#{userBirthday,jdbcType=DATE},
</if>
</trim>
</insert>
<update id="updateByPrimaryKeySelective" parameterType="com.example.entity.Test">
update t_test
<set>
<if test="createDate != null">
create_date = #{createDate,jdbcType=DATE},
</if>
<if test="createUser != null">
create_user = #{createUser,jdbcType=VARCHAR},
</if>
<if test="status != null">
status = #{status,jdbcType=TINYINT},
</if>
<if test="updateDate != null">
update_date = #{updateDate,jdbcType=DATE},
</if>
<if test="updateUser != null">
update_user = #{updateUser,jdbcType=VARCHAR},
</if>
<if test="userMobile != null">
user_mobile = #{userMobile,jdbcType=VARCHAR},
</if>
<if test="userName != null">
user_name = #{userName,jdbcType=VARCHAR},
</if>
<if test="userPwd != null">
user_pwd = #{userPwd,jdbcType=VARCHAR},
</if>
<if test="userBirthday != null">
user_birthday = #{userBirthday,jdbcType=DATE},
</if>
</set>
where user_uid = #{userUid,jdbcType=VARCHAR}
</update>
<update id="updateByPrimaryKey" parameterType="com.example.entity.Test">
update t_test
set create_date = #{createDate,jdbcType=DATE},
create_user = #{createUser,jdbcType=VARCHAR},
status = #{status,jdbcType=TINYINT},
update_date = #{updateDate,jdbcType=DATE},
update_user = #{updateUser,jdbcType=VARCHAR},
user_mobile = #{userMobile,jdbcType=VARCHAR},
user_name = #{userName,jdbcType=VARCHAR},
user_pwd = #{userPwd,jdbcType=VARCHAR},
user_birthday = #{userBirthday,jdbcType=DATE}
where user_uid = #{userUid,jdbcType=VARCHAR}
</update>
</mapper>
第五步,测试。
在Controller项目中,新建了一个测试文件:
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import com.example.entity.Test;
import com.example.service.ITestService;
@RestController
public class TestController {
@Autowired
private ITestService testServiceImpl;
@GetMapping("/index")
public Object index(){
Test test = new Test();
test.setUserUid("20190724");
test.setUserName("teststest");
testServiceImpl.addTest(test);
return test;
}
@GetMapping("/index1")
public Object index1(){
Test test = new Test();
test.setUserUid("20190724");
test = testServiceImpl.getTest(test);
return test;
}
}
测试结果图
总结:
在建立父子项目时,由于包名写错了,报service或mapper找不到的问题,这时,只要根据错误信息对报错的包进行修改就可以了。
父子项目,可以很好地实现对代码的复用,特别是像实体类、service层、工具类的复用。
使用工具生成的文件,一定要制定核对pom文件,pom文件生成时,有时会漏掉一些参数,这个还需要找一篇范文来比对一下。
有帮助,微信扫一扫,关注一下
网友评论