Skip to content

Commit a3b68f1

Browse files
author
bretislav.wajtr
committed
Initial implementation of the mybatis version of the DataRepository
Added gradle dependencies and basic configuration Also implemented first selects so some of the junit tests are now passing...
1 parent 8806a15 commit a3b68f1

5 files changed

Lines changed: 174 additions & 2 deletions

File tree

build.gradle

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ tasks.withType(JavaCompile) {
2727
dependencies {
2828
compile "org.springframework.boot:spring-boot-starter-jdbc"
2929
compile "org.springframework.boot:spring-boot-starter-jooq"
30+
compile 'org.mybatis.spring.boot:mybatis-spring-boot-starter:1.1.1'
3031
compile "org.postgresql:postgresql:9.4.1211.jre7"
3132
compile "org.apache.commons:commons-lang3:3.4"
3233
compile "org.apache.commons:commons-collections4:4.1"
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
package com.clevergang.dbtests.repository.impl.mybatis;
2+
3+
import com.clevergang.dbtests.repository.api.DataRepository;
4+
import com.clevergang.dbtests.repository.api.data.Company;
5+
import com.clevergang.dbtests.repository.api.data.Department;
6+
import com.clevergang.dbtests.repository.api.data.Employee;
7+
import com.clevergang.dbtests.repository.api.data.ProjectsWithCostsGreaterThanOutput;
8+
import org.apache.ibatis.annotations.Mapper;
9+
10+
import java.util.List;
11+
12+
/**
13+
* "Implementation" of the DataRepository using MyBatis. Note, that in this project
14+
* we have to extend the DataRepository interface, because this interface is actually
15+
* implemented also by other technologies - however if we decide for MyBatis as a
16+
* SQL mapping framework for some other project, it would be an overkill to do it this way. We would
17+
* directly use this @Mapper interface as a Spring bean.
18+
*
19+
* @author Bretislav Wajtr <bretislav.wajtr@ibacz.eu>
20+
*/
21+
@Mapper
22+
public interface MyBatisDataRepositoryImpl extends DataRepository {
23+
24+
Company findCompany(Integer pid);
25+
26+
Department findDepartment(Integer pid);
27+
28+
List<Employee> employeesWithSalaryGreaterThan(Integer minSalary);
29+
30+
List<ProjectsWithCostsGreaterThanOutput> getProjectsWithCostsGreaterThan(int totalCostBoundary);
31+
}

src/main/resources/application.properties

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,16 @@ spring.datasource.password=test
66
# jooq settings
77
spring.jooq.sql-dialect=Postgres
88

9-
# logging settings
9+
# mybatis settings
10+
mybatis.mapper-locations=mybatis/mappers/*.xml
11+
12+
13+
# logging settings for Spring JDBC Template
1014
logging.level.org.springframework.jdbc=DEBUG
11-
logging.level.org.jooq=DEBUG
15+
16+
# logging settings for jOOQ
17+
logging.level.org.jooq=DEBUG
18+
19+
# logging settings for mybatis
20+
logging.level.org.mybatis=DEBUG
21+
logging.level.com.clevergang.dbtests.repository.impl.mybatis.MyBatisDataRepositoryImpl=TRACE
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
<?xml version="1.0" encoding="UTF-8" ?>
2+
<!DOCTYPE mapper
3+
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
4+
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
5+
<mapper namespace="com.clevergang.dbtests.repository.impl.mybatis.MyBatisDataRepositoryImpl">
6+
7+
<select id="findCompany" resultType="com.clevergang.dbtests.repository.api.data.Company">
8+
select * from company where pid = #{pid}
9+
</select>
10+
11+
<select id="findDepartment" resultType="com.clevergang.dbtests.repository.api.data.Department">
12+
select * from department where pid = #{pid}
13+
</select>
14+
15+
<select id="employeesWithSalaryGreaterThan" resultType="com.clevergang.dbtests.repository.api.data.Employee">
16+
select * from employee where salary > #{minSalary}
17+
</select>
18+
19+
<select id="getProjectsWithCostsGreaterThan" resultType="com.clevergang.dbtests.repository.api.data.ProjectsWithCostsGreaterThanOutput">
20+
WITH
21+
project_info AS (
22+
SELECT project.pid project_pid, project.name project_name, salary monthly_cost, company.name company_name
23+
FROM project
24+
JOIN projectemployee ON project.pid = projectemployee.project_pid
25+
JOIN employee ON projectemployee.employee_pid = employee.pid
26+
LEFT JOIN department ON employee.department_pid = department.pid
27+
LEFT JOIN company ON department.company_pid = company.pid
28+
),
29+
project_cost AS (
30+
SELECT project_pid, sum(monthly_cost) total_cost
31+
FROM project_info GROUP BY project_pid
32+
)
33+
SELECT project_name, total_cost, company_name, sum(monthly_cost) company_cost FROM project_info
34+
JOIN project_cost USING (project_pid)
35+
WHERE total_cost > #{totalCostBoundary}
36+
GROUP BY project_name, total_cost, company_name
37+
</select>
38+
39+
</mapper>
Lines changed: 91 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,91 @@
1+
package com.clevergang.dbtests;
2+
3+
import com.clevergang.dbtests.repository.impl.mybatis.MyBatisDataRepositoryImpl;
4+
import org.junit.Before;
5+
import org.junit.Test;
6+
import org.junit.runner.RunWith;
7+
import org.springframework.beans.factory.annotation.Autowired;
8+
import org.springframework.boot.test.context.SpringBootTest;
9+
import org.springframework.test.annotation.Rollback;
10+
import org.springframework.test.context.ContextConfiguration;
11+
import org.springframework.test.context.junit4.SpringRunner;
12+
import org.springframework.transaction.annotation.Transactional;
13+
14+
/**
15+
* @author Bretislav Wajtr <bretislav.wajtr@ibacz.eu>
16+
*/
17+
@RunWith(SpringRunner.class)
18+
@SpringBootTest
19+
@ContextConfiguration(classes = DbTestsApplication.class)
20+
@Transactional
21+
@Rollback
22+
public class MyBatisScenariosTest {
23+
24+
@SuppressWarnings("SpringJavaAutowiringInspection")
25+
@Autowired
26+
private MyBatisDataRepositoryImpl myBatisDataRepository;
27+
28+
private Scenarios scenarios;
29+
30+
@Before
31+
public void setup() {
32+
scenarios = new Scenarios(myBatisDataRepository);
33+
}
34+
35+
36+
@Test
37+
public void scenarioOne() {
38+
scenarios.fetchSingleEntityScenario(1);
39+
}
40+
41+
@Test
42+
public void scenarioTwo() {
43+
scenarios.fetchListOfEntitiesScenario(2000);
44+
}
45+
46+
@Test
47+
public void scenarioThree() {
48+
scenarios.saveNewEntityScenario();
49+
}
50+
51+
@Test
52+
public void scenarioFour() {
53+
scenarios.batchInsertMultipleEntitiesScenario();
54+
}
55+
56+
@Test
57+
public void scenarioFive() {
58+
scenarios.updateCompleteEntityScenario();
59+
}
60+
61+
@Test
62+
public void scenarioSix() {
63+
scenarios.fetchManyToOneRelationScenario();
64+
}
65+
66+
@Test
67+
public void scenarioSeven() {
68+
scenarios.fetchOneToManyRelationScenario();
69+
}
70+
71+
@Test
72+
public void scenarioEight() {
73+
scenarios.updateCompleteOneToManyRelationScenario();
74+
}
75+
76+
@Test
77+
public void scenarioNine() {
78+
scenarios.executeComplexSelectScenario();
79+
}
80+
81+
@Test
82+
public void scenarioTen() {
83+
scenarios.callStoredProcedureScenario();
84+
}
85+
86+
@Test
87+
public void scenarioEleven() {
88+
scenarios.executeSimpleStaticStatementScenario();
89+
}
90+
91+
}

0 commit comments

Comments
 (0)