Система управления заказами в супермаркетах

Spring

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)

использоватьbetweenQEP:

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

Day 05

JWT + SpringSecurity

GitHub.com/orohplay/audience-…