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();
   }
}
相关推荐
闻哥2 小时前
深入理解 ES 词库与 Lucene 倒排索引底层实现
java·大数据·jvm·elasticsearch·面试·springboot·lucene
2 小时前
java关于引用
java·开发语言
弹简特2 小时前
【JavaEE04-后端部分】Maven 小介绍:Java 开发的构建利器基础
java·maven
计算机毕设指导62 小时前
基于微信小程序的智能停车场管理系统【源码文末联系】
java·spring boot·微信小程序·小程序·tomcat·maven·intellij-idea
码云数智-大飞2 小时前
零拷贝 IPC:用内存映射文件打造 .NET 高性能进程间通信队列
java·开发语言·网络
懈尘2 小时前
深入理解Java的HashMap扩容机制
java·开发语言·数据结构
indexsunny2 小时前
互联网大厂Java面试实战:从Spring Boot到Kafka的技术与业务场景解析
java·spring boot·redis·面试·kafka·技术栈·microservices
roman_日积跬步-终至千里2 小时前
【Java并发】Tomcat 与 Spring:后端项目中的线程与资源管理
java·spring·tomcat
独自破碎E2 小时前
IDEA 提示“未配置SpringBoot配置注解处理器“的解决方案
java·spring boot·intellij-idea