27
MyBatis на практике Виталий Квятковский

MyBatis на практике

Embed Size (px)

Citation preview

Page 1: MyBatis на практике

MyBatis на практике

Виталий Квятковский

Page 2: MyBatis на практике

Agenda

•Введение

•Getting Started

• Tips

• Tip#1

• Tip#2

• Tip#3

• Tip#4

Page 3: MyBatis на практике

MyBatis

+ Legacy DB

+ Легковесный и быстрый

+ Легко освоить

+ Чистый SQL

- Больше кода

- Сложнее поддерживать несколько БД

Page 4: MyBatis на практике

Getting Started with MyBatis

•Domain

•ResultMap

•Query

•Repository

ResultMap

DB

Page 5: MyBatis на практике

Getting Started with MyBatis

class Person {Integer id;String name;

}

<resultMap type="Person" id="PersonMap">

<id property="id" column="person_id"/>

<result property="name" column="person_name"/>

</resultMap>

Page 6: MyBatis на практике

Getting Started with MyBatis

<select id="getPersonById" parameterType="int"

resultType= "Person">

select * from person where person_id=#{id}

</select>

public Person getById(Integer id) {

return session.selectOne("getPersonById", id);

}

Page 7: MyBatis на практике

Tips & Tricks

Page 8: MyBatis на практике

Tip #1:

$

Page 9: MyBatis на практике

$ vs #

• ${id} вставляет подстроку

select * from ${schema}.users

-> select * from secur.users

• #{id} создает параметризованный запрос

select * from secur.users where id=#{id}

-> select * from secur.users where id=#{id}

Page 10: MyBatis на практике

Где использовать $?

• Где нельзя использовать параметр

• select * from users order by ${field}

• Для конфигурационных настроек

• select * from ${schema}.users

• Одна константа на всё приложение

<configuration>

<properties>

<property name="schema" value="secur"/>

</properties>

</configuration>

Page 11: MyBatis на практике

Tip #2:

Аудит и

блокировка

Page 12: MyBatis на практике

Аудит и блокировка

CREATED_BY_USER

UPDATED_BY_USER

CREATED_DATETIME

UPDATED_DATETIME

RECORD_VERSION

Аудит, Кто?

Аудит, Когда?

Оптимистическая блокировка

Page 13: MyBatis на практике

Аудит: Общий предок

public class AuditableEntity {

private String createdByUser;

private String updatedByUser;

private Date createdDatetime;

private Date updatedDatetime;

private int version;

}

Page 14: MyBatis на практике

Аудит: Базовая resultMap

<resultMap type="AuditableEntity" id="auditableEntityMap">

<result property="createDate" column="created_datetime" />

<result property="updateDate" column="updated_datetime" />

<result property="createUser" column="created_by_user" />

<result property="updateUser" column="updated_by_user" />

<result property="version" column="record_version" />

</resultMap>

Page 15: MyBatis на практике

Аудит: Наследование ResultMap

<resultMap id="userMap" type="User"

extends="auditableEntityMap">

<result property="id" column="id"/>

<result property="name" column="name"/>

</resultMap>

<resultMap type="AuditableEntity" id="auditableEntityMap">

Inherit mapping

Page 16: MyBatis на практике

Аудит: Custom SqlSessionFactory

public class UserAuditSessionTemplate

extends SqlSessionTemplate {

public int insert(String statement, Object parameter) {

if (parameter instanceof AuditableEntity) {

AuditableEntity param = (AuditableEntity) parameter;param.setCreateUser(username);

}

return super.insert(statement, parameter);

}

public int update(String statement, Object parameter) { … }

Page 17: MyBatis на практике

Аудит: Запрос

<insert id="insertPerson">

insert into person (

created_datetime,

created_by_user)

values (

now(),

#{created_by_user}

)

</insert>

Page 18: MyBatis на практике

Оптимистическая блокировка

DB

SELECT

Поток 1 Поток 2

begin transaction begin transaction

UPDATE

SELECT

UPDATE

amount = 100$ amount = 100$

amount + 20 = 120$amount + 80 = 180$

commitcommit

180$ 120$200$

Page 19: MyBatis на практике

Оптимистическая блокировка

<update id="updatePerson">update person set

name = #{name},record_version = record_version + 1

where record_version = #{record_version}

</update>

int updated = session.update(“updatePerson”, person);

if (updated == 0)

throw new OptimisticLockingFailureException();

Page 20: MyBatis на практике

Tip #3:

Маппинг

Page 21: MyBatis на практике

Сортировка

select *

from person

order by ${sortField}

Что если пользователь выбирает сам по какому полю объекта

сортировать?

Page 22: MyBatis на практике

Сортировка

• Необходимо знать маппинг

• ПолеОбъекта -> СтолбецТаблицы

• Уже есть готовый маппинг

<resultMap type="Person" id="PersonMap">

<id property="id" column="person_id"/>

<result property="name" column="person_name"/></resultMap>

Page 23: MyBatis на практике

Сортировка

MappedStatement ms = config.getMappedStatement(statement);

for (ResultMapping m :

ms.getResultMaps().get(0)

.getPropertyResultMappings()) {

if (m.getProperty().equals(userEnteredSortField))

return m.getColumn();

}

Page 24: MyBatis на практике

Tip #4:

Spring MyBatis

Page 25: MyBatis на практике

Используйте Spring MyBatis*

•Spring Framework помогает

•Конфигурировать SqlSession

•Управлять транзакциями

Page 26: MyBatis на практике

Вопросы?

Page 27: MyBatis на практике

Спасибо за внимание!