SSM项目练习------hami音乐(一)中已经讲述了基本的项目框架搭建和数据库环境搭建,接下来是开发的代码编程部分。
接下来先准备代码的核心公共部分的编写,提取公共代码,根据代码生成器编写基础代码。
5. 公共代码的抽取
5.1 创建baseDao
java
package cn.tx.dao;
import java.util.List;
/*
* 持久层:base接口
* 目的:抽取公用方法
**/
public interface BaseDao<T,Q> {
//通过主键删除
int deleteByPrimaryKey(Integer tid);
//新增保存数据
int insert(T record);
//根据主键查询对象
T selectByPrimaryKey(Integer tid);
//通过传递实体类及实体类的主键作为条件进行修改
int updateByPrimaryKey( T record);
int insertSelective( T record);
//修改数据
int updateByPrimaryKeySelective( T record);
// 根据查询条件来查询数据的记录
List<T> selectByPage(Q q);
//根据查询条件来查询符合条件的记录数
Integer selectCount(Q q);
}
5.2 创建专辑的Dao接口

java
public interface AlbumMapper extends BaseDao<AlbumQuery, Album> {}
5.3 创建公共的Service接口
java
package cn.tx.service;
import cn.tx.util.Page;
public interface BaseService<T,Q> {
//通过主键删除
int deleteByPrimaryKey(Integer tid);
//新增/保存数据
int insert(T record);
//根据主键查询对象
T selectByPrimaryKey(Integer tid);
//通过传递实体类及实体类的主键作为条件进行修改
int updateByPrimaryKey( T record);
int insertSelective( T record);
//修改数据
int updateByPrimaryKeySelective( T record);
/**
* 分页查询
* @param q
* @return
*/
public Page<T> selectByPage(Q q);
}
5.4 创建公共Service的实现类
java
package cn.tx.service.impl;
import cn.tx.dao.BaseDao;
import cn.tx.service.BaseService;
import cn.tx.util.Page;
import java.lang.reflect.Method;
import java.util.List;
/*
* 调用持久层
* */
public class BaseServiceImpl<T,Q> implements BaseService<T,Q> {
//使用公用持久层
//@Autowired 可以 繁琐 相当于注入两次
// public default 同包:protected private
protected BaseDao<T,Q> baseDao;
@Override
public int deleteByPrimaryKey(Integer tid) {
return baseDao.deleteByPrimaryKey(tid);
}
@Override
public int insert(T record) {
return baseDao.insert(record);
}
@Override
public T selectByPrimaryKey(Integer tid) {
return baseDao.selectByPrimaryKey(tid);
}
@Override
public int updateByPrimaryKey(T record) {
return baseDao.updateByPrimaryKey(record);
}
@Override
public int insertSelective(T record) {
return baseDao.insertSelective(record);
}
@Override
public int updateByPrimaryKeySelective(T record) {
return baseDao.updateByPrimaryKeySelective(record);
}
@Override
public Page<T> selectByPage(Q q) {
//为Page对象封装6个属性
Page<T> page = new Page<>();
//拿到泛型q的类对象
Class<?> qClass = q.getClass();
//1.利用反射反向拿去该泛型的PageSize和PageNum
try {
//获得getPageSize和getPageNum对象
Method getPageSize = qClass.getMethod("getPageSize", null);
Method getPageNum = qClass.getMethod("getPageNum", null);
//反射调用getPageSize和getPageNum方法
Integer pageSize = (Integer) getPageSize.invoke(q, null);
Integer pageNum = (Integer) getPageNum.invoke(q, null);
//属性值
page.setPageNum(pageNum);
page.setPageSize(pageSize);
page.setStartNum((pageNum-1)*pageSize);
//设置Query对象中的startNum属性值
Method setStartNum = qClass.getDeclaredMethod("setStartNum", Integer.class);
setStartNum.invoke(q, (pageNum - 1) * pageSize);
//查询结果表
List<T> list = baseDao.selectByPage(q);
page.setList(list);
//查询总记录数
Integer count = baseDao.selectCount(q);
page.setTotalCount(count);
page.setTotalPage(count/pageSize);
} catch (Exception e) {
throw new RuntimeException(e);
}
return page;
}
}
5.5 创建专辑的Service接口
java
public interface AlbumService extends BaseService<AlbumQuery, Album> {}
5.6 创建专辑的Service接口的实现类

java
@Service
public class AlbumServiceImpl extends BaseServiceImpl<Album, AlbumQuery> implements AlbumService {
private AlbumMapper albumMapper;
@Autowired
public void setAlbumMapper(AlbumMapper albumMapper){
this.albumMapper=albumMapper;
this.baseDao=albumMapper;
}
@Override
public List<Album> selectAll(){
return albumMapper.selectAll();
}
@Override
public List<Album> selectByName(Album album){
return albumMapper.selectByName(album);
}
}
5.7 创建测试类
java
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = {"classpath:beans.xml"})
public class AlbumTest {
@Autowired
AlbumService albumService;
@Test
public void testAdd(){
Album a = new Album();
a.setAname("直到世界尽头");
a.setCompany("史诗巨作");
a.setPdate(new Date());
a.setLang("1");
albumService.insert(a);
}
@Test
public void getById(){
Album album = albumService.selectByPrimaryKey(2);
System.out.println(album);
}
@Test
public void updateSonger(){
Album album = albumService.selectByPrimaryKey(2);
album.setCompany("唱片");
albumService.updateByPrimaryKeySelective(album);
}
@Test
public void delSongerById(){
albumService.deleteByPrimaryKey(2);
}
@Test
public 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)DamoMapper
java
package cn.tx.dao;
import cn.tx.model.Demo;
import cn.tx.query.DemoQuery;
public interface DemoMapper extends BaseDao<DemoQuery, Demo>{}
(2)DemoQuery
java
package cn.tx.query;
import cn.tx.model.Demo;
public class DemoQuery extends Demo {}
(3)DemoService
java
package cn.tx.service;
import cn.tx.model.Demo;
import cn.tx.query.DemoQuery;
public interface DemoService extends BaseService<DemoQuery, Demo>{}
(4)DemoServiceImpl
java
package cn.tx.service.impl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import cn.tx.dao.DemoMapper;
import cn.tx.model.Demo;
import cn.tx.query.DemoQuery;
import cn.tx.service.DemoService;
@Service
public class DemoServiceImpl extends BaseServiceImpl<DemoQuery, Demo> implements DemoService {
private DemoMapper demoDao;
@Autowired
public void setBrandDao(DemoMapper demoDao) {
this.demoDao = demoDao;
this.baseDao = demoDao;
}
}
6.2 代码生成器执行类
java
package cn.tx.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("Mtype");
}
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/cn/tx/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/cn/tx/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/cn/tx/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/cn/tx/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();
}
}