Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
SlideShare a Scribd company logo
MyBatis на практике
Виталий Квятковский
Agenda
• Введение
• Getting Started
• Tips
•Tip#1
•Tip#2
•Tip#3
•Tip#4
MyBatis
+ Legacy DB
+ Легковесный и быстрый
+ Легко освоить
+ Чистый SQL
- Больше кода
- Сложнее поддерживать несколько БД
Getting Started with MyBatis
•Domain
•ResultMap
•Query
•Repository
ResultMap
DB
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>
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);
}
Tips & Tricks
Tip #1:
$
$ 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}
Где использовать $?
• Где нельзя использовать параметр
• select * from users order by ${field}
• Для конфигурационных настроек
• select * from ${schema}.users
• Одна константа на всё приложение
<configuration>
<properties>
<property name="schema" value="secur"/>
</properties>
</configuration>
Tip #2:
Аудит и
блокировка
Аудит и блокировка
CREATED_BY_USER
UPDATED_BY_USER
CREATED_DATETIME
UPDATED_DATETIME
RECORD_VERSION
Аудит,
Кто?
Аудит,
Когда?
Оптимистическая блокировка
Аудит: Общий предок
public class AuditableEntity {
private String createdByUser;
private String updatedByUser;
private Date createdDatetime;
private Date updatedDatetime;
private int version;
}
Аудит: Базовая 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>
Аудит: Наследование 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
Аудит: 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) { … }
Аудит: Запрос
<insert id="insertPerson">
insert into person (
created_datetime,
created_by_user)
values (
now(),
#{created_by_user}
)
</insert>
Оптимистическая блокировка
DB
SELECT
Поток 1 Поток 2
begin transaction begin transaction
UPDATE
SELECT
UPDATE
amount = 100$ amount = 100$
amount + 20 = 120$amount + 80 = 180$
commit
commit
180$ 120$
200$
Оптимистическая блокировка
<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();
Tip #3:
Маппинг
Сортировка
select *
from person
order by ${sortField}
Что если пользователь выбирает
сам по какому полю объекта
сортировать?
Сортировка
• Необходимо знать маппинг
• ПолеОбъекта -> СтолбецТаблицы
• Уже есть готовый маппинг
<resultMap type="Person" id="PersonMap">
<id property="id" column="person_id"/>
<result property="name" column="person_name"/>
</resultMap>
Сортировка
MappedStatement ms = config.getMappedStatement(statement);
for (ResultMapping m :
ms.getResultMaps().get(0)
.getPropertyResultMappings()) {
if (m.getProperty().equals(userEnteredSortField))
return m.getColumn();
}
Tip #4:
Spring MyBatis
Используйте Spring MyBatis*
•Spring Framework помогает
•Конфигурировать SqlSession
•Управлять транзакциями
Вопросы?
Спасибо за внимание!

More Related Content

MyBatis на практике