Spring MyBatis H2.
В этой статье будет представлен пример интеграции Spring MyBatis + CRUD основных команд MyBatis'a. И так начнем с описания схемы базы данных H2 которая просто встраивается в Spring - schema.sql:
DROP TABLE IF EXISTS PERSON; CREATE TABLE PERSON ( ID INT NOT NULL AUTO_INCREMENT , FIRST_NAME VARCHAR(20) NOT NULL , LAST_NAME VARCHAR(20) NOT NULL , BIRTH_DATE DATE , UNIQUE UI_PERSON (FIRST_NAME, LAST_NAME) , PRIMARY KEY (ID) );
мы создаем таблицу PERSON где у нас будут храниться данные по человеку его имя, фамилия и дата рождения. Напишем скрип наполняюший эту таблицу произвольными данными - test-data.sql:
insert into person (first_name, last_name, birth_date) values ('Lopanov', 'Vitaly', '1981-08-23'); insert into person (first_name, last_name, birth_date) values ('Kozirev', 'Valera', '1952-01-01'); insert into person (first_name, last_name, birth_date) values ('Aristov', 'Sergey', '1964-10-13');
отобразим нашу табличку доменной моделью реализованной классом Person.java:
package com.vit.domain; import java.io.Serializable; import java.util.Date; public class Person implements Serializable { private Long id; private String firstName; private String lastName; private Date birthDate; public Long getId() { return id; } public void setId(Long id) { this.id = id; } public String getFirstName() { return firstName; } public void setFirstName(String firstName) { this.firstName = firstName; } public String getLastName() { return lastName; } public void setLastName(String lastName) { this.lastName = lastName; } public Date getBirthDate() { return birthDate; } public void setBirthDate(Date birthDate) { this.birthDate = birthDate; } @Override public String toString() { return "Person{" + "id=" + id + ", firstName='" + firstName + '\'' + ", lastName='" + lastName + '\'' + ", birthDate=" + birthDate + '}'; } }
опишим интерфейс доступа к данным, все операции CRUD:
package com.vit.persistence; import com.vit.domain.Person; import java.util.List; public interface PersonMapper { public ListfindAll(); public Person findById(Long id); public void insert(Person person); public void update(Person person); public void delete(Long id); }
с проектируем все SQL-запросы в специальном файле PersonMapper.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.vit.persistence.PersonMapper"> <resultMap id="personResultMap" type="Person"> <id property="id" column="ID" /> <result property="firstName" column="FIRST_NAME" /> <result property="lastName" column="LAST_NAME" /> <result property="birthDate" column="BIRTH_DATE" /> </resultMap> <select id="findAll" resultMap="personResultMap"> SELECT ID, FIRST_NAME, LAST_NAME, BIRTH_DATE FROM PERSON </select> <select id="findById" parameterType="long" resultMap="personResultMap"> SELECT ID,FIRST_NAME,LAST_NAME,BIRTH_DATE FROM PERSON WHERE ID = #{id} </select> <insert id="insert" parameterType="Person" useGeneratedKeys="true" keyProperty="id"> INSERT INTO PERSON (FIRST_NAME, LAST_NAME, BIRTH_DATE) VALUES (#{firstName}, #{lastName}, #{birthDate}) </insert> <update id="update" parameterType="Person"> UPDATE PERSON SET FIRST_NAME = #{firstName}, LAST_NAME = #{lastName}, BIRTH_DATE = #{birthDate} WHERE ID = #{id} </update> <delete id="delete" parameterType="long"> DELETE FROM PERSON WHERE ID = #{id} </delete> </mapper>
Опишем сервисный слой доступа к операциям CRUD c помощью интерфейса PersonService:
package com.vit.service; import com.vit.domain.Person; import java.util.List; public interface PersonService { // Find all persons public ListfindAll(); // Find by ID - person public Person findById(Long id); // Create a new or save an existing person public Person save(Person person); // Delete a person public void delete(Person person); }
и реализуем интерфес доступа PersonServiceImpl:
package com.vit.service; import com.vit.domain.Person; import com.vit.persistence.PersonMapper; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Repository; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.util.List; @Service("personService") @Repository @Transactional public class PersonServiceImpl implements PersonService { @Autowired private PersonMapper personMapper; public ListfindAll() { List persons = personMapper.findAll(); return persons; } public Person findById(Long id) { Person person = personMapper.findById(id); return person; } public Person save(Person person) { if (person.getId() == null) { insert(person); } else { update(person); } return person; } private Person insert(Person person) { personMapper.insert(person); return person; } private Person update(Person person) { personMapper.update(person); return person; } public void delete(Person person) { Long personId = person.getId(); personMapper.delete(personId); } }
осталось самое интересное интегрировать в Spring - MyBatis все это дело описывается парой строчек в конфигурационном файле 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:context="http://www.springframework.org/schema/context" xmlns:jdbc="http://www.springframework.org/schema/jdbc" xmlns:tx="http://www.springframework.org/schema/tx" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.1.xsd http://www.springframework.org/schema/jdbc http://www.springframework.org/schema/jdbc/spring-jdbc-3.1.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.1.xsd"> <!-- 1 --> <jdbc:embedded-database id="dataSource" type="H2"> <jdbc:script location="classpath:schema.sql" /> <jdbc:script location="classpath:test-data.sql" /> </jdbc:embedded-database> <!-- 2 --> <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dataSource" /> </bean> <tx:annotation-driven /> <!-- 3 --> <context:component-scan base-package="com.vit.service" /> <!-- 4 Define the SqlSessionFactory --> <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> <property name="dataSource" ref="dataSource" /> <property name="typeAliasesPackage" value="com.vit.domain" /> </bean> <!-- 5 Scan for mappers and let them be autowired --> <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"> <property name="basePackage" value="com.vit.persistence" /> </bean> </beans>
- спринг выполняет скрипты, создает и заполняет данными таблицу Person, и настраивается dataSource H2.
- создается менеджер транзакций - transactionManager.
- задается путь где Spring ищет наши компоненты.
- создается SqlSessionFactory mybatis'a.
- объект связывающий PersonMapper.xml с интерфейсом доступа к данным PersonMapper.
и осталось показать как работать со спрингом:
package com.vit; import com.vit.domain.Person; import com.vit.service.PersonService; import org.springframework.context.support.GenericXmlApplicationContext; import java.util.*; public class MyBatisSample { public static void main(String[] args) { GenericXmlApplicationContext ctx = new GenericXmlApplicationContext(); ctx.load("classpath:ApplicationContext.xml"); ctx.refresh(); PersonService personService = ctx.getBean("personService", PersonService.class); Listpersons; // Find all persons persons = personService.findAll(); listPersons(persons); // Find person by id persons = new ArrayList (); System.out.println("Finding person with id 1"); Person person = personService.findById(1L); persons.add(person); listPersons(persons); // Add new person System.out.println("Add new person"); person = new Person(); person.setFirstName("Layla"); person.setLastName("Roberts"); person.setBirthDate(new Date()); personService.save(person); persons = personService.findAll(); listPersons(persons); // Update person System.out.println("Update person with id 1"); person = personService.findById(1L); person.setFirstName("Vlad"); personService.save(person); persons = personService.findAll(); listPersons(persons); // Delete person System.out.println("Delete person with id 1"); person = personService.findById(1L); personService.delete(person); persons = personService.findAll(); listPersons(persons); } private static void listPersons(List persons) { System.out.println("Listing persons without details:"); for (Person person: persons) { System.out.println(person+"\n"); } } }
и конечно же на последок файл pom.xml:
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <modelVersion>4.0.0</modelVersion> <groupId>org.vit</groupId> <artifactId>spring-mybatis</artifactId> <version>1.0</version> <packaging>jar</packaging> <name>Spring Utility</name> <properties> <spring.framework.version>3.1.1.RELEASE</spring.framework.version> </properties> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.7</version> <scope>test</scope> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-test</artifactId> <version>${spring.framework.version}</version> <scope>test</scope> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>${spring.framework.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-jdbc</artifactId> <version>${spring.framework.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-tx</artifactId> <version>${spring.framework.version}</version> </dependency> <dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>1.2.14</version> </dependency> <!-- H2 --> <dependency> <groupId>com.h2database</groupId> <artifactId>h2</artifactId> <version>1.3.160</version> </dependency> <!-- MyBatis --> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.1.1</version> </dependency> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis-spring</artifactId> <version>1.1.1</version> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <configuration> <source>1.6</source> <target>1.6</target> </configuration> </plugin> </plugins> </build> </project>
Комментариев нет:
Отправить комментарий