Учебные заметки MyBatis (1) - используйте артикли
Учебные заметки MyBatis (2) — сопоставление отношений
Учебные заметки MyBatis (3) - взаимно однозначное сопоставление расширенного сопоставления
Учебные заметки Mybatis (4) - сопоставление «один ко многим» расширенного сопоставления
Учебные заметки Mybatis (5) — сопоставление «многие ко многим» расширенного сопоставления
...быть в курсе
Что такое Мибатис?
MyBatis — это превосходная структура уровня сохраняемости, которая поддерживает пользовательский SQL, хранимые процедуры и расширенное сопоставление. Избегает почти всего кода JDBC и ручной установки параметров и выборки наборов результатов. Mybatis может сопоставлять интерфейсы и Java POJOS с записями в базе данных путем настройки XML или аннотаций.
Первое приложение MyBatis
Это более быстрый способ начать работу с очками знаний в реальном бою, который может помочь создать общее впечатление, и в процессе будут описаны некоторые необходимые очки знаний.
Популярная в последнее время лягушка-путешественница очень интересна, и окружающие друзья зашли в яму один за другим.Вот я использую ее систему хранения как объект работы с базой данных.
Сначала подготовьте базу данных, здесь я создаю таблицу Commodity на основе содержимого магазина Travel Frog:
create database TravelFrog;
CREATE TABLE commodity
(
id int NOT NULL AUTO_INCREMENT,
name varchar(255) NOT NULL ,
price decimal(8,2) NOT NULL ,
description varchar(255),
PRIMARY KEY(id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
INSERT INTO commodity(id, name, price, description)
VALUES(1001, '野葡萄烤饼', 10, '吃完还有点饿');
INSERT INTO commodity(id, name, price, description)
VALUES(1002, '巨石三明治', 20, '蔬菜、快速轻食');
INSERT INTO commodity(id, name, price, description)
VALUES(1003, '南瓜百吉饼', 50, '份大量足,可以去很远的地方');
INSERT INTO commodity(id, name, price, description)
VALUES(1004, '乳蛋饼', 80, '想快点吃到拍,身心都轻快了,快速回家');
Теперь официально откройте новый проект IDEA и добавьте зависимости maven:
<dependencies>
<!-- mybatis包 -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.1</version>
</dependency>
<!-- mysql数据库连接 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>6.0.6</version>
</dependency>
<!-- 日志 -->
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
<!-- junit测试 -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
</dependencies>
Затем добавьте файлы в следующую структуру каталогов:
Конфигурационный файл Mybatis
Создайте новый файл 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>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<!-- 选择连接数据库用的驱动 -->
<property name="driver" value="com.mysql.cj.jdbc.Driver"/>
<!-- 数据库地址 -->
<property name="url" value="jdbc:mysql://localhost:3306/TravelFrog?characterEncoding=UTF-8"/>
<!-- 数据库用户名 -->
<property name="username" value="root"/>
<!-- 数据库密码 -->
<property name="password" value="jenkins"/>
</dataSource>
</environment>
</environments>
<!-- 导入Mybatis数据库查询映射文件 -->
<mappers>
<mapper resource="mapper/CommodityMapper.xml"/>
</mappers>
</configuration>
Файл конфигурации Mybatis содержит источники данных, журналы, кэши и другие настройки, связанные с собственным поведением Mybatis.Приведенный выше файл конфигурации содержит конфигурацию источника данных и управление транзакциями.
Создать класс POJO
package com.shuqing28.pojo;
public class Commodity {
private Integer id;
private String name;
private Double price;
private String description;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Double getPrice() {
return price;
}
public void setPrice(Double price) {
this.price = price;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
@Override
public String toString() {
return "Commodity{" +
"id=" + id +
", name='" + name + '\'' +
", price=" + price +
", description='" + description + '\'' +
'}';
}
}
В соответствии с таблицей товаров, только что созданной базой данных, поля в POJO здесь соответствуют полям в таблице товаров.
картограф
интерфейсная часть
package com.shuqing28.dao;
import com.shuqing28.pojo.Commodity;
import java.util.List;
public interface CommodityDao {
List<Commodity> getAllCommodity();
}
Здесь определяется интерфейс. Обратите внимание, что метод интерфейса соответствует идентификатору XML-файла ниже.
XML Mapper
<?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.shuqing28.dao.CommodityDao">
<select id="getAllCommodity" resultType="com.shuqing28.pojo.Commodity">
SELECT * FROM commodity
</select>
</mapper>
Опишите, что делает приведенный выше файл XML:
- Во-первых, маппер фактически прописан в предыдущем конфигурационном файле:
<mappers>
<mapper resource="mapper/CommodityMapper.xml"/>
</mappers>
Итак, Mybatis прочитает этот XML и сгенерирует картограф, который на самом деле использует динамический прокси.
-
определяет пространство имен как
com.shuqing28.dao.CommodityDao的SQL Mapper
, это пространство имен согласуется с полным именем интерфейса, который мы определили. -
SQL-запрос определяется с помощью элемента select, а возвращаемый результат — это определенный нами товар. Это также основная и самая сложная часть Mybatis.Помимо использования XML, это также может быть реализовано через аннотации.Например, если XML-файла выше нет, его также можно определить прямо в интерфейсе:
@Select(value="SELECT * FROM commodity")
public interface CommodityDao {
List<Commodity> getAllCommodity();
}
Это всего лишь поверхностное описание использования.Поскольку это первая статья, достаточно использовать ее, не углубляясь.
Добавить конфигурацию журнала
# Global logging configuration
log4j.rootLogger=ERROR, stdout
# MyBatis logging configuration...
# 指定Mapper包范围的日志级别
log4j.logger.com.zju.dao=DEBUG
# Console output...
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m
тестовый класс
import com.shuqing28.dao.CommodityDao;
import com.shuqing28.pojo.Commodity;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Before;
import org.junit.Test;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
public class CommodityTest {
private SqlSessionFactory sqlSessionFactory = null;
@Before
public void setUp() throws IOException{
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
}
@Test
public void getAllCommodity(){
SqlSession sqlSession = sqlSessionFactory.openSession();
try {
CommodityDao commodityDao = sqlSession.getMapper(CommodityDao.class);
List<Commodity> commodities = commodityDao.getAllCommodity();
System.out.println(commodities);
} finally {
sqlSession.close();
}
}
}
результат операции
[Commodity{id=1001, name='野葡萄烤饼', price=10.0, description='吃完还有点饿'}, Commodity{id=1002, name='巨石三明治', price=20.0, description='蔬菜、快速轻食'}, Commodity{id=1003, name='南瓜百吉饼', price=50.0, description='份大量足,可以去很远的地方'}, Commodity{id=1004, name='乳蛋饼', price=80.0, description='想快点吃到拍,身心都轻快了,快速回家'}]
На самом деле вещи в тестовом классе очень достойны нашего внимания, соответственно мы можем знать базовый состав Mybatis.
Базовый состав Mybatis
SqlSessionFactoryBuilder
SqlSessionFactoryBuilder обычно использует кодирование XML или Java для построения SqlSessionFactory, как только мы создадим SqlSessionFactory, его роль окончена. В приведенном выше примере файл конфигурации просто считывается, преобразуется в объект потока, а затем создается SqlSessionFactory. Поскольку его основная цель — создать SqlSessionFactory, обычно он сохраняется только в созданном методе, а цикл объявления очень короткий.
SqlSessionFactory
SqlSessionFactory — это фабричный класс, его функция — создавать SqlSession, а SqlSession вы можете представить как соединение в JDBC, каждый раз, когда вы обращаетесь к базе данных, вам нужен SqlSession, поэтому SqlSessionFactory обычно сопровождает весь жизненный цикл Mybatis, мы обычно его создаем для базы данных A SqlSessionFactory, потому что, если вы создаете более одного, каждый раз, когда вы создаете новый, он будет открывать кучу ресурсов Connection, поэтому обычно мы используем шаблон singleton для управления SqlSessionFactory.
SqlSession
SqlSession — это диалоговое окно, аналогичное Connection, поэтому не забывайте закрывать его каждый раз, когда вы его используете. В то же время это также потоконебезопасный объект, поэтому обратите особое внимание, когда задействована многопоточность.В приведенном выше коде мы обязательно закрываем его в операторе finally. Он выдерживает запросы и операции приложения и может выполнять несколько SQL-запросов для обеспечения согласованности транзакций.
Mapper
Mapper — это то, о чем мы писали вышеCommodityDao commodityDao = sqlSession.getMapper(CommodityDao.class);
, Мы используем только интерфейс Java и файл XML (или аннотацию) для реализации Mapper без реализации класса. Фактически здесь используется динамический прокси. Mybatis будет генерировать объекты класса прокси для интерфейса, а объект прокси будет основан на "путь к интерфейсу + имя метода". Сопоставьте, найдите соответствующий файл XML (или аннотацию) для выполнения нужной ему задачи и верните нужный нам результат. Mapper — это вещь на уровне метода, и его максимальное время жизни должно быть таким же, как у SqlSession.
Первое приложение Mybatis можно реализовать, введя приведенный выше код один раз.Первая часть этой серии будет продолжена. .