一、創建Spring Boot項目
參考:使用IntelliJ IDEA創建簡單的Spring Boot項目
二、數據庫、表的創建
三、項目開發
3.1 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 https://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.2.2.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent> <groupId>com.yh</groupId> <artifactId>demo</artifactId> <version>0.0.1-SNAPSHOT</version> <name>demo</name> <description>Demo project for Spring Boot</description> <properties> <java.version>1.8</java.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> <exclusions> <exclusion> <groupId>org.junit.vintage</groupId> <artifactId>junit-vintage-engine</artifactId> </exclusion> </exclusions> </dependency> <dependency> <groupId>org.webjars</groupId> <artifactId>jquery</artifactId> <version>3.4.1</version> </dependency> <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>2.1.0</version> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> </dependency> <dependency> <groupId>com.mchange</groupId> <artifactId>c3p0</artifactId> <version>0.9.5.4</version> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-thymeleaf</artifactId> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project>
3.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> <!-- 配置全局屬性 --> <settings> <setting name="useGeneratedKeys" value="true"/> <!--別名--> <setting name="useColumnLabel" value="true"/> <!--名稱轉換--> <setting name="mapUnderscoreToCamelCase" value="true"/> </settings> </configuration>
3.3 dao配置類datasource和sessionfactory
DataSourceConfiguration.java
package com.yh.demo.config.dao; import com.mchange.v2.c3p0.ComboPooledDataSource; import org.mybatis.spring.annotation.MapperScan; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import java.beans.PropertyVetoException; @Configuration // 配置mybaits的mapper掃描路徑 @MapperScan("com.yh.demo.dao") public class DataSourceConfiguration { @Value("${jdbc.driver}") private String jdbcDriver; @Value("${jdbc.url}") private String jdbcUrl; @Value("${jdbc.username}") private String jdbcUser; @Value("${jdbc.password}") private String jdbcPassword; @Bean("dataSource") public ComboPooledDataSource createDataSource() throws PropertyVetoException { ComboPooledDataSource dataSource = new ComboPooledDataSource(); dataSource.setDriverClass(jdbcDriver); dataSource.setJdbcUrl(jdbcUrl); dataSource.setUser(jdbcUser); dataSource.setPassword(jdbcPassword); // 配置c3p0連接池的私有屬性 // 連接池最大線程數 dataSource.setMaxPoolSize(30); // 連接池最小線程數 dataSource.setMinPoolSize(10); // 連接池初始化連接數 dataSource.setInitialPoolSize(15); // 關閉連接后不自動commit dataSource.setAutoCommitOnClose(false); return dataSource; } }
SessionFactoryConfiguration.java
package com.yh.demo.config.dao; import org.apache.ibatis.session.SqlSessionFactory; import org.mybatis.spring.SqlSessionFactoryBean; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.core.io.ClassPathResource; import org.springframework.core.io.support.PathMatchingResourcePatternResolver; import javax.sql.DataSource; import java.io.IOException; @Configuration public class SessionFactoryConfiguration { @Value("${mybatis_config_file}") private String mybatisConfigFilePath; @Value("${entity_package}") private String entityPackage; @Value("${mapper_path}") private String mapperPath; @Autowired @Qualifier("dataSource") private DataSource dataSource; @Bean("sqlSessionFactory") public SqlSessionFactoryBean createFactory() throws IOException { SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean(); sqlSessionFactoryBean.setConfigLocation(new ClassPathResource(mybatisConfigFilePath)); PathMatchingResourcePatternResolver resolver = new PathMatchingResourcePatternResolver(); String packageSearchPath = PathMatchingResourcePatternResolver.CLASSPATH_ALL_URL_PREFIX + mapperPath; sqlSessionFactoryBean.setMapperLocations(resolver.getResources(packageSearchPath)); sqlSessionFactoryBean.setDataSource(dataSource); sqlSessionFactoryBean.setTypeAliasesPackage(entityPackage); return sqlSessionFactoryBean; } }
3.4 dao和mapper的編寫
RunoobDao.java
package com.yh.demo.dao; import com.yh.demo.entity.Runoob; import java.util.List; public interface RunoobDao { List<Runoob> queryRunoob(); int insertRunoob(Runoob runoob); }
RunoobDao.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.yh.demo.dao.RunoobDao"> <select id="queryRunoob" resultType="com.yh.demo.entity.Runoob"> select* from runoob_tbl </select> <insert id="insertRunoob" parameterType="com.yh.demo.entity.Runoob"> insert into runoob_tbl(runoob_title)values (#{runoobTitle}) </insert> </mapper>
3.5 service配置類TransactionManagementConfiguration
TransactionManagementConfiguration.java
package com.yh.demo.config.service; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Configuration; import org.springframework.jdbc.datasource.DataSourceTransactionManager; import org.springframework.transaction.TransactionManager; import org.springframework.transaction.annotation.EnableTransactionManagement; import org.springframework.transaction.annotation.TransactionManagementConfigurer; import javax.sql.DataSource; @Configuration @EnableTransactionManagement public class TransactionManagementConfiguration implements TransactionManagementConfigurer { @Autowired private DataSource dataSource; @Override public TransactionManager annotationDrivenTransactionManager() { return new DataSourceTransactionManager(dataSource); } }
3.6 service層接口和實現
RunoobService.java
package com.yh.demo.service; import com.yh.demo.entity.Runoob; import java.util.List; public interface RunoobService { List<Runoob> queryRunoob(); int insertRunoob(Runoob runoob); }
RunoobServiceImpl.java
package com.yh.demo.service.serviceImpl; import com.yh.demo.dao.RunoobDao; import com.yh.demo.entity.Runoob; import com.yh.demo.service.RunoobService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.util.List; @Service public class RunoobServiceImpl implements RunoobService { @Autowired private RunoobDao runoobDao; @Override public List<Runoob> queryRunoob() { return runoobDao.queryRunoob(); } @Transactional @Override public int insertRunoob(Runoob runoob) { return runoobDao.insertRunoob(runoob); } }
3.7 controller方法實現
RunoobController.java
package com.yh.demo.controller.data; import com.yh.demo.entity.Runoob; import com.yh.demo.service.RunoobService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RestController; import javax.servlet.http.HttpServletResponse; import java.util.HashMap; import java.util.List; import java.util.Map; @RestController @RequestMapping("/runoob") public class RunoobController { @Autowired private RunoobService runoobService; @RequestMapping(value = "/query",method = RequestMethod.GET) public Map<String,Object> queryRunoob(HttpServletResponse response){ response.setHeader("Access-Control-Allow-Origin", "http://localhost:8080"); response.setHeader("Access-Control-Allow-Methods", "GET,POST"); Map<String,Object> modelMap = new HashMap<String,Object>(); List<Runoob> runoobs = runoobService.queryRunoob(); modelMap.put("runoobList",runoobs); System.out.println("========"); return modelMap; } @RequestMapping(value = "/insert",method = RequestMethod.POST) public Map<String,Object> insertRunoob(@RequestBody Runoob runoob){ Map<String,Object> modelMap = new HashMap<String, Object>(); modelMap.put("success",runoobService.insertRunoob(runoob)); return modelMap; } }
四、其他文件
4.1 application.properties
server.port=8082 server.servlet.context-path=/demo jdbc.driver=com.mysql.cj.jdbc.Driver jdbc.url=jdbc:mysql://localhost:3306/book?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=UTC jdbc.username=root jdbc.password=12345yehuan #mybatis mybatis_config_file=mybatis-config.xml mapper_path=/mapper/**.xml entity_package=com.yh.demo.entity
4.2 實體類
Runoob.java
package com.yh.demo.entity; public class Runoob { private int runoobId; private String runoobTitle; public int getRunoobId() { return runoobId; } public void setRunoobId(int runoobId) { this.runoobId = runoobId; } public String getRunoobTitle() { return runoobTitle; } public void setRunoobTitle(String runoobTitle) { this.runoobTitle = runoobTitle; } @Override public String toString() { return "Runoob{" + "runoobId=" + runoobId + ", runoobTitle='" + runoobTitle + '\'' + '}'; } }
4.3 項目結構
五、dao測試
選定dao接口名 - alt+enter - create test -選擇需要測試的方法,在test下的對應路徑下就會生成對應的測試類,如下所示:
RunoobDaoTest.java
package com.yh.demo.dao; import com.yh.demo.entity.Runoob; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.context.junit4.SpringRunner; import java.util.List; import static org.junit.jupiter.api.Assertions.*; @RunWith(SpringRunner.class) @SpringBootTest public class RunoobDaoTest { @Autowired private RunoobDao runoobDao; @Test public void queryRunoob() { List<Runoob> runoobs = runoobDao.queryRunoob(); System.out.println(runoobs.toString()); assertEquals(1,runoobs.size()); } @Test public void insertRunoob() { Runoob runoob = new Runoob(); runoob.setRunoobTitle("第二條"); int result = runoobDao.insertRunoob(runoob); assertEquals(1,result); } }