当前位置: 首页 > news >正文

ssm-ham项目1

面向接口开发:先写接口再写实现类:可扩展性 可维护性高

可以扩展接口里面没有的方法,可以扩展接口中的方法体(方法里面不同的实现类实现的不同)

耦合度低好:联系性少,可扩展性高可维护性高

父模块pom.xml
<?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><groupId>com.qcby</groupId><artifactId>ham-parent</artifactId><version>1.0-SNAPSHOT</version><modules><module>ham-core</module><module>ham-console</module><module>ham-portal</module><module>ham-file</module></modules><packaging>pom</packaging><dependencyManagement><dependencies><!-- Spring切面 --><dependency><groupId>org.aspectj</groupId><artifactId>aspectjweaver</artifactId><version>${aspectj.version}</version></dependency><!--aop--><dependency><groupId>org.springframework</groupId><artifactId>spring-aop</artifactId><version>${spring.version}</version></dependency><!--Spring框架核心--><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>${spring.version}</version></dependency><!--Spring整合web的依赖--><dependency><groupId>org.springframework</groupId><artifactId>spring-web</artifactId><version>${spring.version}</version></dependency><!--Spring整合webmvc的依赖,表现层依赖--><dependency><groupId>org.springframework</groupId><artifactId>spring-webmvc</artifactId><version>${spring.version}</version></dependency><!--Spring整合测试依赖--><dependency><groupId>org.springframework</groupId><artifactId>spring-test</artifactId><version>${spring.version}</version></dependency><!--spring整合事务的依赖--><dependency><groupId>org.springframework</groupId><artifactId>spring-tx</artifactId><version>${spring.version}</version></dependency><!--Spring整合JDBC--><dependency><groupId>org.springframework</groupId><artifactId>spring-jdbc</artifactId><version>${spring.version}</version></dependency><!--junit单元测试--><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>${junit.version}</version></dependency><!--mysql驱动--><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>${mysql.version}</version></dependency><!--Servletapi依赖,springmvc底层是Servlet--><dependency><groupId>javax.servlet</groupId><artifactId>servlet-api</artifactId><version>${servlet.version}</version><scope>provided</scope></dependency><!--jsp--><dependency><groupId>javax.servlet.jsp</groupId><artifactId>jsp-api</artifactId><version>${jsp.version}</version><scope>provided</scope></dependency><!--jst1库--><dependency><groupId>jstl</groupId><artifactId>jstl</artifactId><version>${jstl.version}</version></dependency><!-- 日志 --><dependency><groupId>log4j</groupId><artifactId>log4j</artifactId><version>${log4j.version}</version></dependency><!--日志--><dependency><groupId>org.slf4j</groupId><artifactId>slf4j-api</artifactId><version>${slf4j.version}</version></dependency><!--日志--><dependency><groupId>org.slf4j</groupId><artifactId>slf4j-log4j12</artifactId><version>${slf4j.version}</version></dependency><!-- MyBatis --><dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId><version>${mybatis.version}</version></dependency><!--MyBatis和Spring相整合--><dependency><groupId>org.mybatis</groupId><artifactId>mybatis-spring</artifactId><version>${mybatis-spring.version}</version></dependency><!--连接池--><dependency><groupId>com.alibaba</groupId><artifactId>druid</artifactId><version>${druid.version}</version></dependency><!-- fastjson:Java对象和json对象相互转换 --><dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>${fastjson.version}</version></dependency><!--文件上传处理--><dependency><groupId>commons-io</groupId><artifactId>commons-io</artifactId><version>${commons-io.version}</version></dependency><!--文件上传--><dependency><groupId>commons-fileupload</groupId><artifactId>commons-fileupload</artifactId><version>${commons-fileupload.version}</version></dependency><!--文件上传--><dependency><groupId>commons-codec</groupId><artifactId>commons-codec</artifactId><version>${commons-codec.version}</version></dependency><!--第三方标签库--><dependency><groupId>javax.servlet</groupId><artifactId>jstl</artifactId><version>${jstl.version}</version></dependency><!--文件上传的客户端依赖--><dependency><groupId>com.sun.jersey</groupId><artifactId>jersey-client</artifactId><version>${jersey.version}</version></dependency><dependency><groupId>commons-lang</groupId><artifactId>commons-lang</artifactId><version>${commons-lang.version}</version></dependency></dependencies></dependencyManagement><properties><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><maven.compiler.source>1.8</maven.compiler.source><maven.compiler.target>1.8</maven.compiler.target><spring.version>5.0.2.RELEASE</spring.version><slf4j.version>1.6.6</slf4j.version><log4j.version>1.2.12</log4j.version><mysql.version>5.1.6</mysql.version><mybatis.version>3.4.5</mybatis.version><aspectj.version>1.6.8</aspectj.version><junit.version>4.12</junit.version><servlet.version>2.5</servlet.version><jsp.version>2.0</jsp.version><jstl.version>1.2</jstl.version><druid.version>1.1.10</druid.version><fastjson.version>1.2.47</fastjson.version><commons-io.version>2.0.1</commons-io.version><commons-lang.version>2.6</commons-lang.version><commons-fileupload.version>1.3.1</commons-fileupload.version><commons-codec.version>1.10</commons-codec.version><mybatis-spring.version>1.3.0</mybatis-spring.version><jersey.version>1.2</jersey.version></properties></project>
ham-core:公共模块
db.properties
driverClass=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/hami
uname=root
pword=root
applicationContext.xml

