О сортировке операторов SQL в Mybatis

задняя часть база данных MyBatis SQL

С развитием бизнеса все больше и больше прикладных систем разбиваются из большой системы на множество небольших систем, и обмен данными между каждой системой происходит через определенный протокол связи. Таким образом, некоторым небольшим прикладным системам не нужно самостоятельно выполнять операции с базой данных, а нужно только сделать несколько вызовов RPC или кэшировать, чтобы получить данные для отображения. Это случай с проектом, в котором я участвовал раньше, и я не написал ни одной строки SQL в течение почти 7 месяцев.

Большинство данных проекта, в котором я недавно участвовал, основаны на базе данных для взаимодействия с данными, поэтому неизбежно написание большого количества SQL, поэтому в этой статье приведены некоторые основные методы написания SQL для будущего использования.

построить таблицу

CREATE TABLE IF NOT EXISTS `user_test` (
  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '自增长id',
  `user_name` varchar(128) NOT NULL COMMENT '用户名',
   PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='用户表';

Запрос

  • Простой запрос
<select id="queryUserByName" resultMap="userMap" parameterType="java.lang.String">
	SELECT * FROM user_test WHERE user_name = #{userName}
 </select>

Следует отметить, что если parametertype здесь не указан, обработка будет распознаваться по умолчанию; если указан тип, входящее значение должно соответствовать текущему указанному типу, в противном случае произойдет исключение преобразования типа данных.

  • Простой запрос на разбивку на страницы
<select id="queryUsersList" resultMap="userMap">
    SELECT * FROM user_test WHERE 1=1 
        <if test="keyword != null and keyword != ''" >
            AND user_name LIKE concat('%',#{keyword},'%')
        </if>
    LIMIT #{currentPage},#{pageSize}
</select>
  • left join

Таблица app_info и таблица app_verion хранят информацию о приложении и информацию о версии приложения соответственно. Теперь нам нужно узнать конкретную информацию о приложении на основе appId и versionId [включая информационную информацию и информацию о версии]

<select id="getAppDetail" resultMap="appDeatilMap">
    	select  m.id id,
		m.app_name appName,
		n.version version,
		from app_info m
		LEFT JOIN app_version n ON m.id = n.app_id 
		where m.id = #{appId} and n.id = #{versionId}
    </select>
  • Условие запроса - список
<select id="queryAppByAppNames" resultMap="AppMap" parameterType="java.util.List">
	select 
		a.app_name appName,
		b.version version
	from starter_info a,starter_version b 
	where 
		a.id = b.app_id 
		and a.id in 
		(
        		select id from app_info where app_name in 
        		<foreach collection="list" item="item" index="index" open="(" close=")" separator=",">
        			#{item}
        		</foreach>
		)
</select>

возобновить

  • простое обновление
<update id="updateApp" parameterType="java.util.List">
    UPDATE app_info
        SET 
            app_name = #{appName}
        WHERE 
            app_id = #{appId}
</update>
  • Массовое обновление

Существует такое требование, измените app_name приложения, идентификатор которого составляет 1, 2, 3 в таблице app_info на appname1, appname2, appname3;

Это делается с помощью синтаксических конструкций вроде case ..when ..then:

case — это текущее состояние, когда представляет значение условия, а затем следует значение текущего поля обновления;

Следующее описание: когда текущий id=#{item.appId}, app_name=#{item.appName}

<update id="updateApps" parameterType="java.util.List">
	UPDATE app_info set app_name =
	<foreach collection="applList" item="item" index="index" separator=" " open="case ID" close="end">
		when #{item.appId,jdbcType=INTEGER} then #{item.appName,jdbcType=INTEGER}
	</foreach>
	
	where id in
	<foreach collection="appList" index="index" item="item" separator="," open="(" close=")">
		#{item.appId,jdbcType=INTEGER}
	</foreach>
</update>

Хорошо, теперь для этого нужно:

В соответствии с различными типами приложений обновляйте различные конфигурации операционной среды;

{
    [
        {
            "appType":"applet",
            "cpu":5,
            "memory":4,
            "card":3,
            "nums":2,
            "network":1,
            "isInUse":1
        },
        {
            "appType":"bs",
            "cpu":5,
            "memory":4,
            "card":3,
            "nums":2,
            "network":1,
            "isInUse":1

        },
        {
            "appType":"cs",
            "cpu":5,
            "memory":4,
            "card":3,
            "nums":2,
            "network":1,
            "isInUse":1
        },
        //有几个放几个
    ]
}

Отделка свойства Описание

  • 1.Prefix, суффикс означает добавление содержимого до или после того, как часть, завернутая тегом Trim
  • 2. Если одновременно присутствуют prefixOverrides и suffixOverrides, это означает, что содержимое в Overrides будет перезаписано префиксом и суффиксом.
  • 3. Если есть только prefixOverrides, suffixOverrides означает удаление контента, указанного xxxOverides в начале или конце.
<update id="updateBatchApp" parameterType="java.util.List">
	UPDATE app_info
	<trim prefix="set" suffixOverrides=",">
		<trim prefix="cpu = case" suffix="end,">
			<foreach collection="modelList" item="item" index="index">
				<if test="item != null">
					when app_type =#{item.appType} then #{item.cpu}
				</if>
			</foreach>
		</trim>
		<trim prefix="memory = case" suffix="end,">
			<foreach collection="modelList" item="item" index="index">
				<if test="item != null">
					when app_type =#{item.appType} then #{item.memory}
				</if>
			</foreach>
		</trim>
		<trim prefix="card = case" suffix="end,">
			<foreach collection="modelList" item="item" index="index">
				when app_type =#{item.appType} then #{item.card}
			</foreach>
		</trim>
		<trim prefix="nums = case" suffix="end,">
			<foreach collection="modelList" item="item" index="index">
				when app_type =#{item.appType} then #{item.nums}
			</foreach>
		</trim>
		<trim prefix="network = case" suffix="end,">
			<foreach collection="modelList" item="item" index="index">
				when app_type =#{item.appType} then #{item.network}
			</foreach>
		</trim>
		<trim prefix="is_in_use = case" suffix="end,">
			<foreach collection="modelList" item="item" index="index">
				when app_type =#{item.appType} then #{item.isInUse}
			</foreach>
		</trim>
	</trim>
	where app_id = #{appId}
</update>

Я не проводил исследований по проблемам производительности. Раньше я читал анализ производительности различных методов написания операторов обновления. Если вам интересно, вы можете прочитать его:Сравнение эффективности двух методов пакетного обновления данных

Удалить

  • простое удаление
DELETE FROM app_info where id = #{id}
  • пакетное удаление
<delete id="deleteApps" parameterType="java.util.List">
	DELETE FROM app_info where  app_id in 
    	<foreach item="item" collection="appIds" open="(" separator="," close=")">
            #{item}
        </foreach>
</delete>

порядок строки времени по

Не знаю, сталкивались ли вы с этим раньше.Предыдущие старшие хранили время в БД в виде строки вместо ДАТЫ.Потом в один прекрасный день ваш старший ушел,а ваш супервайзер сказал узнать и отсортировать по времени... ...;ха-ха ладно! ! !

<select id="querySysParamList" resultMap="sysParamDO">
    SELECT * FROM app_info WHERE 1=1
        <if test="keyword != null and keyword != ''" >
            AND app_name LIKE concat('%',#{keyword},'%')
        </if>
    ORDER BY DATE_FORMAT(update_time,'%H %k %I %r %T %S %w') DESC
</select>

Строковый формат даты SELECT DATE_FORMAT ('2011-09-20 08:30:45', '%Y-%m-%d%H:%i:%S');

Преобразование даты в строковый формат SELECT DATE_FORMAT(NOW(), '%Y-%m-%d %H:%i:%S');

Прикрепил:

%M 月名字(January……December) 
%W 星期名字(Sunday……Saturday) 
%D 有英语前缀的月份的日期(1st, 2nd, 3rd, 等等。) 
%Y 年, 数字, 4 位 
%y 年, 数字, 2 位 
%a 缩写的星期名字(Sun……Sat) 
%d 月份中的天数, 数字(00……31) 
%e 月份中的天数, 数字(0……31) 
%m 月, 数字(01……12) 
%c 月, 数字(1……12) 
%b 缩写的月份名字(Jan……Dec) 
%j 一年中的天数(001……366) 
%H 小时(00……23) 
%k 小时(0……23) 
%h 小时(01……12) 
%I 小时(01……12) 
%l 小时(1……12) 
%i 分钟, 数字(00……59)                                        
%r 时间,12 小时(hh:mm:ss [AP]M) 
%T 时间,24 小时(hh:mm:ss) 
%S 秒(00……59) 
%s 秒(00……59) 
%p AM或PM 
%w 一个星期中的天数(0=Sunday ……6=Saturday ) 
%U 星期(0……52), 这里星期天是星期的第一天 
%u 星期(0……52), 这里星期一是星期的第一天 
%% 一个文字“%”。

Сначала запишите их, а потом восполняйте ямки!

Ссылка: http://www.runoob.com/sql/sql-tutorial.html.