SSM项目练习——hami音乐(二)

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();
   }
}
相关推荐
毕设源码-钟学长6 分钟前
【开题答辩全过程】以 国产汽车的在线销售系统为例,包含答辩的问题和答案
java
亓才孓19 分钟前
【MyBatis Plus】Wrapper接口
java·开发语言·数据库·spring boot·mybatis
tianzhiyi1989sq29 分钟前
C++工具库之PugiXML使用指南
java·数据库·c++
毕设源码-钟学长32 分钟前
【开题答辩全过程】以 哈尔滨市小酒窝APP为例,包含答辩的问题和答案
java
人道领域42 分钟前
MyBatisPlus高效开发实战指南
java·开发语言·数据库
AALoveTouch1 小时前
逆向利器:Frida Hook
java·python
春和景明3601 小时前
费曼学习法
java
组合缺一1 小时前
赋予 AI 灵魂:如何在 Java AI 生态实现一个会“自我反思”的长期记忆系统
java·人工智能·ai·llm·agent·solon·mcp
wangbing11251 小时前
开发指南142-类和字符串转换
java·开发语言
A懿轩A2 小时前
【Java 基础编程】Java 集合框架详解:List/Set/Map 选型 + ArrayList/HashMap 原理与使用
java·windows·list