spring的配置文件

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:context="http://www.springframework.org/schema/context"xmlns:aop="http://www.springframework.org/schema/aop"xmlns:tx="http://www.springframework.org/schema/tx"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context.xsdhttp://www.springframework.org/schema/aophttp://www.springframework.org/schema/aop/spring-aop.xsdhttp://www.springframework.org/schema/txhttp://www.springframework.org/schema/tx/spring-tx.xsd"><context:component-scan base-package="com.qcby"></context:component-scan><context:property-placeholder location="classpath:db.properties"/><bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource"><property name="driverClassName" value="${driverClass}"></property><property name="url" value="${url}"></property><property name="username" value="${uname}"></property><property name="password" value="${pword}"></property></bean><bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"><property name="dataSource" ref="dataSource"></property><!--<property name="configLocation" value="classpath:sqlMapConfig.xml"></property>--><property name="mapperLocations" value="classpath:mappers/*.xml"></property></bean><!--生成动态代理实现类--><bean id="mapperScan" class="org.mybatis.spring.mapper.MapperScannerConfigurer"><property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"></property><property name="basePackage" value="com.qcby.dao"></property></bean><!--配置事务管理器--><bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"><property name="dataSource" ref="dataSource"></property></bean><tx:advice id="txAdvice" transaction-manager="txManager"><tx:attributes><tx:method name="add*" propagation="REQUIRED"/><tx:method name="update*" propagation="REQUIRED"/><tx:method name="del*" propagation="REQUIRED"/><tx:method name="modify*" propagation="REQUIRED"/><tx:method name="remove*" propagation="REQUIRED"/><tx:method name="get" read-only="true"></tx:method><tx:method name="select" read-only="true"></tx:method></tx:attributes></tx:advice><aop:config><aop:advisor advice-ref="txAdvice" pointcut="execution(* com.qcby.service..*.*(..))"></aop:advisor></aop:config>
</beans>
log4j.properties
# Set root category priority to INFO and its only appender to CONSOLE.
#log4j.rootCategory=INFO, CONSOLE            debug   info   warn error fatal
log4j.rootCategory=info, CONSOLE, LOGFILE# Set the enterprise logger category to FATAL and its only appender to CONSOLE.
log4j.logger.org.apache.axis.enterprise=FATAL, CONSOLE# CONSOLE is set to be a ConsoleAppender using a PatternLayout.
log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender
log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout
log4j.appender.CONSOLE.layout.ConversionPattern=%d{ISO8601} %-6r [%15.15t] %-5p %30.30c %x - %m\n# LOGFILE is set to be a File appender using a PatternLayout.
log4j.appender.LOGFILE=org.apache.log4j.FileAppender
log4j.appender.LOGFILE.File=d:\axis.log
log4j.appender.LOGFILE.Append=true
log4j.appender.LOGFILE.layout=org.apache.log4j.PatternLayout
log4j.appender.LOGFILE.layout.ConversionPattern=%d{ISO8601} %-6r [%15.15t] %-5p %30.30c %x - %m\n
逆向工程generatorConfig.xml
<?xml version='1.0' encoding='UTF-8'?>
<!DOCTYPE generatorConfigurationPUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN""http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd"><generatorConfiguration><context id="mybatisGenerator" ><commentGenerator><!-- 是否去除自动生成的注释 true:是 : false:否 --><property name="suppressAllComments" value="true" /></commentGenerator><!--数据库连接的信息:驱动类、连接地址、用户名、密码 --><jdbcConnection driverClass="com.mysql.jdbc.Driver"connectionURL="jdbc:mysql://localhost:3306/hami?serverTimezone=CTT&amp;useUnicode=true&amp;characterEncoding=utf-8&amp;allowMultiQueries=true" userId="root"password="root"></jdbcConnection><!-- 默认false,把JDBC DECIMAL 和 NUMERIC 类型解析为 Integer,为 true时把JDBC DECIMAL 和NUMERIC 类型解析为java.math.BigDecimal --><javaTypeResolver><property name="forceBigDecimals" value="false" /></javaTypeResolver><!-- targetProject:生成PO类的位置 --><javaModelGenerator targetPackage="com.qcby.model"targetProject=".\ham-core\src\main\java"><!-- enableSubPackages:是否让schema作为包的后缀 --><property name="enableSubPackages" value="false" /><!-- 从数据库返回的值被清理前后的空格 --><property name="trimStrings" value="true" /></javaModelGenerator><!-- targetProject:mapper映射文件生成的位置 --><sqlMapGenerator targetPackage="mappers"targetProject=".\ham-core\src\main\resources"><!-- enableSubPackages:是否让schema作为包的后缀 --><property name="enableSubPackages" value="false" /></sqlMapGenerator><!-- targetPackage:mapper接口生成的位置 --><javaClientGenerator type="XMLMAPPER"targetPackage="com.qcby.dao"targetProject=".\ham-core\src\main\java"><!-- enableSubPackages:是否让schema作为包的后缀 --><property name="enableSubPackages" value="false" /></javaClientGenerator><!-- 指定数据库表 --><table tableName="songer" enableCountByExample="false"enableUpdateByExample="false" enableDeleteByExample="false"enableSelectByExample="false" selectByExampleQueryId="false"/><!-- 有些表的字段需要指定java类型<table schema="" tableName=""><columnOverride column="" javaType="" /></table> --></context>
</generatorConfiguration>
公共代码的抽取
BaseDao
package com.qcby.dao;/*** 持久层  base接口* 目的:抽取公用方法*/
public interface BaseDao<T> {//通过主键删除int deleteByPrimaryKey(Integer id);//通过传递实体类进行新增int insert(T t);//通过主键查询T selectByPrimaryKey(Integer id);//通过传递实体类以及实体类的主键作为条件进行修改//mtype  1   流行  fsdfsdfsd//update set name=#{name},tdesc=#{tdesc} from mtype where tid=#{tid};int updateByPrimaryKey(T t);int insertSelective(T t);int updateByPrimaryKeySelective(T t);
}
BaseService
package com.qcby.service;import com.qcby.model.Mtype;/*** 业务层Base接口* 提取公共方法*/
public interface BaseService<T> {//通过主键删除int deleteByPrimaryKey(Integer id);//通过传递实体类进行新增int insert(T t);//通过主键查询T selectByPrimaryKey(Integer id);//通过传递实体类以及实体类的主键作为条件进行修改//mtype  1   流行  fsdfsdfsd//update set name=#{name},tdesc=#{tdesc} from mtype where tid=#{tid};int updateByPrimaryKey(T t);int insertSelective(T t);int updateByPrimaryKeySelective(T t);
}
BaseServiceImpl
package com.qcby.service.Impl;import com.qcby.dao.BaseDao;
import com.qcby.model.Mtype;
import com.qcby.service.BaseService;
import org.springframework.beans.factory.annotation.Autowired;public class BaseServiceImpl<T> implements BaseService<T> {//@Autowired//使用公用的持久层BaseDao来操作数据库//@Autowired  可以注入  繁琐  注入两次//@Autowired//权限修饰符  4个  私有 private  公共 public   默认  同包protectedprotected BaseDao baseDao;@Overridepublic int deleteByPrimaryKey(Integer id) {return baseDao.deleteByPrimaryKey(id);}@Overridepublic int insert(T t) {return baseDao.insert(t);}@Overridepublic T selectByPrimaryKey(Integer id) {return (T) baseDao.selectByPrimaryKey(id);}@Overridepublic int updateByPrimaryKey(T t) {return baseDao.updateByPrimaryKey(t);}@Overridepublic int insertSelective(T t) {return baseDao.insertSelective(t);}@Overridepublic int updateByPrimaryKeySelective(T t) {return baseDao.updateByPrimaryKeySelective(t);}
}
用模版生成Dao层、Service接口和Service实现类--在test/resources/tpl
dao层
package com.qcby.dao;
import com.qcby.model.Demo;public interface DemoMapper extends BaseDao<Demo>{}
Service接口
package com.qcby.service;import com.qcby.model.Demo;public interface DemoService extends BaseService<Demo>{}
Service实现类
package com.qcby.service.Impl;import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;import com.qcby.dao.DemoMapper;
import com.qcby.model.Demo;
import com.qcby.service.DemoService;
@Service
public class DemoServiceImpl extends BaseServiceImpl<Demo> implements DemoService {private DemoMapper demoDao;@Autowiredpublic void setDemoDao(DemoMapper demoDao) {this.demoDao = demoDao;this.baseDao = demoDao;}}
工具类
逆向工程的执行类
package com.qcby.util;import org.mybatis.generator.api.MyBatisGenerator;
import org.mybatis.generator.config.Configuration;
import org.mybatis.generator.config.xml.ConfigurationParser;
import org.mybatis.generator.internal.DefaultShellCallback;import java.io.File;
import java.util.ArrayList;
import java.util.List;public class Generator {public void generator() throws Exception {List<String> warnings = new ArrayList<String>();boolean overwrite = true;/**指向逆向工程配置文件*/File configFile = new File("ham-core/src/main/resources/generatorConfig.xml");ConfigurationParser parser = new ConfigurationParser(warnings);Configuration config = parser.parseConfiguration(configFile);DefaultShellCallback callback = new DefaultShellCallback(overwrite);MyBatisGenerator myBatisGenerator = new MyBatisGenerator(config,callback, warnings);myBatisGenerator.generate(null);}public static void main(String[] args) throws Exception {try {Generator generatorSqlmap = new Generator();generatorSqlmap.generator();} catch (Exception e) {e.printStackTrace();}}
}
代码生成器执行类

