MyBatis笔记

本文核心内容:1⃣️:MyBatis实现Sql复用、通用查询、高效修改、模糊查询、插入数据返回记录ID。2⃣️MyBatis的批量操作如批量删除、批量插入、批量更新。3⃣️:MyBatis执行DDL语言。


 

一:高效的、动态的SQL

1⃣️:共性SQL【Sql的复用】

 

 

2⃣️:通用查询

 

当where元素里面的条件成立时,才会加入where这个SQL关键字组装到SQL里,否则就不加入。

 

3⃣️:高效修改

 

细节:set元素遇到了逗号,它会把对应的逗号去掉。

 

4⃣️:模糊查询

想解决模糊查询

首先分清MyBatis中#{}与${}的差别。#{}是预编译处理,${}是字符串替换。

#{}采用站位符的方式绑定数据

${}采用字符拼接的方式绑定数据(这种不能防止SQL注入)

 

 

 

补充:bind元素【18年-6月-10日】

bind元素的作用是通过OGNL表达式去自定义一个上下文变量,这样更方便使用。有了bind元素,就不必使用数据库的语言【屏蔽数据库模糊查询的差异,如oracle和MySql】,而是使用MyBatis的动态SQL完成模糊查询。

MyBatis发送的sql语句:

Mapper源码

        <select id="selectByKeyWord" resultType="Users">
		<bind name="keyWord" value="'%'+ keyWord + '%'"/>
		select * from users where
		name like #{keyWord} or usersid like #{keyWord} or address like #{keyWord}
	</select>

同时bind元素还支持多参。即一个SQL语句中可以有多个bind元素。

 

5⃣️插入数据返回记录ID   【补充 2018年9月7日 14:34:00】

