GitHub: github.com/hsowan/soms
SOMS
Система управления заказами в супермаркетах Система управления заказами в супермаркетах
Day 01
Использование MyBatis
Официальная документация MyBatis
Refer: woohoo. не добавил elevate.org/ не добавил elevate-3/ в…
введите псевдоним
Псевдонимы типов — ваш хороший помощник. Используя их, вы можете избежать ввода полного имени класса. Например:
<!-- mybatis-config.xml 中 -->
<typeAlias type="com.someapp.model.User" alias="User"/>
<!-- SQL 映射 XML 中 -->
<select id="selectUsers" resultType="User">
select id, username, hashedPassword
from some_table
where id = #{id}
</select>
log4j2
Refer: logging.apache.org/log4 просто/2.маленький/нет…
Ярлыки Eclipse для Mac
удалить строку
Command + D
Refer: woo woo woo.cn blog on.com/tank ξo/afraid/…
код формата
Shift + Command + F
Day 02
Базовая конфигурация MyBatis
конфигурация mybatis-config.xml
- конфигурация
- характеристики
- настройки
- typeAliases
- typeHandlers
- Фабрика объектов
- плагины
-
среды (конфигурация среды)
- среда (переменная среды)
- менеджер транзакций
- источник данных (источник данных)
- среда (переменная среды)
- databaseIdProvider (идентификатор поставщика базы данных)
- картографы
Refer: woohoo. не добавил elevate.org/ не добавил elevate-3/ в…
Конфигурация mapper.xml
- вставка — оператор вставки карты
- update – заявление об обновлении карты
- удалить - оператор удаления карты
- select — оператор запроса карты
- resultMap — самый сложный и мощный элемент, описывающий, как загружать объекты из набора результатов базы данных.
- sql — блок многократно используемых операторов, на который могут ссылаться другие операторы.
- cache — конфигурация кеша для данного пространства имен.
- cache-ref — ссылка на другие конфигурации кэша пространства имен.
Refer: woohoo. не добавил elevate.org/ не добавил elevate-3/ в…
Создайте SqlSessionFactory, используя шаблон singleton
/**
* 主配置文件路径
*/
private static String config = "mybatis-config.xml";
private static SqlSessionFactory sqlSessionFactory;
/**
* 使用单例模式获取SqlSessionFactory
* @return
*/
private static synchronized SqlSessionFactory getSqlSessionFactory() {
if (sqlSessionFactory == null) {
try {
// 创建输入流读取配置文件
InputStream is = Resources.getResourceAsStream(config);
// 创建SQLSession工厂
sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
return sqlSessionFactory;
}
Maven
Using JUnit
Добавьте следующий плагин вpom.xml
середина:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>3.0.0-M3</version>
</plugin>
Выполнение модульных тестов:mvn test
Refer: maven.apache.org/surefire/ma…
Skipping Tests
mvn install -DskipTests
Refer: maven.apache.org/surefire/ma…
JSP девять встроенных объектов + четыре доменных объекта
Refer: no.OSCHINA.net/U/3805464/no…
Восемь основных типов Java
byte/8
char/16
short/16
int/32
float/32
long/64
double/64
boolean/~
Day 03
Динамический SQL
официальная документация
- if
- choose (when, otherwise)
- trim (where, set)
- foreach
- bind
woohoo. не добавил elevate.org/ не добавил elevate-3/ в…
if
Перепишите UserMapper.xml:
<select id="listByUsername" resultMap="userResultMap">
select id, username, password
from user
where username like #{username}
<!-- 分页 -->
<if test="start != null and count != null">
limit #{start}, #{count}
</if>
</select>
Перепишите модульный тест testListByUsername(Используйте карту для передачи параметров):
Map<String, Object> params = new HashMap<String, Object>();
params.put("username", "%user%");
List<User> users = session.selectList("com.ncucoder.mapper.UserMapper.listByUsername", params);
Результаты:
==> Preparing: select id, username, password from user where username like ?
==> Parameters: %user%(String)
Добавьте модульный тест testListByUsernameUsingLimit:
Map<String, Object> params = new HashMap<String, Object>();
params.put("username", "%user%");
params.put("start", 0);
params.put("count", 2);
List<User> users = session.selectList("com.ncucoder.mapper.UserMapper.listByUsername", params);
Результаты:
==> Preparing: select id, username, password from user where username like ? limit ?, ?
==> Parameters: %user%(String), 0(Integer), 2(Integer)
связать нечеткий запрос
ИсправлятьUserMapper.xml
:
<!-- 根据username模糊查询 -->
<select id="listByUsername" resultMap="userResultMap">
<bind name="username" value="'%' + _parameter.get('username') + '%'"/>
select id, username, password
from user
where username like #{username}
<if test="start != null and count != null">
limit #{start}, #{count}
</if>
</select>
Измените модульный тест testListByUsername():
Map<String, Object> params = new HashMap<String, Object>();
// params.put("username", "%user%");
params.put("username", "user");
List<User> users = session.selectList("com.ncucoder.mapper.UserMapper.listByUsername", params);
Результаты:
==> Preparing: select id, username, password from user where username like ?
==> Parameters: %user%(String)
SQL-оптимизация в
Запросить записи с идентификатором менее 5 в пользовательской таблице.
использоватьin
План выполнения запроса (QEP):
mysql> explain select id, username, password from user where id in (1, 2, 3, 4, 5);
+----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+-------------+
| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
+----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+-------------+
| 1 | SIMPLE | user | NULL | ALL | PRIMARY | NULL | NULL | NULL | 10 | 50.00 | Using where |
+----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+-------------+
1 row in set, 1 warning (0.00 sec)
использовать<
QEP:
mysql> explain select id, username, password from user where id < 6;
+----+-------------+-------+------------+-------+---------------+---------+---------+------+------+----------+-------------+
| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
+----+-------------+-------+------------+-------+---------------+---------+---------+------+------+----------+-------------+
| 1 | SIMPLE | user | NULL | range | PRIMARY | PRIMARY | 4 | NULL | 5 | 100.00 | Using where |
+----+-------------+-------+------------+-------+---------------+---------+---------+------+------+----------+-------------+
1 row in set, 1 warning (0.00 sec)
использоватьbetween
QEP:
mysql> explain select id, username, password from user where id between 1 and 5;
+----+-------------+-------+------------+-------+---------------+---------+---------+------+------+----------+-------------+
| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
+----+-------------+-------+------------+-------+---------------+---------+---------+------+------+----------+-------------+
| 1 | SIMPLE | user | NULL | range | PRIMARY | PRIMARY | 4 | NULL | 5 | 100.00 | Using where |
+----+-------------+-------+------------+-------+---------------+---------+---------+------+------+----------+-------------+
1 row in set, 1 warning (0.00 sec)
-
type
Указывает метод доступа, используемый для таблицы (от лучшего к худшему: NULL > system > const > eq_ref > ref > range > index > All) -
key
выражатьMySQL Query Optimizer
отpossible_keys
индекс, выбранный для использования в -
rows
выражатьMySQL Query Optimizer
Количество записей результирующего набора, оцениваемое по статистической информации, собранной системой, просто понимается как количество записей, которые должны быть просмотрены запросом.
Анализ: использованиеin
Полное сканирование таблицы (ALL) выполняется без использования индекса в качестве условия запроса,
использовать<
а такжеbetween
Индекс первичного ключа и сканирование диапазона индекса используются в качестве условий запроса, поэтому они сравниваются.in
Эффективность исполнения самая низкая
Тестовые данные пакетной вставки MySQL
-- 获取指定长度的随机字符串
drop function if exists `rand_string`;
create function `rand_string`(n int) returns varchar(255) charset 'utf8'
begin
DECLARE chars_str varchar(100) DEFAULT 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';
DECLARE return_str varchar(255) DEFAULT '';
DECLARE i INT DEFAULT 0;
WHILE i < n DO
SET return_str = concat(return_str, substring(chars_str, FLOOR(1 + RAND() * 62), 1));
SET i = i + 1;
END WHILE;
RETURN return_str;
end;
-- 插入指定数量的用户
drop procedure if exists `create_users`;
create procedure `create_users`(n int)
begin
declare i int default 0;
while (i < n) do
insert into user(username, password)
values (rand_string(10), rand_string(32));
set i = i + 1;
end while;
end;
-- 调用存储过程
call create_users(1000);
Day 04
MyBatis Generator
официальная документация
Уууу. Не поставил boost.org/generator/ из…
проблема:
- При использовании вместо этого MySQL8 возникает ошибка, когда имя таблицы совпадает с именем другой базы данных (библиотеки mysql).
Добавляйте зависимости и плагины
mybatis-generator-core:
<dependency>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-core</artifactId>
<version>${mybatis-generator.version}</version>
</dependency>
mybatis-generator-maven-plugin:
<plugin>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-maven-plugin</artifactId>
<version>${mybatis-generator.version}</version>
<configuration>
<overwrite>true</overwrite>
<verbose>true</verbose>
</configuration>
</plugin>
Добавить файл конфигурации
Создайте соответствующие файлы сопоставления, классы сущностей и классы интерфейса
cd ${your_project}
mvn mybatis-generator:generator
Refer:
Интеграция SpringMVC
добавить зависимости
<!-- Spring相关依赖 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>${spring.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>${mybatis-spring.version}</version>
</dependency>
<!-- Druid连接池 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>${druid.version}</version>
</dependency>
Исправлятьweb.xml
конфигурационный файл
<!--1.创建dispatcher -->
<servlet>
<servlet-name>soms-dispatcher</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring/spring-*.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
<!-- 支持异步 -->
<async-supported>true</async-supported>
</servlet>
<servlet-mapping>
<servlet-name>soms-dispatcher</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
<!--中文乱码 -->
<filter>
<filter-name>encodingFilter</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>
<init-param>
<param-name>forceEncoding</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>encodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
Добавить файл конфигурации Spring
Использование MySQL8
Измените версию зависимости (pom.xml):
<mysql-connector-java.version>8.0.16</mysql-connector-java.version>
Измените путь к драйверу (db.properties):
driver=com.mysql.cj.jdbc.Driver