执行之前删掉逆向工程里面生成的xxxDao

package com.qcby.util;import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileReader;
import java.io.FileWriter;/*** 模版生成器的类* 利用java基础  IO流读取文件并生成新文件*/
public class SourceGenerator {//主方法  主函数  程序的入口public static void main(String[] args) throws Exception {//调用了模版生成的方法  静态方法  类方法generatorSource("Song");}//静态方法   模版生成public static void generatorSource(String objName) throws Exception{//generateQuery(objName);//模版生成dao层  mapper接口generateDao(objName);//模拟生成service层  service接口generateService(objName);//模拟生成service层实现类  service实现类generateServiceImpl(objName);}public static void generateQuery(String objName) throws Exception{//EbItem//创建文件输入流BufferedReader br = new BufferedReader(new FileReader("ham-core/src/test/resources/tpl/DemoQuery.tpl"));BufferedWriter bw = new BufferedWriter(new FileWriter("ham-core/src/main/java/com/qcby/query/"+objName+"Query.java"));String line = null;while((line = br.readLine()) != null){line = line.replace("Demo", objName);bw.write(line);bw.newLine();}bw.close();br.close();}public static void generateDao(String objName) throws Exception{//EbItem//创建文件输入流BufferedReader br = new BufferedReader(new FileReader("ham-core/src/test/resources/tpl/DemoMapper.tpl"));BufferedWriter bw = new BufferedWriter(new FileWriter("ham-core/src/main/java/com/qcby/dao/"+objName+"Mapper.java"));String line = null;while((line = br.readLine()) != null){line = line.replace("Demo", objName);bw.write(line);bw.newLine();}bw.close();br.close();}public static void generateService(String objName) throws Exception{//EbItem//创建文件输入流BufferedReader br = new BufferedReader(new FileReader("ham-core/src/test/resources/tpl/DemoService.tpl"));BufferedWriter bw = new BufferedWriter(new FileWriter("ham-core/src/main/java/com/qcby/service/"+objName+"Service.java"));String line = null;while((line = br.readLine()) != null){line = line.replace("Demo", objName);bw.write(line);bw.newLine();}bw.close();br.close();}public static void generateServiceImpl(String objName) throws Exception{//把传递过来的实体类的名字改成小写一份//songerString lowerObjName = objName.substring(0, 1).toLowerCase()+objName.substring(1, objName.length());//EbItem//创建文件输入流BufferedReader br = new BufferedReader(new FileReader("ham-core/src/test/resources/tpl/DemoServiceImpl.tpl"));BufferedWriter bw = new BufferedWriter(new FileWriter("ham-core/src/main/java/com/qcby/service/Impl/"+objName+"ServiceImpl.java"));String line = null;while((line = br.readLine()) != null){line = line.replace("Demo", objName);line = line.replace("demo", lowerObjName);bw.write(line);bw.newLine();}bw.close();br.close();}
}