<!--增添新用户  并返回ID-->
	<insert id="addUser" parameterType="User" keyProperty="userId" useGeneratedKeys="true">
		insert into t_user (user_account,user_pwd,user_name,user_salt)
		values (#{userAccount},#{userPwd},#{userName},#{userSalt})
	</insert>
数据库的主键Id是自增的,另外需要设置的两个属性为:
---------------------
keyProperty="userID"         ->对应Java实体类的userID属性 
useGeneratedKeys="true"

---------------------
我们在插入数据之后,就可以得到插入数据之后的对象,然后通过该对象获取该对象的id。

 

 我们来写一个测试方法测试一下

	@Test
	public  void method()throws Exception{
		ApplicationContext ctx = new ClassPathXmlApplicationContext("classpath:/application-context.xml");
		UserDao userDao=(UserDao)ctx.getBean("userDao");
		User user = new User(null, "123456@qq.com", "123456", "Sugar", null);
		Integer number = userDao.addUser(user);
		if (number>0) {
			System.out.println(user.getUserId());
		}else {
			System.out.println("插入失败!!!");
		}
	}

 如果插入数据成功的话,则可以找到数据库中对应的key。

 

二:批量操作

 

6⃣️:批量删除

批量删除有两种方式:

1:这一种效率低下,但是实现简单。

for(String id:list){

    deleteById(id);

}

 

2:foreach遍历

 

 

7⃣️:批量插入基于长SQL       补充【18年7月8日   10:45】

Dao接口方法

Integer insertBatchMaster(@Param("masters") List<Master> masters);

Mapper源码

	<!--长Sql解决普通批量插入  1w条数据1秒,10w条数据跑不动-->
	<insert id="insertBatchMaster" >
		insert into master (master_Name,master_Summary) 
		<foreach collection="masters" item="master" open="values"
				 separator="," close=";">
			(#{master.masterName},#{master.masterSummary})
		</foreach>
	</insert>

测试方法【基于读取EasyPOI读取 Excel表格模拟批量数据,实际就两条】

@Test
	public void methodInput()throws Exception{
		ImportParams params = new ImportParams();
		params.setTitleRows(2);
		params.setHeadRows(1);
		List<Master> list= ExcelImportUtil.importExcel(new File("D:/test.xlsx"),
				Master.class,params);
		ApplicationContext ctx=new ClassPathXmlApplicationContext("appliation-context.xml");
		MasterService masterService=(MasterService)ctx.getBean("masterServiceImpl");
		Integer number=masterService.addBatchMaster(list);
		System.out.println(number);
	}

查看运行日志可以看出MyBatis发送的Sql语句。


8⃣️:批量更新

1:用for循环通过循环传过来的参数集合,循环出N条sql语句

<update id="updateBatch"  parameterType="java.util.List">  
    <foreach collection="list" item="item" index="index" open="" close="" separator=";">
        update table
        <set>
            column=${item.name}         
        </set>
        where id = ${item.id}
    </foreach>      
</update>

Mybatis映射文件中的sql语句默认是不支持以" ; " 结尾的,也就是不支持多条sql语句的执行。所以需要在连接mysql的url上加 &allowMultiQueries=true 这个才可以执行。

 

2:mysql数据库中CASE WHEN语句。

<update id="updateBatch" parameterType="java.util.List">
        update table
        <trim prefix="set" suffixOverrides=",">
            <trim prefix="column =case(" suffix="end),">
                <foreach collection="list" item="item">
                    <if test="item.name != null">
                        when id=#{item.id} then #{item.name}
                    </if>
                </foreach>
            </trim>
        </trim>
        <where>
            id in
            <foreach collection="list" separator=","  opent="(" close=")" item="item">
               #{item.id}
            </foreach>
        </where>
</update>

9⃣️:执行DDL语言  补充【20年1月12日   23:45】

DDL使用update即可

    <update id="alterTable">
       alter table ${tableName} allocate extent 
    </update>
 
    <update id="truncateTable">
        truncate table ${tableName}
    </update>
    
    <update id="createNewTableAndInsertData">
        create table ${newTableName} as select * from ${originalTableName}
    </update>

 

06-22
### 得物技术栈及开发者文档分析 得物作为一家专注于潮流商品的电商平台,其技术栈和开发者文档主要围绕电商平台的核心需求展开。以下是对得物技术栈及相关开发资源的详细解析: #### 1. 技术栈概述 得物的技术栈通常会涵盖前端、后端、移动应用开发以及大数据处理等多个领域。以下是可能涉及的主要技术栈[^3]: - **前端开发**: 前端技术栈可能包括现代框架如 React 或 Vue.js,用于构建高效、响应式的用户界面。此外,还会使用 Webpack 等工具进行模块化打包和优化。 - **后端开发**: 后端技术栈可能采用 Java Spring Boot 或 Node.js,以支持高并发和分布式架构。数据库方面,MySQL 和 Redis 是常见的选择,分别用于关系型数据存储和缓存管理。 - **移动应用开发**: 得物的移动应用开发可能基于原生技术(如 Swift/Kotlin)或跨平台框架(如 Flutter)。这有助于确保移动端应用的性能和用户体验一致性。 - **大数据云计算**: 在大数据处理方面,得物可能会使用 Hadoop 或 Spark 进行数据挖掘和分析。同时,依托云服务提供商(如阿里云或腾讯云),实现弹性扩展和资源优化。 #### 2. 开发者文档分析 类似于引用中提到的 Adobe 开发者文档模板[^2],得物也可能提供一套完整的开发者文档体系,以支持内部团队协作和外部开发者接入。以下是开发者文档可能包含的内容: - **API 文档**: 提供 RESTful API 或 GraphQL 的详细说明,帮助开发者快速集成得物的功能模块,例如商品搜索、订单管理等。 - **SDK 集成指南**: 针对不同平台(如 iOS、Android 或 Web)提供 SDK 下载和集成教程,简化第三方应用的开发流程。 - **技术博客**: 分享得物在技术实践中的经验成果,例如如何优化图片加载速度、提升应用性能等。 - **开源项目**: 得物可能将部分技术成果开源,供社区开发者学习和贡献。这不仅有助于提升品牌形象,还能吸引更多优秀人才加入。 #### 3. 示例代码 以下是一个简单的示例代码,展示如何通过 RESTful API 调用得物的商品搜索功能(假设接口已存在): ```python import requests def search_items(keyword, page=1): url = "https://api.dewu.com/v1/items/search" headers = { "Authorization": "Bearer YOUR_ACCESS_TOKEN", "Content-Type": "application/json" } params = { "keyword": keyword, "page": page, "size": 10 } response = requests.get(url, headers=headers, params=params) if response.status_code == 200: return response.json() else: return {"error": "Failed to fetch data"} # 调用示例 result = search_items("Air Jordan", page=1) print(result) ``` 此代码片段展示了如何通过 Python 请求得物的 API,并获取指定关键词的商品列表。 --- ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值