1.项目所需的有关技术
1. java基础,java反射,泛型
2. html,css,JavaScript,jquery,bootstrap,layui
3. Servlet,过滤器,监听器,jstl,el表达式,jsp,mysql,jdbc,xml,javaweb
4. springmvc,mybatis,spring三大开发框架
5. Maven(聚合ssm),junit单元测试
6. jersy,图片服务器搭建(fastDFS)
7. idea开发工具,powerdesigner数据库建模,Navicat连接数据库工具
8. amchart报表开发/echarts报表
2.搭建数据库环境
2.1 创建数据库
本次项目我们使用的是mysql,启动mysql服务器创建数据库ham
2.2 设计数据库模型
powerdesigner数据库建模是一款能够更好处理数据库之间标语表之间的关系的建模软件,可以通过创建的数据表之间的关系到处具体执行的创建表的SQL语句
2.3 数据库的导出脚本
/*==============================================================*/
/* DBMS name: MySQL 5.0 */
/* Created on: 2019/10/12 9:55:56 */
/*==============================================================*/drop table if exists ALBUM;drop table if exists COMMENT;drop table if exists MTYPE;drop table if exists SONG;drop table if exists SONGER;drop table if exists TX_USER;/*==============================================================*/
/* Table: ALBUM */
/*==============================================================*/
create table ALBUM
(AID int(10) not null auto_increment,ANAME varchar(100),PIC varchar(200),COMPANY varchar(50),PDATE date,LANG varchar(50),primary key (AID)
);/*==============================================================*/
/* Table: COMMENT */
/*==============================================================*/
create table COMMENT
(COMMENT_ID int(10) not null auto_increment,COM_COMMENT_ID int(10),USER_ID int(10),COMMENT_CONTENT text,Z_COUNT int(10),primary key (COMMENT_ID)
);/*==============================================================*/
/* Table: MTYPE */
/*==============================================================*/
create table MTYPE
(TID int(10) not null auto_increment,TNAME varchar(50),TDESC varchar(100),primary key (TID)
);/*==============================================================*/
/* Table: SONG */
/*==============================================================*/
create table SONG
(SID int(10) not null auto_increment,TID int(10),SRID int(10),AID int(10),SNAME varchar(50),PIC varchar(100),MP3 varchar(100),LRC text,IS_HOT int(2),IS_NEW int(2),PTIMES int(100),AUDIT_STATUS int(2),SHOW_STATUS int(2),primary key (SID)
);/*==============================================================*/
/* Table: SONGER */
/*==============================================================*/
create table SONGER
(SRID int(10) not null auto_increment,TID int(10),SRNAME varchar(20),INTRO text,AREA varchar(20),PIC varchar(100),IS_HOT int(2),primary key (SRID)
);/*==============================================================*/
/* Table: TX_USER */
/*==============================================================*/
create table TX_USER
(USER_ID int(10) not null auto_increment,USERNAME varchar(20),PASSWORD varchar(20),QQ varchar(20),EMAIL varchar(20),NICK varchar(20),TEL varchar(20),REG_TIME date,primary key (USER_ID)
);
3 maven项目
3.1 Maven的依赖怕管理在架构中的使用
父工程 hami_parent:主要负责依赖的管理,但不会引入依赖(制作以来管理,没有具体业务的实现,因此不需要src文件,只需要创建mavenJava项目)
公共模块 hami_core:主要负责各个模块的dao和service的访问和具体事务处理(只需要创建mavenJava项目)
前台 hami_portal:主要负责和用户进行交互,因此需要有前端页面展示(创建mavenJavaWeb项目)
后台 hami_console:主要负责和管理员交互,因此需要有前端页面展示(创建mavenJavaWeb项目)
图片服务器 hami_file:负责图片的存储,上传和下载,没有pom.xml文件 (创建mavenJavaWeb项目)
前台和后台 前端和后端
1.前台与后台(传统计算机项目管理角度)
- 前台:在计算机项目环境中,前台可以理解为直接和用户交互的应用程序界面部分。它主要关注用户体验和操作便捷性。
- 后台:后台则是支持前台应用程序正常运行的部分,包括服务器管理、数据库维护、数据处理等功能。以同样的 ERP 系统为例,后台负责存储和管理海量的库存数据、采购数据、销售数据等。当库存管理员在前台进行库存查询操作时,后台数据库会根据前台的请求进行数据检索,并将结果返回给前台。和管理员交互
2. 前端与后端(从软件开发和 Web 开发角度)
- 前端:主要负责构建 Web 页面或者应用程序的可视部分,也就是用户直接看到和与之交互的部分。它通过 HTML、CSS 和 JavaScript 等技术来实现页面布局、样式设计和交互功能。
- 后端:主要负责处理业务逻辑、数据库操作和服务器配置。它接收前端发送的请求,处理数据,并将结果返回给前端。对于上述电商网站,后端要处理用户注册登录信息验证、订单处理(包括库存检查、价格计算、生成订单记录等)以及和数据库交互(存储用户信息、商品信息、订单信息等)等复杂的任务。
3.2 Maven的项目构建在架构的使用
项目构建
4.创建工程
ham-parent:父工程
ham-portal: 前台模块
ham-core: 底层公用的模块
ham-console: 后台模块
ham-file: 文件服务器模块
4.1 加入pom文件的依赖
子模块要继承父模块,父模块要聚合子模块
ham-parent的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><packaging>pom</packaging><version>1.0-SNAPSHOT</version><modules><module>ham-console</module><module>ham-core</module><module>ham-portal</module><module>ham-file</module></modules><dependencyManagement><dependencies><!-- spring --><dependency><groupId>org.aspectj</groupId><artifactId>aspectjweaver</artifactId><version>${aspectj.version}</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-aop</artifactId><version>${spring.version}</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>${spring.version}</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-web</artifactId><version>${spring.version}</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-webmvc</artifactId><version>${spring.version}</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-test</artifactId><version>${spring.version}</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-tx</artifactId><version>${spring.version}</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-jdbc</artifactId><version>${spring.version}</version></dependency><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>${junit.version}</version></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>${mysql.version}</version></dependency><dependency><groupId>javax.servlet</groupId><artifactId>servlet-api</artifactId><version>${servlet.version}</version><scope>provided</scope></dependency><dependency><groupId>javax.servlet.jsp</groupId><artifactId>jsp-api</artifactId><version>${jsp.version}</version><scope>provided</scope></dependency><dependency><groupId>jstl</groupId><artifactId>jstl</artifactId><version>${jstl.version}</version></dependency><!-- log start --><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><!-- log end --><dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId><version>${mybatis.version}</version></dependency><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 --><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>
hami_core的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"><parent><artifactId>ham-parent</artifactId><groupId>com.qcby</groupId><version>1.0-SNAPSHOT</version></parent><modelVersion>4.0.0</modelVersion><artifactId>ham-core</artifactId><dependencies><!-- spring --><dependency><groupId>org.aspectj</groupId><artifactId>aspectjweaver</artifactId></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-aop</artifactId></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-test</artifactId></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-tx</artifactId></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-jdbc</artifactId></dependency><dependency><groupId>junit</groupId><artifactId>junit</artifactId></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId></dependency><!-- log start --><dependency><groupId>log4j</groupId><artifactId>log4j</artifactId></dependency><dependency><groupId>org.slf4j</groupId><artifactId>slf4j-api</artifactId></dependency><dependency><groupId>org.slf4j</groupId><artifactId>slf4j-log4j12</artifactId></dependency><!-- log end --><dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId></dependency><dependency><groupId>org.mybatis</groupId><artifactId>mybatis-spring</artifactId></dependency><!--连接池--><dependency><groupId>com.alibaba</groupId><artifactId>druid</artifactId></dependency><!-- fastjson --><dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId></dependency><!--文件上传处理--><dependency><groupId>commons-io</groupId><artifactId>commons-io</artifactId></dependency><dependency><groupId>commons-fileupload</groupId><artifactId>commons-fileupload</artifactId></dependency><dependency><groupId>commons-lang</groupId><artifactId>commons-lang</artifactId></dependency><dependency><groupId>commons-codec</groupId><artifactId>commons-codec</artifactId></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>5.1.26</version></dependency><dependency><groupId>org.mybatis.generator</groupId><artifactId>mybatis-generator-core</artifactId><version>1.3.6</version></dependency></dependencies></project>
hami_console的pom.xml 只有表现层,只做和前端的交互,只有Controller层
<?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"><parent><artifactId>ham-parent</artifactId><groupId>com.qcby</groupId><version>1.0-SNAPSHOT</version></parent><modelVersion>4.0.0</modelVersion><artifactId>ham-console</artifactId><packaging>war</packaging><name>ham-console Maven Webapp</name><dependencies><dependency><groupId>com.qcby</groupId><version>1.0-SNAPSHOT</version><artifactId>ham-core</artifactId></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-web</artifactId></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-webmvc</artifactId></dependency><dependency><groupId>javax.servlet</groupId><artifactId>servlet-api</artifactId><scope>provided</scope></dependency><dependency><groupId>javax.servlet.jsp</groupId><artifactId>jsp-api</artifactId><scope>provided</scope></dependency><dependency><groupId>jstl</groupId><artifactId>jstl</artifactId></dependency><dependency><groupId>javax.servlet</groupId><artifactId>jstl</artifactId></dependency><dependency><groupId>com.sun.jersey</groupId><artifactId>jersey-client</artifactId></dependency></dependencies>
</project>
hami_portal的pom.xml 只有表现层,只做和前端的交互,只有Controller层
<?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"><parent><artifactId>ham-parent</artifactId><groupId>com.qcby</groupId><version>1.0-SNAPSHOT</version></parent><modelVersion>4.0.0</modelVersion><artifactId>ham-portal</artifactId><packaging>war</packaging><name>ham-portal Maven Webapp</name><dependencies><dependency><groupId>com.qcby</groupId><version>1.0-SNAPSHOT</version><artifactId>ham-core</artifactId></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-web</artifactId></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-webmvc</artifactId></dependency><dependency><groupId>javax.servlet</groupId><artifactId>servlet-api</artifactId><scope>provided</scope></dependency><dependency><groupId>javax.servlet.jsp</groupId><artifactId>jsp-api</artifactId><scope>provided</scope></dependency><dependency><groupId>jstl</groupId><artifactId>jstl</artifactId></dependency></dependencies>
</project>
4.2 搭建mybatis和spring的架构
4.2.1 建包
在ham-core中
1.java资源包下创建包如图所示
2. resources资源包下引入
日志文件log4j.properties
数据库连接文件:db.properties
4.2.2 逆向工程
4.2.2.1 在core工程中加入配置文件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/ham?serverTimezone=CTT&useUnicode=true&characterEncoding=utf-8&allowMultiQueries=true"userId="root"password="2020"></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="mapper"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="song" enableCountByExample="false"enableUpdateByExample="false" enableDeleteByExample="false"enableSelectByExample="false" selectByExampleQueryId="false" /><!-- 有些表的字段需要指定java类型<table schema="" tableName=""><columnOverride column="" javaType="" /></table> --></context>
</generatorConfiguration>
通过指定对应的数据表,会生成实体类,dao层接口和对应的mapper映射文件
4.2.2.2 在类中创建逆向工程的执行类
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 {//创建警告信息列表,用于存储在后续执行MyBatis逆向工程中产生的警告信息List<String> warnings = new ArrayList<String>();//如果目标位置已经存在相同点文件,是否要覆盖文件,true表示覆盖boolean overwrite = true;/**指向逆向工程配置文件 相对路径*/File configFile = new File("ham-core/src/main/resources/generatorConfig.xml");/**解析配置文件* 内部会读取配置文件的内容,并按照 MyBatis 逆向工程配置文件的语法规则和格式来解析其中的各项设置。*/ConfigurationParser parser = new ConfigurationParser(warnings);Configuration config = parser.parseConfiguration(configFile);//创建回调对象,会根据传入的overwrite值,在后续代码生成的过程中决定对于已存在文件的处理方式DefaultShellCallback callback = new DefaultShellCallback(overwrite);//创建并执行MyBatis Generator对象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();}}
}
主要是通过对逆向工程的配置文件的读取,以及实体类,持久层接口和映射文件的读取
执行逆向工程后,就会我们的项目中就会生成下面的代码
逆向工程做完后我们已经有了数据层和model
4.2.3 创建Service层
创建service层的接口
public interface SongerService {public void addSonger(Songer songer); public Songer getSongerById(int songId); public void updateSonger(Songer songer); public void delSongerById(int songId);}
在service.impl中创建接口的实现类
@Service
public class SongerServiceImpl implements SongerService {@Autowiredprivate SongerMapper songerMapper;@Overridepublic void addSonger(Songer songer) {songerMapper.insert(songer);}@Overridepublic Songer getSongerById(int songId) {return songerMapper.selectByPrimaryKey(songId);}@Overridepublic void updateSonger(Songer songer) {songerMapper.updateByPrimaryKeySelective(songer);}@Overridepublic void delSongerById(int songId) {songerMapper.deleteByPrimaryKey(songId);}
}
4.2.4 创建mybatis的全局配置文件
在resources里面创建sqlMapConfig.xml
注册映射配置文件SongerMapper.xml
<!DOCTYPE configurationPUBLIC "-//mybatis.org//DTD Config 3.0//EN""http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration><mappers><mapper resource="mapper/SongerMapper.xml"/><mapper resource="mapper/AlbumMapper.xml"/><mapper resource="mapper/MtypeMapper.xml"/></mappers>
</configuration>
4.2.5 创建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"><!--spring配置文件--><!--自动扫描 扫描所有需要spring管理的对象--><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="${db.driverClassName}"></property><property name="url" value="${db.url}"></property><property name="username" value="${db.username}"></property><property name="password" value="${db.password}"></property></bean><!--spring和mybatis整合--><bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"><property name="dataSource" ref="dataSource"></property><property name="configLocation" value="classpath:sqlMapConfig.xml"></property></bean><!--自动扫描mapper接口,并创建代理实现类,交给spring管理--><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配置--><aop:config><aop:advisor advice-ref="txAdvice" pointcut="execution(* com.qcby.service..*.*(..))"></aop:advisor></aop:config>
</beans>
4.2.6 在测试资源包内测试整合
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = {"classpath:beans.xml"})
public class SongerTest {@AutowiredSongerService songerService;@Testpublic void testAdd(){Songer s = new Songer();s.setArea("北京");s.setIntro("很好");s.setIsHot(1);s.setPic("zz");s.setSrname("阳哥");songerService.addSonger(s);}@Testpublic void getById(){Songer songer = songerService.getSongerById(1);System.out.println(songer);}@Testpublic void updateSonger(){Songer songer = songerService.getSongerById(1);songer.setSrname("最亮的仔");songerService.updateSonger(songer);}@Testpublic void delSongerById(){songerService.delSongerById(1);}
}
5 公共代码抽取
5.1 创建baseDao
package com.qcby.dao;import java.util.List;public interface BaseDao<Q, T> {/*** 保存数据* @param t*/public int insert(T t);/*** 根据主键查询对象* @param id* @return*/public T selectByPrimaryKey(Integer id);/*** 根据主键删除数据* @param id*/public int deleteByPrimaryKey(Integer id);/*** 修改数据* @param*/public int updateByPrimaryKeySelective(T t);/*** 查询所有的记录* @return*/public List<T> selectObjectAll();/*** 根据查询条件来查询数据* @param q* @return*/public List<T> selectObjectByCondition(Q q);/*** 根据查询条件来查询符合条件的记录数* @param q* @return*/public int selectObjectByConditionCount(Q q);}
5.2 创建专辑的Dao接口
public interface AlbumMapper extends BaseDao<AlbumQuery, Album> {}
类图
5.3 创建公共的Service接口
package com.qcby.service;import com.qcby.model.Page;import java.util.List;public interface BaseService<Q, T> {/*** 保存数据* @param t*/public void insert(T t);/*** 根据主键查询对象* @param id* @return*/public T selectByPrimaryKey(Integer id);/*** 根据主键删除数据* @param id*/public void deleteByPrimaryKey(Integer id);/*** 修改数据* @param*/public void updateByPrimaryKeySelective(T t);/*** 查询所有的记录* @return*/public List<T> selectObjectAll();/*** 分页查询* @param q* @return*/public Page<T> selectObjectByCondition(Q q);
}
5.4 创建公共Service的实现类
package com.qcby.service.impl;import com.qcby.dao.BaseDao;
import com.qcby.model.Page;
import com.qcby.service.BaseService;import java.lang.reflect.Method;
import java.util.List;public class BaseServiceImpl<Q,T> implements BaseService<Q,T> {protected BaseDao<Q, T> baseDao;@Overridepublic void insert(T t) {baseDao.insert(t);}@Overridepublic T selectByPrimaryKey(Integer id) {return baseDao.selectByPrimaryKey(id);}@Overridepublic void deleteByPrimaryKey(Integer id) {baseDao.deleteByPrimaryKey(id);}@Overridepublic void updateByPrimaryKeySelective(T t) {baseDao.updateByPrimaryKeySelective(t);}@Overridepublic List<T> selectObjectAll() {return baseDao.selectObjectAll();}@Overridepublic Page<T> selectObjectByCondition(Q q) {//获得查询对象的类对象Class<? extends Object> qclass = q.getClass();Page<T> page = new Page<T>();try {//获得getPageNo对象Method method = qclass.getMethod("getPageNo", null);//反射调用getPageNo方法Integer pageNo = (Integer) method.invoke(q, null);//创建page对象page.setPageNo(pageNo);//计算开始行号和结束行号int startNum = page.getStartNum();//好的查询对象 的设置开始行号和结束行号的方法Method setStartNumMethod = qclass.getMethod("setStartNum", new Class[]{int.class});setStartNumMethod.invoke(q, startNum);} catch (Exception e) {e.printStackTrace();}//查询结果集List<T> list = baseDao.selectObjectByCondition(q);//查询指定查询条件下的总记录数int count = baseDao.selectObjectByConditionCount(q);//把总记录数设置给page对象page.setTotalCount(count);page.setList(list);return page;}
}
5.5 创建专辑的Service接口
public interface AlbumService extends BaseService<AlbumQuery, Album> {}
5.6 创建专辑的Service接口实现类
package com.qcby.service.impl;import com.qcby.dao.AlbumMapper;
import com.qcby.model.Album;
import com.qcby.query.AlbumQuery;
import com.qcby.service.AlbumService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;@Service
public class AlbumServiceImpl extends BaseServiceImpl<AlbumQuery, Album> implements AlbumService {private AlbumMapper albumMapper;@Autowiredpublic void setAlbumMapper(AlbumMapper albumMapper) {this.albumMapper = albumMapper;this.baseDao = albumMapper;}
}
类图
5.7 创建测试类
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = {"classpath:beans.xml"})
public class AlbumTest {@AutowiredAlbumService albumService;@Testpublic void testAdd(){Album a = new Album();a.setAname("直到世界尽头");a.setCompany("史诗巨作");a.setPdate(new Date());a.setLang("1");albumService.insert(a);}@Testpublic void getById(){Album album = albumService.selectByPrimaryKey(2);System.out.println(album);}@Testpublic void updateSonger(){Album album = albumService.selectByPrimaryKey(2);album.setCompany("唱片");albumService.updateByPrimaryKeySelective(album);}@Testpublic void delSongerById(){albumService.deleteByPrimaryKey(2);}@Testpublic void selectByCondition(){AlbumQuery aq = new AlbumQuery();aq.setAname("世界");aq.setPdate(new Date());List<Album> albums = albumService.selectObjectAll();System.out.println(albums);}
}
6 代码生成器
在src/test/resources资源包下创建模板文件
6.1 创建模板
1. DemoMapper
package com.qcby.dao;import com.qcby.model.Demo;import com.qcby.query.DemoQuery;public interface DemoMapper extends BaseDao<DemoQuery, Demo>{}
2. DemoQuery
package com.qcby.query;import com.qcby.model.Demo;public class DemoQuery extends Demo {}
3. DemoService
package com.qcby.service;import com.qcby.model.Demo;
import com.qcby.query.DemoQuery;public interface DemoService extends BaseService<DemoQuery, Demo>{}
4. DemoServiceImpl
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.query.DemoQuery;
import com.qcby.service.DemoService;
@Service
public class DemoServiceImpl extends BaseServiceImpl<DemoQuery, Demo> implementsDemoService {private DemoMapper demoDao;@Autowiredpublic void setBrandDao(DemoMapper demoDao) {this.demoDao = demoDao;this.baseDao = demoDao;}}
6.2 代码生成器执行类
package com.qcby.util;import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileReader;
import java.io.FileWriter;public class SourceGenerator {public static void main(String[] args) throws Exception {generatorSource("TxUser");}public static void generatorSource(String objName) throws Exception{generateQuery(objName);generateDao(objName);generateService(objName);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{//把传递过来的实体类的名字改成小写一份String 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();}}