相关文章:

  • 人工智能赋能教育:重塑学习生态,开启智慧未来
  • 小白的进阶之路系列之四----人工智能从初步到精通pytorch自定义数据集上
  • day36 python神经网络训练
  • 【LLM】LLM源码阅读与分析工具DeepWiki项目
  • Qt环境的搭建
  • NextJS 项目,编译成功,但是启动失败的解决方案
  • Docker镜像存储路径迁移指南(解决磁盘空间不足问题)
  • 嵌入式学习笔记——day27
  • 22 程序控制语句详解:跳转控制(break、continue、goto)、死循环应用、程序控制编程实战
  • 支持单双及四像素模式的testpattern仿真
  • [DS]使用 Python 库中自带的数据集来实现上述 50 个数据分析和数据可视化程序的示例代码
  • 如何用,向量表示3维空间种的有向线段(4,2,3)
  • md650透传
  • Day36打卡 @浙大疏锦行
  • 【RocketMQ 生产者和消费者】- 生产者发送故障延时策略
  • QListWidget的函数,信号介绍
  • 前端垫片chimp
  • idea和cursor快速切换
  • 【八股战神篇】操作系统高频面试题
  • 动态导入与代码分割实战
  • 石家庄市住房和建设局网站/seo网站推广软件 快排
  • 盐山县做网站/willfast优化工具下载
  • 工商注册地址有什么要求/关键词排名优化公司推荐
  • 亚马逊做品牌备案自有网站/网站如何快速推广
  • 一个网站做三页是什么意思/营销推广型网站
  • 长沙专业网站设计/seo外包服务方案