SSM整合
1.在数据库中创建表,并导入数据
sql语句
CREATE DATABASE wyy_music;
USE wyy_music;
DROP TABLE IF EXISTS `tb_music`;
CREATE TABLE `tb_music` (
`music_id` int(11) NOT NULL AUTO_INCREMENT, -- 歌曲ID
`music_name` VARCHAR(255) NOT NULL, -- 歌曲名称
`music_album_name` VARCHAR(255) NOT NULL, -- 专辑名称
`music_album_picUrl` VARCHAR(255) NOT NULL, -- 专辑图片路径
`music_mp3Url` VARCHAR(255) NOT NULL, -- 歌曲播放路径
`music_artist_name` VARCHAR(255) NOT NULL, -- 歌手名称
`sheet_id` int(11) DEFAULT NULL, -- 对应的歌单ID
PRIMARY KEY (`music_id`)
) ENGINE=INNODB DEFAULT CHARSET=utf8;
INSERT INTO tb_music VALUES ('1', '光年之外', '光年之外', '//y.qq.com/music/photo_new/T002R300x300M000001mTkmb4GJlh4_1.jpg?max_age=2592000', 'http://dl.stream.qqmusic.qq.com/C4000029Lt3K2XVP75.m4a?guid=9466964098&vkey=C4E6AB1F9F5A140F233BF1BD4E9E1C96DD52547C82F8BF8101037E1A9F212DC861099D1F615117A7821AD26EC1DEC598F0D94A77D6E35683&uin=729953102&fromtag=66', 'G.E.M.邓紫棋','1');
INSERT INTO tb_music VALUES ('2', '夜空中最亮的星', '世界', '//y.qq.com/music/photo_new/T001R300x300M000001Yxpxc0OaUUX.jpg?max_age=2592000', 'http://dl.stream.qqmusic.qq.com/C400002EHg2B2FPi71.m4a?guid=5359545528&vkey=38B7183C0E0D20D7AC35460A6C5446CB7A926254BD1E35898CB096D6381FB4B15B001C00EE34308E0549718E29601433C9FE4DD85960F7C2&uin=729953102&fromtag=66', '逃跑计划','1');
INSERT INTO tb_music VALUES ('3', '只要平凡', '只要平凡', '//y.qq.com/music/photo_new/T002R300x300M000000K7srf1rZtOX_1.jpg?max_age=2592000', 'http://dl.stream.qqmusic.qq.com/C400004BwbUM0vWzAt.m4a?guid=4198275520&vkey=F846EA79763CE8C226A77FF6EE3077B9D7A71A5A333A8ED1233EA5DB13AEC831E3E83D42172C8231E32EE9EF09E7AE0A746D16B3925CC317&uin=729953102&fromtag=66', '张杰/张碧晨','2');
DROP TABLE IF EXISTS `tb_sheet`;
CREATE TABLE `tb_sheet` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`sheet_name` varchar(255) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
INSERT INTO tb_sheet VALUES ('1', '热歌榜');
INSERT INTO tb_sheet VALUES ('2', '新歌榜');
INSERT INTO tb_sheet VALUES ('3', '原创榜');
2.创建web工程,导入依赖
<dependencies>
<!-- spring -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.3.20</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>5.3.20</version>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.9.9.1</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>5.3.20</version>
</dependency>
<!-- mybatis -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.9</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>2.0.7</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.29</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.2.9</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.24</version>
</dependency>
<!-- servlet -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>4.0.1</version>
</dependency>
<!-- jackson -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.13.3</version>
</dependency>
<!-- 分页 -->
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper</artifactId>
<version>5.3.0</version>
</dependency>
<!-- 日志 -->
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
</dependencies>
3.配置相关properties文件
3.1关联数据库db.properties
db.username = root
db.password = 123456
db.url = jdbc:mysql:///wyy_music?serverTimezone=Asia/Shanghai&characterEncoding=UTF8
db.driverClassName = com.mysql.cj.jdbc.Driver
3.2日志log4j.properties
# Global logging configuration
log4j.rootLogger=DEBUG, stdout
# Console output...
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n
4.配置web.xml
<web-app>
<display-name>Archetype Created Web Application</display-name>
<!-- 考虑:spring相关配置文件的加载时机
spring配置文件的生命周期恰好和ServletContext对象的生命周期一致
-->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:applicationContext.xml</param-value>
</context-param>
<!-- 用于加载applicationContext.xml -->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<!-- 前端控制器 -->
<servlet>
<servlet-name>dispatcherServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!-- 加载springmvc.xml -->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springmvc.xml</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>dispatcherServlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
5.编写 applicationContext.xml
<?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:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop.xsd"> <!-- bean definitions here -->
<!-- 导入外部配置文件 db.properties -->
<context:property-placeholder location="classpath:db.properties"></context:property-placeholder>
<!-- 配置数据源对象 -->
<bean id="datasource" class="com.alibaba.druid.pool.DruidDataSource">
<!-- 导入 db.properties 中的值-->
<property name="username" value="${db.username}"></property>
<property name="password" value="${db.password}"></property>
<property name="url" value="${db.url}"></property>
<property name="driverClassName" value="${db.driver}"></property>
</bean>
<!-- 扫描对应包下的注解 -->
<context:component-scan base-package="com.couture"></context:component-scan>
<!-- 配置sqlSessionFactory -->
<bean id="sqlSessionFactoryBean" class="org.mybatis.spring.SqlSessionFactoryBean">
<!-- 必选配置 -->
<property name="dataSource" ref="datasource"></property>
<!-- 非必选属性,根据自己需求去配置 -->
<!-- 导入 mybatis-config.xml -->
<property name="configLocation" value="classpath:mybatis-config.xml"></property>
<!-- 导入 Mapper.xml 文件,classpath后面不能有空格 -->
<property name="mapperLocations" value="classpath:mapper/*.xml"></property>
</bean>
<!-- 扫描 Mapper 接口,生成代理对象 -->
<bean id="mapperScannerConfigurer" class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<!-- 指定扫描的具体位置 -->
<property name="basePackage" value="com.couture.mapper"></property>
</bean>
</beans>
6.编写 springmvc.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
https://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
https://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/mvc
https://www.springframework.org/schema/mvc/spring-mvc.xsd">
<!-- 配置springmvc中的组件
我们用到的 映射器,适配器,解析器 这三个组件都已经帮我们创建好了
-->
<mvc:annotation-driven/>
<!-- 扫描包下的注解 -->
<context:component-scan base-package="com.couture"></context:component-scan>
<!-- 放行静态资源 -->
<mvc:default-servlet-handler></mvc:default-servlet-handler>
</beans>
7.编写 mybatis-config.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<!-- 配置日志 -->
<settings>
<setting name="logImpl" value="LOG4J"/>
</settings>
</configuration>
8.编写实体类
Music
package com.couture.pojo;
import lombok.Data;
/**
* CREATE TABLE `tb_music` (
* `music_id` int(11) NOT NULL AUTO_INCREMENT, -- 歌曲ID
* `music_name` VARCHAR(255) NOT NULL, -- 歌曲名称
* `music_album_name` VARCHAR(255) NOT NULL, -- 专辑名称
* `music_album_picUrl` VARCHAR(255) NOT NULL, -- 专辑图片路径
* `music_mp3Url` VARCHAR(255) NOT NULL, -- 歌曲播放路径
* `music_artist_name` VARCHAR(255) NOT NULL, -- 歌手名称
* `sheet_id` int(11) DEFAULT NULL, -- 对应的歌单ID
* PRIMARY KEY (`music_id`)
* ) ENGINE=INNODB DEFAULT CHARSET=utf8;
*/
//歌曲
@Data
public class Music {
private Integer musicId;
private String musicName;
private String musicAlbumName;
private String musicAlbumPicurl;
private String musicMp3url;
private String musicArtistName;
private Integer sheetId;
}
9.编写Mapper接口
MusicMapper
package com.couture.mapper;
import com.couture.pojo.Music;
import org.springframework.stereotype.Repository;
import java.util.List;
@Repository
public interface MusicMapper {
/**
* 查询所有歌曲
* @return
*/
public List<Music> findAll();
}
10.编写Mapper.xml文件
MusicMapper.xml配置文件( 注意:存放位置和applicationContext.xml中设置的对应上 )
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.couture.mapper.MusicMapper">
<resultMap id="musicMap" type="com.couture.pojo.Music">
<id property="musicId" column="music_id"></id>
<result property="musicName" column="music_name"></result>
<result property="musicAlbumName" column="music_album_name"></result>
<result property="musicAlbumPicurl" column="music_album_picUrl"></result>
<result property="musicMp3url" column="music_mp3Url"></result>
<result property="musicArtistName" column="music_artist_name"></result>
<result property="sheetId" column="sheet_id"></result>
</resultMap>
<!-- sql判断 -->
<sql id="baseSql">
select music_id,
music_name,
music_album_name,
music_album_picUrl,
music_mp3Url,
music_artist_name,
sheet_id
from tb_music
</sql>
<!-- 查询所有歌曲 -->
<select id="findAll" resultMap="musicMap">
<include refid="baseSql"></include>
</select>
</mapper>
11.编写 Service
MusicService接口
package com.couture.service;
import com.couture.pojo.Music;
import java.util.List;
public interface MusicService {
/**
* 查询所有歌曲
* @return
*/
public List<Music> findAll();
}
12.编写ServiceImpl
MusicServiceImpl实现类
package com.couture.service.impl;
import com.couturecouture.mapper.MusicMapper;
import com.couture.pojo.Music;
import com.couture.service.MusicService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
/**
* Service层,业务逻辑层
*/
@Service
public class MusicServiceImpl implements MusicService {
@Autowired
private MusicMapper musicMapper;
/**
* 实现查询所有歌曲
* @return
*/
@Override
public List<Music> findAll() {
return musicMapper.findAll();
}
}
13.编写Controller
MusicController
package com.couture.controller;
import com.couture.pojo.Music;
import com.couture.service.MusicService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
@RestController
@RequestMapping("music")
public class MusicController {
@Autowired
private MusicService musicService;
/**
* 查询所有歌曲
* @return
*/
@RequestMapping("findAll")
public List<Music> findAll(){
return musicService.findAll();
}
}
14.测试
访问:localhost:8080/music/findAll 进行测试
添加分页操作
1.导入依赖(之前已经导入过了)
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper</artifactId>
<version>5.1.11</version>
</dependency>
2.配置分页插件(两种方式)
2.1 第一种:在 applicationContext.xml 中添加配置
<!-- 配置SqlSessionFactory -->
<bean id="sqlSessionFactoryBean" class="org.mybatis.spring.SqlSessionFactoryBean">
<!-- 必选属性,配置dataSource数据源 -->
<property name="dataSource" ref="dataSource"></property>
<!-- 非必选属性,可引入mybatis-config.xml配置文件 -->
<property name="configLocation" value="classpath:mybatis-config.xml"></property>
<!-- 非必选属性,当Mapper接口和对应的Mapper.xml文件不在同一目录时,
可配置Mapper.xml文件的具体位置 -->
<!-- <property name="mapperLocations" value="classpath:mapper/MusicMapper.xml"></property>-->
<property name="mapperLocations" value="classpath:mapper/*.xml"></property>
<!-- 分页配置 -->
<!-- 注意其他配置 -->
<property name="plugins">
<array>
<bean class="com.github.pagehelper.PageInterceptor">
<property name="properties">
<!--使用下面的方式配置参数,一行配置一个 -->
<value>
helperDialect=mysql
reasonable=true
supportMethodsArguments=true
</value>
</property>
</bean>
</array>
</property>
</bean>
2.2 第二种:在 mybatis-config.xml 中添加配置
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<plugins>
<plugin interceptor="com.github.pagehelper.PageInterceptor">
<property name="helperDialect" value="mysql"/>
<property name="reasonable" value="true"/>
<property name="supportMethodsArguments" value="true"/>
</plugin>
</plugins>
</configuration>
3.在 controller 中添加方法
@RequestMapping("findByPage")
public PageInfo findByPage(
@RequestParam(value = "pageNum",required = false,defaultValue = "1") Integer pageNum,
@RequestParam(value = "pageSize",required = false,defaultValue = "2") Integer pageSize){
PageHelper.startPage(pageNum,pageSize);
List<Music> musicList = musicService.findAll();
PageInfo<Music> musicPageInfo = new PageInfo<>(musicList);
return musicPageInfo;
}