«Эта статья участвовала в мероприятии Haowen Convocation Order, щелкните, чтобы просмотреть:Двойные заявки на внутреннюю и внешнюю стороны, призовой фонд в 20 000 юаней ждет вас, чтобы бросить вызов!"
Обзор фреймворка
1.1 Общая структура разработки программного обеспечения
1.1.1, трехуровневая архитектура
Трехуровневая архитектура состоит из трех слоев:
- Слой пользовательского интерфейса
- Уровень бизнес-логики
- Уровень доступа к данным
Обязанности трехуровневой архитектуры:
-
Уровень интерфейса (уровень представления, уровень представления): основная функция — принимать данные пользователя и отображать результат обработки запроса. с помощью веб-страниц и Взаимодействие с пользователем, мобильное приложение также является уровнем представления, пользователь работает в приложении, а бизнес-логика обрабатывается на стороне сервера.
-
Уровень бизнес-логики: получение данных, переданных представлением, проверка данных, вычисление бизнес-логики и вызов уровня доступа к данным для получения данных.
-
Уровень доступа к данным: имеет дело с базой данных. Он в основном реализует добавление, удаление, изменение и проверку данных. Отправьте данные, хранящиеся в базе данных Передайте его бизнес-уровню и сохраните данные, обработанные бизнес-уровнем, в базу данных.
Процесс взаимодействия для них для обработки запросов: пользователь -> уровень интерфейса -> уровень бизнес-логики -> уровень доступа к данным -> база данных БД.
1.1.2 Зачем использовать трехуровневую архитектуру
- Структура ясна, связь низка, разделение труда на каждом уровне понятно.
- Высокая ремонтопригодность и масштабируемость.
- хорош для стандартизации.
- Разработчики могут сосредоточиться только на функциональной реализации определенного слоя во всей структуре.
- Это выгодно для повторного использования логики на всех уровнях.
1.2. Предварительное изучение фреймворка
1.2.1, что такое фреймворк
Фреймворк — это многоразовый дизайн всей или части системы, который выражается в виде набора абстрактных компонентов и метода взаимодействия между экземплярами компонентов; с другой точки зрения, фреймворк — это скелет приложения и шаблон, который может быть настроен пользователем. разработчики приложений. Проще говоря, фреймворк на самом деле представляет собой полуфабрикат программного обеспечения, набор компонентов, которые вы можете использовать для завершения своей собственной системы. Чтобы создать сцену с другой точки зрения, вы выступаете на сцене. Добавьте функции, которые вы хотите выполнить на основе фреймворка. Платформа для безопасного, многоразового и постоянно обновляемого программного обеспечения.
1.2.1, проблема, решаемая фреймворком
Наиболее важной проблемой, которую должна решить инфраструктура, является интеграция технологий.В инфраструктуре J2EE существуют разные технологии, разные приложения, и система использует разные технологии для решения проблем. Из J2EE необходимо выбирать разные технологии, а сложность самих технологий приводит к большим рискам.
Когда предприятие разрабатывает программный проект, основной целью является решение бизнес-задачи. Это требует от предприятий ответственности за саму технологию, а также за решение бизнес-задач. Это то, чего не может достичь большинство предприятий. Структура объединяет связанные технологии, и развитие предприятия может быть сосредоточено на областях бизнеса.
1.3 Общие рамки
1.3.1. Мибатис
MyBatis 是一个优秀的基于 java 的持久层框架,内部封装了 jdbc,开发者只需要关注 sql 语句本身,而不需要处理加载驱动、创建连接、创建 statement、关闭连接,资源等繁杂的过程。
MyBatis 通过 xml 或注解两种方式将要执行的各种 sql 语句配置起来,并通过 java 对象和 sql 的动态参数进行映射生成最终执行的 sql 语句,最后由 mybatis 框架执行 sql 并将结果映射为 java对象并返回。
1.3.2, Весна
Spring 框架为了解决软件开发的复杂性而创建的。Spring 使用的是基本的 JavaBean 来完成以前非常复杂的企业级开发。Spring 解决了业务对象,功能模块之间的耦合,不仅在 javase,web 中使用,大部分 Java 应用都可以从 Spring 中受益。
Spring 是一个轻量级控制反转(IoC)和面向切面(AOP)的容器。
1.3.3, СпрингМВК
Spring MVC 属于 SpringFrameWork 3.0 版本加入的一个模块,为 Spring 框架提供了构建 Web应用程序的能力。现在可以 Spring 框架提供的 SpringMVC 模块实现 web 应用开发,在 web 项目中可以无缝使用 Spring 和 Spring MVC 框架
2. Введение в Mybatis
2.1, традиционный JDBC
2.1.1 Код
public void findStudent() {
Connection conn = null;
Statement stmt = null;
ResultSet rs = null;
try {
//注册 mysql 驱动
Class.forName("com.mysql.jdbc.Driver");
//连接数据的基本信息 url ,username,password
String url = "jdbc:mysql://localhost:3306/springdb";
String username = "root";
String password = "123456";
//创建连接对象
conn = DriverManager.getConnection(url, username, password);
//保存查询结果
List<Student> stuList = new ArrayList<>();
//创建 Statement, 用来执行 sql 语句
stmt = conn.createStatement();
//执行查询,创建记录集,
rs = stmt.executeQuery("select * from student");
while (rs.next()) {
Student stu = new Student();
stu.setId(rs.getInt("id"));
stu.setName(rs.getString("name"));
stu.setAge(rs.getInt("age"));
//从数据库取出数据转为 Student 对象,封装到 List 集合
stuList.add(stu);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
//关闭资源
if (rs != null) ;
{
rs.close();
}
if (stmt != null) {
stmt.close();
}
if (conn != null) {
conn.close();
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
2.1.2, существующие проблемы
Проблемы, с которыми мы сталкиваемся в реальном процессе разработки с использованием JDBC, также очевидны:
- Кода больше, а эффективность разработки низкая.
- Необходимо обратить внимание на создание и уничтожение объекта Connection , Statement, ResultSet.
- Результат запроса ResultSet необходимо инкапсулировать в виде списка.
- Много повторяющегося кода.
- Бизнес-код и операции с базами данных перемешаны, что не соответствует современным привычкам разработки.
2.2, История MyBatis
MyBatis — это проект Apache iBatis с открытым исходным кодом, запущенный Apache Software в июне 2010 года. Foundation перешел на Google Code, а когда команда разработчиков перешла на Google Code, iBatis3.x Официально переименованный в MyBatis, код был перенесен на Github в ноябре 2013 года.
Термин iBatis происходит от сочетания слов «интернет» и «абатис» и представляет собой основанную на Java структуру уровня сохраняемости. iBatis Предоставленная структура уровня сохраняемости включает карты SQL и объекты доступа к данным (DAO).
2.3. Введение в MyBatis
- MyBatis — это превосходная структура уровня сохраняемости, которая поддерживает пользовательский SQL, хранимые процедуры и расширенное сопоставление.
- MyBatis избегает почти всего кода JDBC и ручной настройки параметров и получения наборов результатов.
- MyBatis может использовать простой XML или аннотации для конфигурации и сопоставления примитивов, интерфейсов и объектов JavaOld Java, простой Java. объекты) сопоставляются с записями в базе данных.
2.4 Сравнение существующих технологий персистентности
2.4.1 JDBC
- SQL зажат в блоках кода Java, а высокая связанность приводит к жестко запрограммированным внутренним повреждениям.
- Сопровождение не простое, и есть изменения в sql в реальных требованиях к разработке, и частые модификации являются обычным явлением.
2.4.2, спящий режим и JPA.
- Длинный и сложный SQL нелегко обрабатывать для Hibernate.
- SQL, который автоматически генерируется внутри, не так просто выполнить специальную оптимизацию.
- На основе полностью автоматической структуры полного сопоставления трудно частично сопоставить POJO с большим количеством полей. Снижение производительности базы данных.
2.4.3. Мой Батис
- Для разработчиков базовый SQL по-прежнему нуждается в оптимизации сам по себе.
- Кодирование sql и java разделены, а функциональные границы четкие.Один фокусируется на бизнесе, а другой — на данных.
2.5. Проблемы, решаемые MyBatis
-
Уменьшите сложность использования JDBC без написания повторного создания Connection , Statement .
-
Нет необходимости писать закрытый код ресурса.
-
Используйте объект java напрямую для представления данных результата. Пусть разработчики сосредоточатся на обработке SQL. Другие отвлекающие факторы делает MyBatis.
2.6. Скачать MyBatis
URL-адрес загрузки:GitHub.com/ не поставил boost/каждый шаг…
3. Начало работы с MyBatis
3.1 Подготовка среды разработки
3.1.1, импортный пакет jar
Как правило, нам нужно импортировать три пакета jar.
myBatis-3.4.1.jar
mysql-connector-java-5.1.37-bin.jar
log4j.jar
3.1.2, импортировать файл конфигурации log4j
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">
<appender name="STDOUT" class="org.apache.log4j.ConsoleAppender">
<param name="Encoding" value="UTF-8" />
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%-5p %d{MM-dd HH:mm:ss,SSS} %m (%F:%L) \n" />
</layout>
</appender>
<logger name="java.sql">
<level value="debug" />
</logger>
<logger name="org.apache.ibatis">
<level value="info" />
</logger>
<root>
<level value="debug" />
<appender-ref ref="STDOUT" />
</root>
</log4j:configuration>
3.1.3. Создайте тестовую таблицу
-- 创建库
CREATE DATABASE test_mybatis;
-- 使用库
USE test_mybatis;
-- 创建表
CREATE TABLE user(
id INT(11) PRIMARY KEY AUTO_INCREMENT,
username VARCHAR(50),
pwd VARCHAR(50),
);
3.1.4. Создание javaBean
package com.domain;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* @author Xiao_Lin
* @date 2021/1/5 11:33
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {
private Integer id;
private String username;
private String pwd;
}
3.1.5 Создайте глобальный файл конфигурации для MyBatis
<?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>
<!--配置 mybatis 环境-->
<environments default="mysql">
<!--id:数据源的名称-->
<environment id="mysql">
<!--配置事务类型:使用 JDBC 事务(使用 Connection 的提交和回滚)-->
<transactionManager type="JDBC"/>
<!--数据源 dataSource:创建数据库 Connection 对象
type: POOLED 使用数据库的连接池
-->
<dataSource type="POOLED">
<!--连接数据库的四个要素-->
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql:///javaweb?characterEncoding=utf-8&useSSL=false"/>
<property name="username" value="root"/>
<property name="password" value="1101121833"/>
</dataSource>
</environment>
</environments>
<mappers>
<!--告诉 mybatis 要执行的 sql 语句的位置,写的路径是字节码输出路径-->
<mapper resource="com/dao/StudentDao.xml"/>
</mappers>
</configuration>
3.1.6 Написать интерфейс UserDao
public interface UserDao {
/*查询所有数据*/
List<User> selectAll();
}
3.1.7. Создайте файл сопоставления Mybatis sql
<?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" >
<!--
用来存储SQL语句的
namespace属性里面必须写 用来书写当前的mapper是对哪个DAO接口的实现
他的意思是表示该配置文件的唯一标识,意味着不同的XxxMapper.xml文件的namespace的值时不同的
-->
<!--
select标签表示查询操作,
id属性表示在mapper配置文件中是唯一标识,一般使用方法名作为其值。
paraType属性表示传入参数的类型,可省略不写,底层使用了反射,根据传入参数得到对象的类型 标签体中编写sql语句,#{变量},#表示占位符,和jdbc的?一样。
如果传入的参数是简单类型(包括String),那么该类型可以任意写
如果传入的参数是对象类型,那么变量的名称必须使用对象对应的类中的属性
resultType: 查询语句的返回结果数据类型,使用全限定类名
-->
<mapper namespace="com.mapper.UserDao">
<select id="selectAll" resultType="com.domain.User">
select * from user
</select>
</mapper>
3.1.8 Конфигурация журнала
mybatis.xml
Файл добавляется в конфигурацию журнала, а выполненный оператор sql и параметры могут быть выведены в консоль.
<settings>
<setting name="logImpl" value="STDOUT_LOGGING" />
</settings>
3.1.9 Тест
public class test {
/*
* mybatis 入门
*/
@Test
public void testStart() throws IOException {
//1.mybatis 主配置文件
String config = "mybatis-config.xml";
//2.读取配置文件
InputStream in = Resources.getResourceAsStream(config);
//3.创建 SqlSessionFactory 对象,目的是获取 SqlSession
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(in);
//4.获取 SqlSession,SqlSession 能执行 sql 语句
SqlSession session = factory.openSession();
//5.执行 SqlSession 的 selectList()
List<User> users = session.selectList("com.dao.UserDao.selectAll");
//6.循环输出查询结果
studentList.forEach( u -> System.out.println(u));
//7.关闭 SqlSession,释放资源
session.close();
}
}
3.2, CRUD-операция
3.2.1, вставить
новый метод в интерфейсе
int insertUser(User user);
Добавить инструкцию sql в xml
<insert id="insertUser">
insert into user(id,username,pwd) values(#{id},#{username},#{pwd})
</insert>
Добавить метод тестирования
@Test
public void testInsert() throws IOException {
//1.mybatis 主配置文件
String config = "mybatis-config.xml";
//2.读取配置文件
InputStream in = Resources.getResourceAsStream(config);
//3.创建 SqlSessionFactory 对象
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(in);
//4.获取 SqlSession
SqlSession session = factory.openSession();
//5.创建保存数据的对象
User user = new User();
user.setId(1005);
user.setUsername("张三");
user.setPwd("123456");
//6.执行插入 insert
int rows = session.insert("com.dao.UserDao.insertUser",student);
//7.提交事务
session.commit();
System.out.println("增加记录的行数:"+rows);
//8.关闭 SqlSession
session.close();
}
3.2.2, обновление
Добавить метод в интерфейс UserDao
int updateUser(User user);
UserDao.xml добавляет инструкцию sql
<update id="updateUser">
update user set username = #{username} where id = #{id}
</update>
Добавить метод тестирования
@Test
public void testUpdate() throws IOException {
//1.mybatis 主配置文件
String config = "mybatis-config.xml";
//2.读取配置文件
InputStream in = Resources.getResourceAsStream(config);
//3.创建 SqlSessionFactory 对象
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(in);
//4.获取 SqlSession
SqlSession session = factory.openSession();
//5.创建保存数据的对象
User user = new User();
user.setId(1005);//要修改的 id
user.setUsername("李四"); //要修改的年龄值
//6.执行更新 update
int rows = session.update("com.dao.UserDao.updateUser",user);
//7.提交事务
session.commit();
System.out.println("修改记录的行数:"+rows);
//8.关闭 SqlSession
session.close();
}
3.2.3, удалить
Добавить метод в интерфейс UsertDao
int deleteUser(int id);
UserDao.xml добавляет инструкцию sql
<delete id="deleteUser">
delete from user where id=#{id}
</delete>
добавить метод тестирования
@Test
public void testUpdate() throws IOException {
//1.mybatis 主配置文件
String config = "mybatis-config.xml";
//2.读取配置文件
InputStream in = Resources.getResourceAsStream(config);
//3.创建 SqlSessionFactory 对象
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(in);
//4.获取 SqlSession
SqlSession session = factory.openSession();
//5.删除的 id
int id = 1001;
//6.执行删除 delete
int rows = session.delete("com.dao.UserDao.deleteStudent",id);
//7.提交事务
session.commit();
System.out.println("修改记录的行数:"+rows);
//8.关闭 SqlSession
session.close();
}
3.2.2. Выполните две привязки
- Привязка между интерфейсом Mapper и файлом сопоставления Mapper должна указывать полное имя класса интерфейса Mapper, имя пакета плюс имя класса в пространстве имен метки в файле сопоставления Mppper.
- Идентификатор тега CRUD в файле сопоставления Mapper должен быть указан как метод в интерфейсе Mapper, который должен быть таким же, иначе привязка не может быть достигнута через прокси.
3.3, Анализ объектов Mybatis
3.3.1, Класс ресурсов
Класс Resources, как следует из названия, представляет собой ресурс, который используется для чтения файлов ресурсов. Есть много способов вернуть его, загрузив и проанализировав файл ресурсов.
Возвращает различные типы объектов потока ввода-вывода.
3.3.2, класс SqlSessionFactoryBuilder
Создание SqlSessionFactory требует использования метода build() объекта SqlSessionFactoryBuilder. так как После того как объект SqlSessionFactoryBuilder завершил создание объекта фабрики, он завершил свою историческую миссию и может быть уничтожен. Поэтому, как правило, Объект SqlSessionFactoryBuilder создается как локальный объект внутри метода, метод завершается, а объект уничтожается.
3.3.3, класс SqlSessionFactory
Объект интерфейса SqlSessionFactory — это тяжеловесный объект (объект с большими системными издержками) и потокобезопасный, поэтому приложение
Требуется только один из этих объектов. Для создания SqlSession необходимо использовать метод openSession() интерфейса SqlSessionFactory. Он имеет несколько перегруженных методов:
- openSession(true): создать SqlSession с автоматической фиксацией
- openSession(false): создать SqlSession без автоматической фиксации, который необходимо отправить вручную.
- openSession(): то же, что и openSession(false)
3.3.4, интерфейс SqlSession
Объект интерфейса SqlSession используется для выполнения операций сохранения. SqlSession соответствует сеансу базы данных, а сеанс начинается с
Создание объекта SqlSession начинается и заканчивается закрытием объекта SqlSession.
Объект интерфейса SqlSession небезопасен для потоков, поэтому каждый раз перед окончанием сеанса работы с базой данных необходимо немедленно вызывать его метод close().
Закрыто. Сессия нужна снова, создается снова. SqlSession создается внутри метода и закрывается по завершении.
3.4 Инструменты извлечения
public class MyBatisUtil {
//定义 SqlSessionFactory
private static SqlSessionFactory factory = null;
static {
//使用 静态块 创建一次 SqlSessionFactory
try{
String config = "mybatis-config.xml";
//读取配置文件
InputStream in = Resources.getResourceAsStream(config);
//创建 SqlSessionFactory 对象
factory = new SqlSessionFactoryBuilder().build(in);
}catch (Exception e){
factory = null;
e.printStackTrace();
}
}
/* 获取 SqlSession 对象 */
public static SqlSession getSqlSession(){
SqlSession session = null;
if( factory != null){
session = factory.openSession();
}
return session;
}
}
В-четвертых, файл глобальной конфигурации MyBatis.
4.1 Введение в файл глобальной конфигурации MyBatis
Конфигурация MyBatis содержит настройки и свойства, которые существенно влияют на поведение MyBatis.
Файлы конфигурации MyBatis содержат настройки и свойства, сильно влияющие на поведение MyBatis.
4.2, файловая структура
configuration 配置
properties 属性
settings 设置
typeAliases 类型命名
typeHandlers 类型处理器
objectFactory 对象工厂
plugins 插件
environments 环境
environment 环境变量
transactionManager 事务管理器
dataSource 数据源
databaseIdProvider 数据库厂商标识
mappers 映射器
4.2.1, атрибут свойств
Атрибут properties — это атрибут, связанный с источником данных конфигурации, который можно настраивать извне и динамически заменять.Его можно настроить в типичном файле свойств Java или с помощью подэлементов элемента properties.
<properties>
<!--驱动名(MySQL5 和MySQL8 不同)-->
<property name="driver" value="com.mysql.jdbc.Driver" />
<!--url名字(MySQL5 和MySQL8 不同)-->
<property name="url"
<value="jdbc:mysql://localhost:3306/javaweb" />
<property name="username" value="root" />
<property name="password" value="123456" />
</properties>
Однако роль свойств заключается не только в этом, вы можете создать файл ресурсов, файл с именем db.properties, и поместить данные четырех строк подключения в файл ресурсов с помощью пар ключ-значение (ключ=значение). , Не нужно никаких символов, одна строка на одной строке
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/javaweb
jdbc.username=root
jdbc.password=123456
Вот как импортировать
<!--
properties: 引入外部的属性文件
resource: 从类路径下引入属性文件
url: 引入网络路径或者是磁盘路径下的属性文件
-->
<properties resource="db.properties" ></properties>
Установите его динамически в элементе dataSource элемента окружения.
<environments default="mysql">
<environment id="mysql">
<transactionManager type="JDBC" />
<dataSource type="POOLED">
<property name="driver" value="${jdbc.driver}" />
<property name="url" value="${jdbc.url}" />
<property name="username" value="${jdbc.username}" />
<property name="password" value="${jdbc.password}" />
</dataSource>
</environment>
4.2.2, атрибут настроек
Это чрезвычайно важные параметры настройки в MyBatis, которые изменяют поведение MyBatis во время выполнения. Обычно задайте, включены ли ленивая загрузка и кэширование базы данных.
<settings>
<setting name="cacheEnabled" value="true"/>
<setting name="lazyLoadingEnabled" value="true"/>
<setting name="multipleResultSetsEnabled" value="true"/>
<setting name="useColumnLabel" value="true"/>
<setting name="useGeneratedKeys" value="false"/>
<setting name="autoMappingBehavior" value="PARTIAL"/>
<setting name="autoMappingUnknownColumnBehavior" value="WARNING"/>
<setting name="defaultExecutorType" value="SIMPLE"/>
<setting name="defaultStatementTimeout" value="25"/>
<setting name="defaultFetchSize" value="100"/>
<setting name="safeRowBoundsEnabled" value="false"/>
<setting name="mapUnderscoreToCamelCase" value="false"/>
<setting name="localCacheScope" value="SESSION"/>
<setting name="jdbcTypeForNull" value="OTHER"/>
<setting name="lazyLoadTriggerMethods" value="equals,clone,hashCode,toString"/>
</settings>
4.2.3, typeAliases псевдонимы
Псевдоним типа предназначен для установки короткого имени для типа Java, что может облегчить нам обращение к классу без указания полного имени пути при ссылке.
<typeAliases>
<typeAlias type="com.domain.User" alias="user"/>
</typeAliases>
Более простое письмо:В случае многих классов вы можете установить псевдонимы в пакетах, чтобы создать псевдоним по умолчанию для каждого класса в этом пакете, что просто Одно имя класса в нижнем регистре
<typeAliases>
<package name="com.domain.User"/>
</typeAliases>
MyBatis уже взял псевдоним по умолчанию, и нам не нужно настраивать его вручную.
4.2.4, обработчик типа typeHandlers
Независимо от того, устанавливает ли MyBatis параметр в подготовленном операторе (PreparedStatement) или извлекает значение из набора результатов, процессор типов будет использоваться для преобразования полученного значения в тип Java соответствующим образом.
Уведомление
-
Обработка даты и времени, JDK1.8 раньше была головной болью. Обычно мы используем Joda-Time, созданный руководителем спецификации JSR310 Стивеном Коулборном. 1.8 реализованы все спецификации JSR310
-
Для обработки даты и времени мы можем использовать различные процессоры типа даты и времени, написанные MyBatis на основе JSR310 (Date and Time API).
-
Предыдущие версии MyBatis 3.4 требовали ручной регистрации этих обработчиков. Более поздние версии регистрируются автоматически. Если вам нужно зарегистрироваться, вам нужно скачать mybatistypehandlers-jsr310 и зарегистрироваться следующим образом.
4.2.5, механизм плагинов плагинов
Плагины — это очень мощный механизм, предоставляемый MyBatis.Мы можем изменить некоторые основные функции MyBatis с помощью плагинов. Через механизм динамического прокси подключаемый модуль может вмешиваться в выполнение любого метода четырех основных объектов. Четыре основных объекта следующие:
-
Executor (update, query, flushStatements, commit, rollback, getTransaction, close, isClosed)
-
ParameterHandler (getParameterObject, setParameters)
-
ResultSetHandler (handleResultSets, handleOutputParameters)
-
StatementHandler (prepare, parameterize, batch, update, query)
4.2.6, конфигурация среды
MyBatis может настроить несколько сред, таких как среды разработки, тестирования и производства, которые требуют различных конфигураций.Каждая среда использует тег среды для настройки и указания уникального идентификатора.Вы можете указать идентификатор среды с помощью атрибута по умолчанию в теге среды для быстрого переключения окружающая обстановка
- среда: указать конкретную среду
- id: указывает уникальный идентификатор текущей среды
- менеджер транзакций, источник данных должен иметь
<environments default="mysql">
<environment id="mysql">
<transactionManager type="JDBC" />
<dataSource type="POOLED">
<property name="driver" value="${jdbc.driver}" />
<property name="url" value="${jdbc.url}" />
<property name="username" value="${jdbc.username}" />
<property name="password" value="${jdbc.password}" />
</dataSource>
</environment>
<environment id="oracle">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="${orcl.driver}" />
<property name="url" value="${orcl.url}" />
<property name="username" value="${orcl.username}" />
<property name="password" value="${orcl.password}" />
</dataSource>
</environment>
</environments>
4.2.6.1, диспетчер транзакций
他有三种可选的类型:JDBC ,MANAGED ,自定义
-
JDBC: использует параметры фиксации и отката JDBC, полагаясь на соединения из источника данных для управления областью транзакции, JdbcTransactionFactory.
-
УПРАВЛЯЕМЫЙ: не фиксируйте и не откатывайте соединение, пусть контейнер управляет всем жизненным циклом транзакции, например контекстом сервера приложений JEE, ManagedTransactionFactory.
-
Пользовательский: реализовать интерфейс TransactionFactory, тип = полное имя/псевдоним класса.
4.2.6.2, источник данных
他有四种可选的类型: UNPOOLED , POOLED . JNDI , 自定义
-
UNPOOLED: не используйте пул соединений, UnpooledDataSourceFactory.
-
POOLED: используйте пул соединений, PooledDataSourceFactory.
-
JNDI: находит указанный источник данных в контейнере, таком как EJB или сервер приложений.
-
Пользовательский: Реализуйте интерфейс DataSourceFactory, чтобы определить способ получения источника данных.
4.2.6.3. Резюме
В фактической разработке мы используем Spring для управления источником данных и выполнения конфигурации управления транзакциями, чтобы переопределить приведенную выше конфигурацию.
4.2.7, идентификатор поставщика базы данных databaseIdProvider
MyBatis может выполнять разные операторы в зависимости от разных производителей баз данных.
<databaseIdProvider type="DB_VENDOR">
<property name="MySQL" value="mysql"/>
<property name="Oracle" value="oracle"/>
</databaseIdProvider>
Type: DB_VENDOR
Используйте VendorDatabaseIdProvider, предоставленный MyBatis, для разрешения идентификатора поставщика базы данных. Вы также можете реализовать интерфейс DatabaseIdProvider для настройки.Он будет установлен через строку, возвращаемую DatabaseMetaData#getDatabaseProductName(). Поскольку эта строка обычно очень длинная и разные версии одного и того же продукта возвращают разные значения, лучше сделать ее короче, установив псевдоним свойства.
Имя свойства: идентификатор поставщика базы данных
Значение свойства: создайте псевдоним для идентификатора, который удобен для операторов SQL, чтобы использовать свойство databaseId для ссылки на
После настройки databaseIdProvider используйте databaseId в теге CRUD в файле сопоставления SQL, чтобы указать псевдоним идентификатора базы данных.
<select id="getEmployeeById" resultType="com.atguigu.mybatis.beans.Employee" databaseId="mysql">
select * from tbl_employee where id = #{id}
</select>
Правила сопоставления MyBatis следующие:
-
Если тег databaseIdProvider не настроен, то databaseId=null
-
Если тег databaseIdProvider настроен, используйте имя конфигурации тега, чтобы оно соответствовало информации базы данных, и задайте databaseId=, чтобы оно соответствовало значению, указанному в конфигурации, в противном случае оно по-прежнему равно null.
-
Если databaseId не равен нулю, он найдет только оператор sql, который настраивает databaseId.
-
MyBatis будет загружаться без свойства databaseId и со свойством databaseId, соответствующим текущей базе данных. Все заявления. Если один и тот же оператор найден как с идентификатором базы данных, так и без него, последний будет отброшен.
4.2.8, картограф
Используется, чтобы указать mybatis, какие файлы сопоставления Mapper импортировать при инициализации mybatis.
4.2.8.1, картограф регистрирует файлы сопоставления SQL один за другим
-
ресурс: импортировать файлы по пути к классам
-
url : введите сетевой путь или файл по пути к диску.
-
class : Знакомство с интерфейсом Mapper.
- Существует файл сопоставления SQL, и интерфейс Mapper должен иметь то же имя и расположение, что и файл сопоставления SQL.
- Нет файла сопоставления SQL, используйте аннотации для написания операторов SQL для методов интерфейса.
<mappers>
<mapper resource="EmployeeMapper.xml" />
<mapper class="com.dao.EmployeeMapper"/>
<package name="com.dao.mybatis.dao"/>
</mappers>
4.2.8.2. Использовать пакетную регистрацию
Этот метод требует, чтобы имя файла сопоставления SQL совпадало с именем интерфейса и находилось в том же каталоге.
<mappers>
<package name="com.dao"/>
</mappers>
Пять, файл сопоставления MyBatis
Настоящая сила MyBatis заключается в его отображении., в этом и заключается его магия. Из-за своей мощности XML-файл картографа относительно прост. Если вы сравните его с кодом JDBC с той же функциональностью, то сразу увидите, что сохраняется почти 95% кода. MyBatis создан для SQL и делает это лучше, чем обычно.
Файл карты SQL содержит несколько элементов верхнего уровня (в том порядке, в котором они должны быть определены):
cache – 给定命名空间的缓存配置。
cache-ref – 其他命名空间缓存配置的引用。
resultMap – 是最复杂也是最强大的元素,用来描述如何从数据库结果集中来加载对象。
parameterMap – 已废弃!
sql – 可被其他语句引用的可重用语句块。
insert – 映射插入语句
update – 映射更新语句
delete – 映射删除语句
select – 映射查询语
5.1 Сравнение двух методов разработки Mybatis
5.1.1 Недостатки традиционной разработки дао
Пример, с которого мы начали, — это традиционная операция dao.Мы видим, что эта операция чрезвычайно громоздка, не только громоздка, но и класс реализации dao не выполняет никакой существенной работы.Он просто находит сопоставление файла сопоставления через соответствующий API of SqlSession В операторе SQL соответствующего идентификатора фактическая работа с БД фактически выполняется фреймворком через SQL в преобразователе.
5.1.2, преимущества современной разработки дао
Платформа MyBatis отказывается от класса реализации Dao и напрямую находит соответствующий оператор SQL в файле сопоставления. БД для работы. Эта реализация Dao называется динамическим прокси-методом Mapper. Метод динамического прокси Mapper не требует от программистов реализации интерфейса Dao. Интерфейс представляет собой динамический код, автоматически генерируемый MyBatis в сочетании с файлом сопоставления. осуществленный.
5.2, динамический прокси Mybatis
5.2.1, получить прокси-объект
Мы просто вызываем SqlSessiongetMapper()
метод для получения объекта класса реализации указанного интерфейса. Параметр этого метода является значением класса указанного класса интерфейса Dao.
SqlSession session = factory.openSession();
UserDao dao = session.getMapper(UserDao.class);
//或者可以使用工具类
UserDao userDao =
MyBatisUtil.getSqlSession().getMapper(UserDao.class);
5.2.2. Используйте прокси-объект для выполнения инструкции sql
@Test
public void TestUpdate(){
User user = new User(16,"赵六","110");
userDao.update(user);
}
5.2.3 Принцип динамического прокси
Этот метод называется динамическим прокси, мы его видим при отладке
Щелкните определение класса MapperProxy:
Метод вызова():
Нажмите на метод выполнения, ключевой метод:
5.3 Как сгенерировать первичный ключ и получить значение первичного ключа
5.3.1 Метод генерации первичного ключа
- Поддержка автоинкремента первичного ключа, например базы данных MySQL.
- Автоинкремент первичного ключа не поддерживается, например, в базе данных Oracle.
5.3.2, получить значение первичного ключа
若数据库支持自动生成主键的字段(比如 MySQL 和 SQL Server ),则可以设置`useGeneratedKeys=”true”`,然后再把 keyProperty 设置到目标属性上。
<insert id="insertEmployee"
insert id="insertEmployee"parameterType="com.atguigu.mybatis.beans.Employee" databaseId="mysql" useGeneratedKeys="true" keyProperty="id">
insert into tbl_employee(last_name,email,gender) values(#{lastName},#{email},#{gender})
</insert>
Для баз данных, которые не поддерживают автоинкремент первичных ключей (например, Oracle), вы можете использовать подэлемент selectKey: сначала будет запущен элемент selectKey, будет установлен идентификатор, а затем будет вызван оператор вставки.
<insert id="insertEmployee" parameterType="com.atguigu.mybatis.beans.Employee" databaseId="oracle">
<selectKey order="BEFORE" keyProperty="id" resultType="integer">
select employee_seq.nextval from dual
</selectKey>
insert into orcl_employee(id,last_name,email,gender) values(#{id},#{lastName},#{email},#{gender})
</insert>
или пишите так
<insert id="insertEmployee" parameterType="com.atguigu.mybatis.beans.Employee" databaseId="oracle">
<selectKey order="AFTER" keyProperty="id" resultType="integer">
select employee_seq.currval from dual
</selectKey>
insert into orcl_employee(id,last_name,email,gender) values(employee_seq.nextval,#{lastName},#{email},#{gender})
</insert>
5.4, передача параметров
5.4.1 Способ передачи параметров
5.4.1.1, один простой параметр
Может принимать примитивные типы, типы объектов. В этом случае MyBatis может использовать этот параметр напрямую без какой-либо обработки.
Используйте заполнители в mapper.xml #{ 任意字符 }
для представления этого параметра, независимо от имени параметра метода. Но обычно мы будем использовать имя параметра метода для имени.
//接口中的方法:
User selectById(int id);
<!--mapper文件-->
<select id="selectById" resultType="com.bjpowernode.domain.Student">
select id,username,pwd from user where id=#{abcd}
</select>
<!--
#{abcd} , abcd是自定义的变量名称,可以不和方法参数名相同,但是实际开发中一般是相同的。
-->
5.4.1.2 Несколько параметров (аннотации постов)
Любое количество параметров будет переупаковано MyBatis в виде карты и передано. Ключ карты — param1, param2 или 0, 1..., а значение — значение параметра.
Обычно нам нужно добавить **@Param ("имя пользовательского параметра") перед параметрами метода, а файл сопоставления использует #{имя пользовательского параметра}**, чтобы указать, что передается несколько параметров.
//接口方法
List<User> selectUserByCondition(@Param("username") String username, @Param("pwd") int pwd);
<!--mapper文件-->
<select id="selectUserByCondition" resultType="com.domain.User">
select id,username,pwd from student where username = #{username} or pwd = #{pwd}
</select>
5.4.1.3 Несколько параметров (инкапсулированных в объекты)
Когда нам нужно передать несколько параметров, мы можем напрямую инкапсулировать эти объекты в объект, мы можем напрямую передать объект JavaBean и записать свойства объекта в заполнителе.
5.4.1.4 Карта
Коллекция Map может хранить несколько значений и использовать Map для одновременной передачи нескольких параметров в файл сопоставления. Коллекция Map использует ключи String и значения Object для хранения параметров. использование файла сопоставления# { key }Справочное значение параметра.
//接口方法
List<User> selectMultiMap(Map<String,Object> map);
<!--mapper文件-->
<select id="selectMultiMap" resultType="com.domain.User">
select id,username,pwd from user where username=#{username} or pwd =#{pwd}
</select>
5.4.1.5 Коллекция/массив
будет инкапсулирован MyBatis в виде карты и передан. Ключ, соответствующий коллекции, является коллекцией, а ключ, соответствующий массиву, является массивом. Если определено, что это коллекция списка, ключ также может быть списком.
5.4.2 Анализ исходного кода передачи параметров
В качестве примера возьмем именованные параметры:
public User getUserByIdAndUsername
(@Param("id")Integer id, @Param("username")String username);
Анализ исходного кода
public Object getNamedParams(Object[] args) {
final int paramCount = names.size();
if (args == null || paramCount == 0) {
return null;
} else if (!hasParamAnnotation && paramCount == 1) {
return args[names.firstKey()];
} else {
final Map<String, Object> param = new ParamMap<Object>();
int i = 0;
for (Map.Entry<Integer, String> entry : names.entrySet()) {
param.put(entry.getValue(), args[entry.getKey()]);
// add generic param names (param1, param2, ...)
final String genericParamName = GENERIC_NAME_PREFIX +
String.valueOf(i + 1);
// ensure not to overwrite parameter named with @Param
if (!names.containsValue(genericParamName)) {
param.put(genericParamName, args[entry.getKey()]);
}
i++;
}
return param;
}
}
5.4.3, обработка параметров
Атрибуты, поддерживаемые позициями параметров
javaType, jdbcType, режим, numericScale, resultMap, typeHandler, jdbcTypeName, выражение
Пример использования
**На самом деле обычно устанавливается следующее: укажите jdbcType для возможных пустых имен столбцов**
<select id="selectMultiObject" resultType="com.domain.User">
select id,username pwd from user
where username=#{username,javaType=string,jdbcType=VARCHAR}
or pwd =#{pwd,javaType=int,jdbcType=INTEGER}
</select>
5.4.4 Как получить параметры
5.4.4.1, #
#
Заполнитель: вместо этого указывает mybatis использовать фактическое значение параметра. и использоватьPrepareStatementОбъект выполняет оператор sql,#{…}
вместо инструкции sql?
. Это безопаснее, быстрее и, как правило, является предпочтительной практикой.
<!--mapper文件-->
<select id="selectById" resultType="com.domain.User">
select id,username,pwd from user where id=#{id}
</select>
//转为 MyBatis 的执行是:
String sql=” select id,username,pwd from user where id=?”;
PreparedStatement ps = conn.prepareStatement(sql);
ps.setInt(1,1005);
//解释:
where id=? 就是 where id=#{id}
ps.setInt(1,1005) , 1005 会替换掉 #{id}
5.4.4.2, $
$
Замена строки: скажите mybatis использовать{} контент подключен. В основном используется для замены имен таблиц, имен столбцов, сортировки разных столбцов и т. д.
//需求:使用不同列作为查询条件
//接口方法
User findByDiffField(@Param("col") String colunName,@Param("cval") Object value);
<!--mapper文件-->
<select id="findByDiffField" resultType="com.domain.User">
select * from user where ${col} = #{cval}
</select>
5.5 Несколько ситуаций запроса на выборку
5.5.1 Запросить одну строку данных и вернуть один объект
public User getUserById(Integer id );
5.5.2 Запрос нескольких строк данных возвращает набор объектов
public List<User> getAllUser();
5.5.3. Запрос одной строки данных и возврат коллекции Map
public Map<String,Object> getUserByIdReturnMap(Integer id );
5.5.4 Запрос нескольких строк данных и возврат коллекции Map
@MapKey("id") // 指定使用对象的哪个属性来充当 map 的 key
public Map<Integer,User> getAllUserReturnMap();
5.6, автоматическое сопоставление типа результата
Выполните sql, чтобы получить тип, преобразованный набором результатов, используя полное имя или псевдоним типа. Обратите внимание, что если возвращается коллекция, для нее должен быть установлен тип, содержащийся в коллекции, а не сама коллекция. resultType и resultMap нельзя использовать одновременно.
Метод интерфейса возвращает тип коллекции, и вам нужно указать тип коллекции, а не саму коллекцию.
5.6.1 Простые типы
//接口方法
int countUser();
<!--mapper 文件-->
<select id="countUser" resultType="int">
select count(*) from user
</select>
5.6.2 Тип объекта
//接口方法
List<User> selectUsers();
<!--mapper文件-->
<select id="selectUsers" resultType="com.domain.User">
select id,username,pwd from user
</select>
5.6.3 Принцип определения типа результата
Используйте конструктор для создания объектов. Вызовите setXXX, чтобы присвоить значение свойству.
столбец оператора sql | методы Java-объекта |
---|---|
id | setId(rs.setInt("id")) |
username | setUsername(rs.setString("username")) |
pwd | setPwd(rs.setString("pwd")) |
- autoMappingBehavior по умолчанию имеет значение PARTIAL, что включает автоматическое сопоставление.Единственное требование состоит в том, чтобы имя столбца совпадало с именем свойства javaBean.
- Если autoMappingBehavior имеет значение null, автоматическое сопоставление будет отменено.
- Спецификация именования полей базы данных, атрибуты POJO соответствуют номенклатуре верблюжьих регистров, например A_COLUMN aColumn, мы можем включить функцию автоматического сопоставления правил именования верблюжьих регистров, mapUnderscoreToCamelCase=true
5.7, пользовательское сопоставление resultMap
resultMap может настроить отношение сопоставления между результатами sql и свойствами объекта java. Больше гибкости в назначении значений столбца указанным свойствам.Обычно используется, когда имя столбца отличается от имени свойства объекта Java.
- id : используется для завершения сопоставления значений первичного ключа.
- результат: используется для завершения сопоставления обычных столбцов.
- ассоциация : ассоциация сложного типа, в которую будут упакованы многие результаты.
- collection : Коллекция сложных типов.
Атрибуты | значение |
---|---|
property | Поле или свойство, которое сопоставляется с результатом столбца, например: "имя пользователя" или "адрес.улица.номер" |
column | имена столбцов таблицы данных, обычно иresultSet.getString(columnName) Возвращаемое значение такое же |
<!--resultMap: resultMap 标签中的 id 属性值-->
<select id="getEmployeeById" resultMap="myEmp">
select id, last_name,email, gender from tbl_employee where id =#{id}
</select>
<!-- 创建 resultMap
id:自定义的唯一名称,在<select>使用
type:期望转为的 java 对象的全限定名称或别名
-->
<resultMap type="com.domain.Employee" id="myEmp">
<!-- 主键字段使用 id -->
<id column="id" property="id" />
<!--非主键字段使用 result-->
<result column="last_name" property="lastName"/>
<result column="email" property="email"/>
<result column="gender" property="gender"/>
</resultMap>
5.7.1 Ассоциация
5.7.1.1, ассоциация
Свойство в POJO может быть объектом, мы можем использовать запрос на объединение и инкапсулировать объект в виде каскадных свойств.Используйте тег ассоциации, чтобы определить правила инкапсуляции объекта
@Data
public class Department {
private Integer id ;
private String departmentName ;
}
@Data
public class Employee {
private Integer id ;
private String lastName;
private String email ;
private String gender ;
private Department dept ;
}
<select id="getEmployeeAndDept" resultMap="myEmpAndDept" >
SELECT e.id eid, e.last_name, e.email,e.gender ,d.id did, d.dept_name
FROM tbl_employee e , tbl_dept d
WHERE e.d_id = d.id
AND e.id = #{id}
</select>
<resultMap type="com.domain.Employee" id="myEmpAndDept">
<id column="eid" property="id"/>
<result column="last_name" property="lastName"/>
<result column="email" property="email"/>
<result column="gender" property="gender"/>
<association property="dept" javaType="com.domain.Department">
<id column="did" property="id"/>
<result column="dept_name" property="departmentName"/>
</association>
</resultMap>
5.7.1.2, пошаговый запрос ассоциации
В реальной разработке должен быть определенный метод добавления, удаления, изменения и проверки для каждого класса сущностей, то есть уровня DAO, Поэтому для нужд запроса информации о сотрудниках и запроса информации о соответствующем отделе вы можете использовать пошаговый метод. Заполните запрос.
- Первый запрос информации о сотруднике по идентификатору сотрудника
- Затем запросите информацию о соответствующем отделе с помощью внешнего ключа (идентификатора отдела) в запрошенной информации о сотруднике.
<select id="getEmployeeAndDeptStep" resultMap="myEmpAndDeptStep">
select id, last_name, email,gender,d_id from tbl_employee where id =#{id}
</select>
<resultMap type="com.atguigu.mybatis.beans.Employee" id="myEmpAndDeptStep">
<id column="id" property="id" />
<result column="last_name" property="lastName"/>
<result column="email" property="email"/>
<result column="gender" property="gender"/>
<association property="dept"
select="com.atguigu.mybatis.dao.DepartmentMapper.getDeptById"
column="d_id"
fetchType="eager">
</association>
</resultMap>
5.7.1.3, запрос шага ассоциации с отложенной загрузкой
На основе пошагового запроса можно использовать ленивую загрузку для повышения эффективности запроса, и нужно только настроить следующие параметры в глобальных настройках.
<!-- 开启延迟加载 -->
<setting name="lazyLoadingEnabled" value="true"/>
<!-- 设置加载的数据是按需还是全部 -->
<setting name="aggressiveLazyLoading" value="false"/>
5.7.2, коллекция
5.7.2.1, сбор
Свойство в POJO может быть объектом коллекции, мы можем использовать совместный запрос и запечатать его в виде каскадных свойств. Инкапсуляция объектов.Используйте тег коллекции, чтобы определить правила инкапсуляции для объектов.
@Data
public class Department {
private Integer id ;
private String departmentName ;
private List<Employee> emps ;
}
<select id="getDeptAndEmpsById" resultMap="myDeptAndEmps">
SELECT d.id did, d.dept_name ,e.id eid ,e.last_name ,e.email,e.gender
FROM tbl_dept d
LEFT OUTER JOIN tbl_employee e
ON d.id = e.d_id
WHERE d.id = #{id}
</select>
<resultMap type="com.atguigu.mybatis.beans.Department" id="myDeptAndEmps">
<id column="did" property="id"/>
<result column="dept_name" property="departmentName"/>
<!--
property: 关联的属性名
ofType: 集合中元素的类型
-->
<collection property="emps" ofType="com.atguigu.mybatis.beans.Employee">
<id column="eid" property="id"/>
<result column="last_name" property="lastName"/>
<result column="email" property="email"/>
<result column="gender" property="gender"/>
</collection>
</resultMap>
5.7.2.2 Пошаговый запрос сбора
В реальной разработке должен быть определенный метод добавления, удаления, изменения и проверки для каждого класса сущностей, то есть уровня DAO.Поэтому для нужд запроса информации об отделе и запроса всей соответствующей информации о сотрудниках вы можете шаг за шагом способ завершения запроса.
- Сначала запросите информацию об отделе через идентификатор отдела.
- Затем используйте идентификатор отдела в качестве внешнего ключа сотрудника, чтобы запросить информацию о соответствующем отделе.
<select id="getDeptAndEmpsByIdStep" resultMap="myDeptAndEmpsStep">
select id ,dept_name from tbl_dept where id = #{id}
</select>
<resultMap type="com.atguigu.mybatis.beans.Department" id="myDeptAndEmpsStep">
<id column="id" property="id"/>
<result column="dept_name" property="departmentName"/>
<collection property="emps" select="com.atguigu.mybatis.dao.EmployeeMapper.getEmpsByDid" column="id"></collection>
</resultMap>
5.7.3, расширение: пошаговый запрос передачи значений из нескольких столбцов
- Если во время пошагового запроса в вызывающий запрос необходимо передать несколько параметров, эти несколько параметров необходимо инкапсулировать в карту для передачи.Синтаксис следующий: {k1=v1, k2=v2... .}.
- На стороне вызываемого запроса при получении значения необходимо обращаться к методу значения карты, и ему нужно принимать значение строго в соответствии с ключом, используемым при инкапсуляции карты.
5.7.4. Расширение: свойство fetchType ассоциации или коллекции
- существует
<association>
и<collection>
В теге можно установить fetchType, чтобы указать, следует ли использовать отложенную загрузку для этого запроса. По умолчанию используется fetchType="lazy". - fetchType может гибко указывать, нужно ли запросу использовать отложенную загрузку, не отключая глобальные параметры отложенной загрузки, поскольку запрос не хочет использовать отложенную загрузку.
5.8, нечеткий запрос типа
Существует два способа реализации нечеткого запроса:
- Добавьте данные запроса в код Java
%
. - используется в файле сопоставления
like name "%" #{xxx} "%"
5.8.1 Метод 1
чтобы запросить имя с «мощью»
//接口方法
List<User> selectLikeFirst(String username);
<!--接口文件-->
<select id="selectLikeFirst" resultType="com.domain.User">
select id,username,pwd from user where username like #{username}
</select>
5.8.2 Метод 2
//接口方法
List<User> selectLikeSecond(String username);
<!--mapper文件-->
<select id="selectLikeSecond" resultType="com.domain.User">
select id,username,pwd from user where username like "%" #{studentName} "%"
</select>
Шесть, динамический SQL MyBatis
6.1 Введение в динамический SQL MyBatis
Динамический SQL с помощью различных тегов, предоставляемых MyBatis, для оценки условий для достижения динамического объединения операторов SQL. Условия здесь
Выражение, используемое для разрыва, является выражением OGNL. Обычно используемые динамические теги SQL: , , и т. д.
Оператор динамического SQL MyBatis очень похож на оператор JSTL. Динамический SQL в основном используется для решения проблемы неопределенных условий запроса: во время работы программы запрос выполняется в соответствии с условиями запроса, представленными пользователем. Представленные условия запроса отличаются, и выполняемые операторы SQL отличаются. Если перечислить каждую возможную ситуацию одну за другой, а все условия переставить местами и скомбинировать, получится большое количество операторов SQL. На этом этапе для решения такой проблемы можно использовать динамический SQL.
- Динамический SQL — одна из мощных функций MyBatis. Это значительно упрощает нашу операцию по сборке SQL.
- Динамические элементы SQL аналогичны использованию JSTL или других подобных текстовых процессоров на основе XML.
- MyBatis использует мощные выражения на основе OGNL для упрощения операций.
- OGNL (язык навигации по графам объектов) — это язык навигации по графам объектов, который является мощным языком выражений, с помощью которого вы можете легко управлять свойствами объектов. Аналогично нашим ЭЛ, СпЭЛ и т.д.
Примечание: специальные символы в xml, такие как ", >,
6.2, если и где
if
If используется для завершения простых суждений.
Where
Где используется для решения проблемы ключевого слова where в операторе SQL и первого и или или в условии
<select id="getEmpsByConditionIf" resultType="com.atguigu.mybatis.beans.Employee">
select id , last_name ,email , gender
from tbl_employee
<where>
<if test="id!=null">
and id = #{id}
</if>
<if test="lastName!=null && lastName!=""">
and last_name = #{lastName}
</if>
<if test="email!=null and email.trim()!=''">
and email = #{email}
</if>
<if test=""m".equals(gender) or "f".equals(gender)">
and gender = #{gender}
</if>
</where>
</select>
6.3, отделка
Trim может добавлять или удалять указанные символы до и после оператора SQL после оценки условия.Общими методами являются следующие:
префикс: добавить префикс prefixOverrides: удалить префикс суффикс: добавить суффикс suffixOverrides: удалить суффикс
<select id="getEmpsByConditionTrim" resultType="com.atguigu.mybatis.beans.Employee">
select id , last_name ,email , gender from tbl_employee
<trim prefix="where" suffixOverrides="and">
<if test="id!=null">
id = #{id} and
</if>
<if test="lastName!=null && lastName!=""">
last_name = #{lastName} and
</if>
<if test="email!=null and email.trim()!=''">
email = #{email} and
</if>
<if test=""m".equals(gender) or "f".equals(gender)">
gender = #{gender}
</if>
</trim>
</select>
6.4, набор
set в основном используется для решения проблемы, связанной с тем, что в операторе SQL в операции модификации может быть больше запятых.
<update id="updateEmpByConditionSet">
update tbl_employee
<set>
<if test="lastName!=null && lastName!=""">
last_name = #{lastName},
</if>
<if test="email!=null and email.trim()!=''">
email = #{email} ,
</if>
<if test=""m".equals(gender) or "f".equals(gender)">
gender = #{gender}
</if>
</set>
where id =#{id}
</update>
6.5, выбрать (когда, иначе)
выбор в основном используется для оценки ветвей, аналогично случаю переключения в java, он удовлетворит только одну из всех ветвей
<select id="getEmpsByConditionChoose" resultType="com.atguigu.mybatis.beans.Employee">
select id ,last_name, email,gender from tbl_employee
<where>
<choose>
<when test="id!=null">
id = #{id}
</when>
<when test="lastName!=null">
last_name = #{lastName}
</when>
<when test="email!=null">
email = #{email}
</when>
<otherwise>
gender = 'm'
</otherwise>
</choose>
</where>
</select>
6.6, для каждого
foreach основная итерация пользовательского цикла
коллекция: коллекция для повторения item: элемент, который в данный момент итерируется из коллекции открыть: начальный символ закрыть: конечный символ разделитель: разделитель между элементами индекс: Итерирует коллекцию List: индекс текущего элемента, представленный index Коллекция итерированных карт: ключ текущего элемента, представленный индексом
<select id="getEmpsByConditionForeach" resultType="com.atguigu.mybatis.beans.Employee">
select id , last_name, email ,gender from tbl_employee where id in
<foreach collection="ids" item="curr_id" open="(" close=")" separator="," >
#{curr_id}
</foreach>
</select>
6.7, скв
Тег sql используется для извлечения повторно используемых фрагментов sql, извлечения одинаковых, часто используемых фрагментов SQL, одиночных Он определяется независимо для удобства многократного использования.
извлечь sql
<sql id="selectSQL">
select id , last_name, email ,gender from tbl_employee
</sql>
Цитировать SQL
<include refid="selectSQL"></include>
Семь, механизм кэширования MyBatis
7.1 Введение в кэширование
- MyBatis включает в себя очень мощную функцию кэширования запросов, которую можно очень легко настроить и настроить. Кэширование может значительно повысить эффективность запросов
- Двухуровневый кеш, кеш первого уровня и кеш второго уровня определены по умолчанию в системе MyBatis.
- По умолчанию включен только кеш первого уровня (кэш уровня SqlSession, также известный как локальный кеш).
- Кэш второго уровня необходимо открывать и настраивать вручную, он основан на кеше уровня пространства имен.
- Для улучшения масштабируемости. MyBatis определяет интерфейс кеша Cache. Мы можем настроить кеш второго уровня, реализовав интерфейс Cache.
7.2, использование кеша первого уровня
Кэш первого уровня (локальный кеш), то есть локальный кеш, имеет область по умолчанию sqlSession. Когда сеанс сбрасывается или закрывается, все кэши в сеансе будут очищены. Локальный кеш нельзя закрыть, но вы можете вызвать функцию clearCache(), чтобы очистить локальный кеш или изменить область кеша.
7.2.1, механизм работы кэша первого уровня
Пока данные, запрошенные во время того же сеанса, будут сохранены на карте текущего SqlSession. ключ: hashCode + запрос SqlId + письменный оператор запроса sql + параметры
7.2.2 Несколько ситуаций инвалидации кэша первого уровня
- Разные SqlSessions соответствуют разным кешам первого уровня.
- Тот же SqlSession, но разные условия запроса
- Любое добавление, удаление или изменение выполняется во время двух запросов одного и того же SqlSession.
- Кэш был очищен вручную во время двух запросов одного и того же SqlSession.
##7.3, использование вторичного кэша
-
Кэш второго уровня (кэш второго уровня), кеш глобальной области видимости, кеш второго уровня не включен по умолчанию и требует настройки вручную.
-
MyBatis предоставляет интерфейс и реализацию кеша второго уровня.Реализация кеша требует POJO для реализации интерфейса Serializable.
-
Кэш второго уровня не вступит в силу, пока SqlSession не будет закрыт или зафиксирован.
Шаги для использования кэша второго уровня:
- Включите кеш L2 в глобальном файле конфигурации
- Используйте кеш для настройки кеша в файле сопоставления, который должен использовать кеш второго уровня.
- Примечание. POJO должны реализовать интерфейс Serializable.
Свойства, связанные с кешем L2
-
eviction="FIFO": стратегия утилизации кэша:
-
LRU — наименее использовавшиеся: удаляет объекты, которые не использовались в течение длительного времени.
-
FIFO — First In First Out: порядок объектов в кеше для их удаления.
-
Мягкая ссылка: удаление объектов на основе состояния сборщика мусора и правил мягкой ссылки.
-
WEAK — слабые ссылки: более агрессивное удаление объектов на основе состояния сборщика мусора и правил слабых ссылок. По умолчанию используется LRU.
-
flushInterval: интервал обновления, в миллисекундах, по умолчанию не задан, то есть интервал обновления отсутствует, кэш обновляется только при вызове оператора
-
размер: количество ссылок, положительное целое число, представляющее максимальное количество объектов, которые может хранить кеш, слишком большой может легко привести к переполнению памяти
-
readOnly: только чтение, true/false
true: кеш только для чтения; всем вызывающим объектам будет возвращен один и тот же экземпляр объекта кеша. Поэтому эти объекты не могут быть Исправлять. Это обеспечивает значительное преимущество в производительности.
false: читать и записывать кеш; вернет копию кешированного объекта (через сериализацию). Это будет медленнее, но безопасно, Таким образом, значение по умолчанию ложно.
7.4 Настройки свойств, связанных с кэшем
Атрибуты | значение |
---|---|
глобальные настройки cacheEnable | Настройте переключатель кэша второго уровня, кэш первого уровня всегда открыт |
Атрибут useCache тега select | Настройте, использует ли этот выбор кэш второго уровня. Кэш 1-го уровня всегда используется |
Атрибут flushCache тега sql | Добавляет, удаляет и изменяет значение по умолчанию flushCache=true. После выполнения sql кэши первого и второго уровня будут очищены одновременно. Стандартный запрос flushCache=false. |
sqlSession.clearCache(): | Просто используется для очистки кеша первого уровня |
7.5. Интеграция сторонних кешей
Для улучшения масштабируемости. MyBatis определяет интерфейс кеша Cache. Мы можем настроить кеш второго уровня, реализовав интерфейс Cache. EhCache — это среда внутрипроцессного кэширования на чистом языке Java с быстрыми, компактными и другими характеристиками. Это CacheProvider по умолчанию в Hibernate.
Шаги по интеграции EhCache
- Импортируйте пакет ehcache, а также пакет интеграции, пакет журнала (maven тоже работает) ehcache-core-2.6.8.jar, mybatis-ehcache-1.0.3.jar slf4j-api-1.6.1.jar, slf4j-log4j12-1.6.2.jar
- Напишите файл конфигурации ehcache.xml
<?xml version="1.0" encoding="UTF-8"?>
<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="../config/ehcache.xsd">
<!-- 磁盘保存路径 -->
<diskStore path="D:\atguigu\ehcache" />
<defaultCache
maxElementsInMemory="1000"
maxElementsOnDisk="10000000"
eternal="false"
overflowToDisk="true"
timeToIdleSeconds="120"
timeToLiveSeconds="120"
diskExpiryThreadIntervalSeconds="120"
memoryStoreEvictionPolicy="LRU">
</defaultCache>
</ehcache>
<!--
属性说明:
l diskStore:指定数据在磁盘中的存储位置。
l defaultCache:当借助CacheManager.add("demoCache")创建Cache时,EhCache
便会采用<defalutCache/>指定的的管理策略
以下属性是必须的:
l maxElementsInMemory - 在内存中缓存的element的最大数目
l maxElementsOnDisk - 在磁盘上缓存的element的最大数目,若是0表示无穷大
l eternal - 设定缓存的elements是否永远不过期。如果为true,则缓存的数据始
终有效,如果为false那么还要根据timeToIdleSeconds,timeToLiveSeconds判断
l overflowToDisk - 设定当内存缓存溢出的时候是否将过期的element缓存到磁
盘上
以下属性是可选的:
l timeToIdleSeconds - 当缓存在EhCache中的数据前后两次访问的时间超过
timeToIdleSeconds的属性取值时,这些数据便会删除,默认值是0,也就是可闲置
时间无穷大
l timeToLiveSeconds - 缓存element的有效生命期,默认是0.,也就是element存活
时间无穷大
diskSpoolBufferSizeMB 这个参数设置DiskStore(磁盘缓存)的缓存区大小.默认
是30MB.每个Cache都应该有自己的一个缓冲区.
l diskPersistent - 在VM重启的时候是否启用磁盘保存EhCache中的数据,默认是
false。
l diskExpiryThreadIntervalSeconds - 磁盘缓存的清理线程运行间隔,默认是120
秒。每个120s,相应的线程会进行一次EhCache中数据的清理工作
l memoryStoreEvictionPolicy - 当内存缓存达到最大,有新的element加入的时
候, 移除缓存中element的策略。默认是LRU(最近最少使用),可选的有LFU
(最不常使用)和FIFO(先进先出)
-->
- Настройте тег кеша
<cache type="org.mybatis.caches.ehcache.EhcacheCache"></cache>
Во-вторых, реверс-инжиниринг MyBatis.
8.1 Введение в обратный инжиниринг
Генератор MyBatis: для краткости MBG — это генератор кода, специально настроенный для пользователей платформы MyBatis, который может быстро генерировать соответствующие файлы сопоставления, интерфейсы и классы компонентов в соответствии с таблицами. Поддержка базового добавления, удаления, изменения и запроса, а также условного запроса в стиле QBC. Однако определения сложных sql, таких как соединения таблиц и хранимые процедуры, необходимо писать вручную.
Официальный адрес документаwww.mybatis.org/generator/Официальный адрес проектаGitHub.com/ не поставил boost/ с…
8.2, обратное проектирование конфигурации
- Импортируйте обратно спроектированный пакет jar: mybatis-generator-core-1.3.2.jar.
- Напишите файлы конфигурации MBG (важные конфигурации), обратитесь к официальному руководству.
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE generatorConfiguration
PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN"
"http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd">
<generatorConfiguration>
<!--
targetRuntime: 执行生成的逆向工程的版本
MyBatis3Simple: 生成基本的CRUD
MyBatis3: 生成带条件的CRUD
-->
<context id="DB2Tables" targetRuntime="MyBatis3">
<jdbcConnection driverClass="com.mysql.jdbc.Driver"
connectionURL="jdbc:mysql://localhost:3306/mybatis_1129"
userId="root"
password="1234">
</jdbcConnection>
<!-- javaBean的生成策略-->
<javaModelGenerator targetPackage="com.atguigu.mybatis.beans"
targetProject=".\src">
<property name="enableSubPackages" value="true" />
<property name="trimStrings" value="true" />
</javaModelGenerator>
<!-- SQL映射文件的生成策略 -->
<sqlMapGenerator targetPackage="com.atguigu.mybatis.dao"
targetProject=".\conf">
<property name="enableSubPackages" value="true" />
</sqlMapGenerator>
<!-- Mapper接口的生成策略 -->
<javaClientGenerator type="XMLMAPPER"
targetPackage="com.atguigu.mybatis.dao" targetProject=".\src">
<property name="enableSubPackages" value="true" />
</javaClientGenerator>
<!-- 逆向分析的表 -->
<table tableName="tbl_dept" domainObjectName="Department"></table>
<table tableName="tbl_employee" domainObjectName="Employee"></table>
</context>
</generatorConfiguration>
- Напишите код Java для запуска
@Test
public void testMBG() throws Exception {
List<String> warnings = new ArrayList<String>();
boolean overwrite = true;
File configFile = new File("mbg.xml");
ConfigurationParser cp = new ConfigurationParser(warnings);
Configuration config = cp.parseConfiguration(configFile);
DefaultShellCallback callback = new DefaultShellCallback(overwrite);
MyBatisGenerator myBatisGenerator = new MyBatisGenerator(config,
callback, warnings);
myBatisGenerator.generate(null);
}
8.3. Использование обратного проектирования
Тесты для базовых запросов
@Test
public void testSelect() throws Exception {
SqlSessionFactory ssf = getSqlSessionFactory();
SqlSession session = ssf.openSession();
try {
EmployeeMapper mapper =
session.getMapper(EmployeeMapper.class);
List<Employee> emps = mapper.selectAll();
for (Employee employee : emps) {
System.out.println(employee);
}
} finally {
session.close();
}
}
Тест с условным запросом
@Test
public void testSelect() throws Exception {
SqlSessionFactory ssf = getSqlSessionFactory();
SqlSession session = ssf.openSession();
try {
EmployeeMapper mapper =
session.getMapper(EmployeeMapper.class);
//条件查询: 名字中带有'张' 并且 email中'j' 或者 did = 2
EmployeeExample example = new EmployeeExample();
Criteria criteria = example.createCriteria();
criteria.andLastNameLike("%张%");
criteria.andEmailLike("%j%");
//or
Criteria criteriaOr = example.createCriteria();
criteriaOr.andDIdEqualTo(2);
example.or(criteriaOr);
List<Employee> emps = mapper.selectByExample(example);
for (Employee employee : emps) {
System.out.println(employee);
}
} finally {
session.close();
}
}
# 9. Плагин пейджинга Extension-PageHelper
9.1, Знакомство с подключаемым модулем подкачки PageHelper
PageHelper — очень удобный сторонний плагин для пейджинга в MyBatis, официальная документация:https://github.com/pagehelper/Mybatis-PageHelper/blob/master/README_zh.md
9.2. Шаги по использованию PageHelper
-
Импорт связанных пакетов pagehelper-x.x.x.jar и jsqlparser-0.9.5.jar
-
Настройте плагин подкачки в файле глобальной конфигурации MyBatis.
<plugins>
<plugin interceptor="com.github.pagehelper.PageInterceptor"></plugin>
</plugins>
-
Разбиение на страницы с использованием методов, предоставляемых PageHelper
-
Результаты могут быть возвращены с помощью более мощной оболочки PageInfo.
9.3, использование объекта Page
Установите информацию о подкачке через PageHelper.startPage(номер страницы, количество штук) перед запросом, этот метод возвращает объект Page
@Test
public void testPageHelper() throws Exception{
SqlSessionFactory ssf = getSqlSessionFactory();
SqlSession session = ssf.openSession();
try {
EmployeeMapper mapper =
session.getMapper(EmployeeMapper.class);
//设置分页信息
Page<Object> page = PageHelper.startPage(9, 1);
List<Employee> emps = mapper.getAllEmps();
for (Employee employee : emps) {
System.out.println(employee);
}
System.out.println("=============获取分页相关的信息
=================");
System.out.println("当前页: " + page.getPageNum());
System.out.println("总页码: " + page.getPages());
System.out.println("总条数: " + page.getTotal());
System.out.println("每页显示的条数: " + page.getPageSize());
} finally {
session.close();
}
}
9.4 Использование объекта PageInfo
После запроса данных используйте объект PageInfo для инкапсуляции результатов запроса, вы можете получить более подробную информацию о пейджинге и завершить логику пейджинга.
@Test
public void testPageHelper1() throws Exception{
SqlSessionFactory ssf = getSqlSessionFactory();
SqlSession session = ssf.openSession();
try {
EmployeeMapper mapper =
session.getMapper(EmployeeMapper.class);
//设置分页信息
Page<Object> page = PageHelper.startPage(9, 1);
List<Employee> emps = mapper.getAllEmps();
//
PageInfo<Employee> info = new PageInfo<>(emps,5);
for (Employee employee : emps) {
System.out.println(employee);
}
System.out.println("=============获取详细分页相关的信息
=================");
System.out.println("当前页: " + info.getPageNum());
System.out.println("总页码: " + info.getPages());
System.out.println("总条数: " + info.getTotal());
System.out.println("每页显示的条数: " + info.getPageSize());
System.out.println("是否是第一页: " + info.isIsFirstPage());
System.out.println("是否是最后一页: " + info.isIsLastPage());
System.out.println("是否有上一页: " + info.isHasPreviousPage());
System.out.println("是否有下一页: " + info.isHasNextPage());
System.out.println("============分页逻辑===============");
int [] nums = info.getNavigatepageNums();
for (int i : nums) {
System.out.print(i +" " );
}
} finally {
session.close();
}
}
10. Интеграция SSM Framework
10.1. Примечания по интеграции
- Посмотреть пакеты адаптации, используемые при интеграции Spring с разными версиями MyBatis;
- Скачать пакет адаптации интеграции:GitHub.com/ не поставил boost/spr…
- Официальный пример интеграции, jpetstore:GitHub.com/ не добавил boost/в PE…
10.2 Объединяйте идеи и шаги
среда сборки
Создайте динамический веб-проект, импортируйте пакет jar, который должен использовать SSM, импортируйте пакет адаптации интеграции, импортируйте некоторые пакеты поддержки для других технологий, пул соединений, драйвер базы данных, журнал....
Spring + Springmvc
- Настройте в web.xml: интерфейсный контроллер Springmvc. Создайте прослушиватель контейнера Spring, фильтр кодировки символов. Фильтр REST.
- Создайте файл конфигурации Spring: applicationContext.xml: сканирование компонентов, пул соединений, транзакции...
- Создайте файл конфигурации Springmvc: springmvc.xml: сканирование компонентов, просмотр парсера
MyBatis
- Создайте глобальный файл конфигурации для MyBatis
- Записать файл сопоставления Mapper интерфейса класса сущности
Spring + MyBatis
- Создание MyBatis SqlSession.
- Класс реализации прокси интерфейса Mapper MyBatis
контрольная работа
10.3. Интегрированная конфигурация
10.3.1. web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">
<!-- 字符编码过滤器 -->
<filter>
<filter-name>CharacterEncodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>CharacterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<!-- REST 过滤器 -->
<filter>
<filter-name>HiddenHttpMethodFilter</filter-name>
<filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>HiddenHttpMethodFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<!-- 实例化SpringIOC容器的监听器 -->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:applicationContext.xml</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<!-- Springmvc的前端控制器 -->
<servlet>
<servlet-name>springDispatcherServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springmvc.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>springDispatcherServlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
10.3.2, Конфигурация пружины
<?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:tx="http://www.springframework.org/schema/tx"
xmlns:mybatis-spring="http://mybatis.org/schema/mybatis-spring"
xsi:schemaLocation="http://mybatis.org/schema/mybatis-spring
http://mybatis.org/schema/mybatis-spring-1.2.xsd
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-4.0.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-4.0.xsd">
<!-- 组件扫描 -->
<context:component-scan base-package="com.atguigu.ssm">
<context:exclude-filter type="annotation"
expression="org.springframework.stereotype.Controller"/>
</context:component-scan>
<!-- 连接池 -->
<context:property-placeholder location="classpath:db.properties"/>
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="driverClass" value="${jdbc.driver}"></property>
<property name="jdbcUrl" value="${jdbc.url}"></property>
<property name="user" value="${jdbc.username}"></property>
<property name="password" value="${jdbc.password}"></property>
</bean>
<!-- 事务 -->
<bean id="dataSourceTransactionManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"></property>
</bean>
<tx:annotation-driven transaction-manager="dataSourceTransactionManager"/>
</beans>
10.3.3 Конфигурация SpringMVC
<?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:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-4.0.xsd">
<!-- 组件扫描 -->
<context:component-scan base-package="com.atguigu.ssm" use-default-filters="false">
<context:include-filter type="annotation"
expression="org.springframework.stereotype.Controller"/>
</context:component-scan>
<!--视图解析器 -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/views/"></property>
<property name="suffix" value=".jsp"></property>
</bean>
<mvc:default-servlet-handler/>
<mvc:annotation-driven/>
</beans>
10.3.4, Конфигурация MyBatis
глобальная конфигурация файла
<?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>
<!-- Spring 整合 MyBatis 后, MyBatis中配置数据源,事务等一些配置都可以
迁移到Spring的整合配置中。MyBatis配置文件中只需要配置与MyBatis相关
的即可。
-->
<!-- settings: 包含很多重要的设置项 -->
<settings>
<!-- 映射下划线到驼峰命名 -->
<setting name="mapUnderscoreToCamelCase" value="true"/>
<!-- 设置Mybatis对null值的默认处理 -->
<setting name="jdbcTypeForNull" value="NULL"/>
<!-- 开启延迟加载 -->
<setting name="lazyLoadingEnabled" value="true"/>
<!-- 设置加载的数据是按需还是全部 -->
<setting name="aggressiveLazyLoading" value="false"/>
<!-- 配置开启二级缓存 -->
<setting name="cacheEnabled" value="true"/>
</settings>
</configuration>
Конфигурация файла карты SQL
<?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.atguigu.ssm.mapper.EmployeeMapper">
<!-- public List<Employee> getAllEmps(); -->
<select id="getAllEmps" resultMap="myEmpsAndDept" >
select e.id eid, e.last_name,e.email,e.gender, d.id did, d.dept_name
from tbl_employee e ,tbl_dept d
where e.d_id = d.id
</select>
<resultMap type="com.atguigu.ssm.beans.Employee" id="myEmpsAndDept">
<id column="eid" property="id"/>
<result column="last_name" property="lastName"/>
<result column="email" property="email"/>
<result column="gender" property="gender"/>
<association property="dept" javaType="com.atguigu.ssm.beans.Department">
<id column="did" property="id"/>
<result column="dept_name" property="departmentName"/>
</association>
</resultMap>
</mapper>
Spring интегрирует конфигурацию MyBatis
<!-- Spring 整合 Mybatis -->
<!--1. SqlSession -->
<bean class="org.mybatis.spring.SqlSessionFactoryBean">
<!-- 指定数据源 -->
<property name="dataSource" ref="dataSource"></property>
<!-- MyBatis的配置文件 -->
<property name="configLocation"
value="classpath:mybatis-config.xml"></property>
<!-- MyBatis的SQL映射文件 -->
<property name="mapperLocations"
value="classpath:mybatis/mapper/*.xml"></property>
<property name="typeAliasesPackage"
value="com.atguigu.ssm.beans"></property>
</bean>
<!-- Mapper接口
MapperScannerConfigurer 为指定包下的Mapper接口批量生成代理实现类.bean
的默认id是接口名首字母小写.
-->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="com.atguigu.ssm.mapper"></property>
</bean>
<!-- <mybatis-spring:scan base-package="com.atguigu.ssm.mapper"/> -->
контрольная работа