mybaits 笔记2022年8月学习笔记
mybatis整理
前期准备
安装必要依赖:
idea开发mybatis,如果学习测试,可以在一个直接建一个空白项目,如果是用spring boot,则建议用用boot的安装捆绑方式
核 心依赖 org.mybatis的mybatis 用于测试的junit ,用于连接驱动的mysql
<dependencies>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.7</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.3</version>
</dependency>
</dependencies>
配置jdbc数据库连接,新建jdbc.properties
jdbc.driver=com.mysql.jdbc.Driverjdbc.url=jdbc:mysql://localhost:3306/world?useUnicode=truejdbc.username=rootjdbc.password=14257
配置核心文件,mybaties.config.xml
<?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>
<!--引入properties文件,此后就可以在当前文件中使用${key}的方式访问value-->
<properties resource="jdbc.properties"/>
<environments default="development">
<environment id="development">
<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>
</environments>
<!--引入映射文件-->
<mappers>
<mapper resource="mappers/UserMapper.xml"/>
</mappers>
</configuration>
编写mapper.xml 文件,mapper如同dao ,dao层为接口和实现,而mapper是mybatis控制生成,只需接口就可以了, 不需要创建实现类,建mapper之 前,需要先有数据库
创建一个数据库表:
创建pojo - > User 类(根据数据库表的字段定义)设置好get set 空参,全参,tostring
创建mapper mapper文件如果dao ,位于同pojo一个文件层级,子文件放详细的具体每个pojo的mapper定义,
创建mapper - > UserMapper:
package org.example.mybatis.mapper;
public interface UserMapper {
}
编写用于外理sql 语句的mapper.xml 文件应于resources -> mapper->UserMapper.xml,
<?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.example.demo.mapper.UserMapper">
<insert id = "insertUser">
insert into t_user values (null, 'root', '142869',52, '女', '123445@qq.com') </insert>
</mapper>
最后做一步测试,因为我这儿没有集成web 只能用text测试。新建一个测试文件,编写以下内容‘
package com.example.demo;
import com.example.demo.mapper.UserMapper;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.jupiter.api.Test;
import javax.annotation.Resource;
import java.io.IOException;import java.io.InputStream;
public class text {
@Test
public void textmybatis() throws IOException{
InputStream is = Resources.getResourceAsStream("mybaties-config.xml");
SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(is);
SqlSession sqlSession = sqlSessionFactory.openSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
int result = mapper.insertUser();
System.out.println(result);
}}
测试成功后返回插入的影响行业:
08:00:30.517 [main] DEBUG org.apache.ibatis.transaction.jdbc.JdbcTransaction - Setting autocommit to false on JDBC Connection [com.mysql.jdbc.JDBC4Connection@1ba9117e] 08:00:30.522 [main] DEBUG com.example.demo.mapper.UserMapper.insertUser - > Preparing: insert into t_user values (null, 'root', '142869',52, '女', '123445@qq.com') 08:00:30.547 [main] DEBUG com.example.demo.mapper.UserMapper.insertUser - ==> Parameters: 08:00:30.554 [main] DEBUG com.example.demo.mapper.UserMapper.insertUser - < Updates: 1 1
为了日志系统更好看,log4的日志配置文件是固定的 log4j.xml
<typeAliases>设置别名
<typeAlias type="com.example.demo.pojo.User" alias="User"></typeAlias>
设置类的别名:
当我们准备要设置类的别名时,mybatis 帮我们提供二个方法。
1) 通过type指定 ,然后设置别名,<typeAlias type="com.example.demo.pojo.User" alias="User"></typeAlias>
也可以省略到别名指定,以pojo 类名为别名。
2)通过包指定 <package name = "com.atguigu,mybatis.pojo">
设置mapper路径
设置mapper路径时,也有二个方法,
1)通过 resource 指定: <mapper> <mapper resource="mapper/UserMapper.xml"/>-->
2) 通过包指定 <package name="com.example.demo.mapper"/>
备注信息:如果mybaties-config.xml 配置需要用package 来指定mapper,需要满足二个条件,一是mapper文件路径名称要和定义sql接口的mapper一样,二是文件名也要一样。
mybatis处理参数(共5种方式)
1)传单值;主要用于处理一个参数
<!-- User getUserByUsername(String username);-->
<select id="getUserByUsername" resultType="User">
select * from t_user where username = #{username}
</select>
2)按健值传,由mabits封装到map中,按参数顺序。用于多参数传递
<select id="checkLogin" resultType="com.example.demo.pojo.User">
select * from t_user where username = #{param1} and password = #{param2}
</select>
3)直接传map 用map 接收
<!-- User checkLoginByMap(Map<String, Object> map );-->
<select id="checkLoginByMap" resultType="com.example.demo.pojo.User">
select * from t_user where username = #{username} and password = #{password} </select>
测试中手动做测试。
public void testGetBymap(){
SqlSession sqlSession = SqlSessionUtils.getSqlSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
Map<String,Object> map = new HashMap<>();
map.put("username","张三");
map.put("password","32568");
System.out.println(map);
User user = mapper.checkLoginByMap(map);
System.out.println(user);
}
4)按对象传,核心用法,测试传参方式为一个对象:
<!-- int insertUser(User user);-->
<insert id="inserUser">
insert into t_user values (null,#{username},#{password},#{age},#{sex},#{email}) </insert>
第5种命名参数
User checkLoginByParam(@Param("username") String username, @Param("password") String password);
各种查询示例:
1、查询一个实体类对象,如果返回数值对象等常规只接设置相应类型 就可以,可以取值有int flash map
如果是返回map ,且又想支持多数据,
方法一用list
List<Map<String,Object> map> getAllUserToMap();
方法二 @Maokey("id")
模湖查询常见三方式:
1)select * from t_user where username like '%${username}%')
2)select * from t_user where username like cancat(‘%’,#{username},‘%’)
3)select * from t_user where username like "%" #{uername}"%"
批量删除
delete from t_user where id in(${ids})
动态设置表名,获取表不能加单引号,正好使用是要手工加单引号,所以{}比较合适
select * from ${tablename}
获取自增主健的值
<insert id ="inserUser" useGaneratedjets = "true" keyProperty = "id">
insert into t_user value (null ,#{username},#{password})
.关于映射表,表和java属性不致的映射解方案,
如果表和属性不一样,sql查询后无法映射会有些字段没有值 ,下面的查询结果empName 在数据库中为emp_name, 所以结果无法映射,值就为空了,
Emp{eid=1, empName='null', age=18, sex='男', email='null'},
解决方式有三种,查询中设置别名,mybatis-config.xml中设置settings配置属性
1)通过设置别名来解决字段名不一样,查询sql 时 select eid, emp_name empName,age,sex,email from t_emp
2) mybatis 中配置 <setting name="mapUnderscoreToCamelCase" value="true"/>
3)mybatis配置自定义resultMap
<resultMap id="empResultMap" type = "Emp">
<id property = "eid" columu ="eid"></id>
<result properrty = "empNmae couumn = "emp_name">
<result property = "age" column = "age".......
</resultMap>
表关系映射: 表关系映射分为多映射一,和一映射多二种情况,多对一映射也有三种方式。方式一
先定义一个自定义的map
<resultMap id="empAndDeptResultMapOne" type="Emp">
然后在查询语名中引用类型
<select id="getEmpAndDept" resultMap="empAndDeptResultMapOne">
select * from t_emp left join t_dept on t_emp.did = t_dept .did where t_emp.eid = #{eid}
</select>
然后返回头细化resultMap定义
<resultMap id="empAndDeptResultMapOne" type="Emp">
<id property="eid" column="eid"></id>
<result property="empName" column="emp_name"></result>
<result property="age" column="age"></result>
<result property="sex" column="sex"></result>
<result property="email" column="email"></result>
<result property="dept.did" column="did"></result>
<result property="dept.deptName" column="dept_name"></result>
</resultMap>
编写测试用例:
@Test
public void getEmpAndDept(){
SqlSession sqlSession = sqlSeUtil.getSqlSession();
EmpMapper mapper = sqlSession.getMapper(EmpMapper.class);
// 通过级联查询另一张表
Emp emp = mapper.getEmpAndDept(1);
System.out.println(emp);
}
查询结果为:
Emp{eid=1, empName='张三', age=18, sex='男', email='123@qq.com', dept=Dept{did=3, deptName='办公室'}}
表关系映射: 表关系映射分为多映射一,和一映射多二种情况,多对一映射也有三种方式,方式二使用association属性.
<resultMap id="empAndDeptResultMapTwo" type="Emp">
<id property="eid" column="eid"></id>
<result property="empName" column="emp_name"></result>
<result property="age" column="age"></result>
<result property="sex" column="sex"></result>
<result property="email" column="email"></result>
<!-- 方式二使用的是association-->
<association property="dept" column="Dept">
<id property="did" column="did"></id>
<result property="deptName" column="dept_name"></result>
</association>
SQL 查询语法不变,此处略
表关系映射: 第三种方式分步查询,仍然使用association属性,增加另一条sql 语句的指向引用,其中column参数为另一条sql的查询条件
第一步,result 定义map 的时候指向一条sql
<association property="dept"
select="org.example.mybatis.mapper.DeptMapper.getEmpAndDeptByStepTwo" column="did">
</association>
第二步,在另一个mapper 再定义一条查询
<select id="getEmpAndDeptByStepTwo" resultType="Dept">
select * from t_dept where did = #{did}
</select>
,
mybaits 笔记2022年8月学习笔记的更多相关文章
- Opencv学习笔记(六)SURF学习笔记
原创文章,转载请注明出处:http://blog.csdn.net/crzy_sparrow/article/details/7392345 本人挺菜的,肯定有非常多错误纰漏之处 ,希望大家不吝指正. ...
- [ExtJS5学习笔记]第二节 Sencha Cmd 学习笔记 使你的sencha cmd跑起来
本文地址: http://blog.csdn.net/sushengmiyan/article/details/38313537 本文作者:sushengmiyan ----------------- ...
- 神经网络系列学习笔记(四)——神经网络之RNN学习笔记
不同于传统的FNNs(Feed-forward Neural Networks,前向反馈神经网络),RNNs引入了定向循环,能够处理那些输入之间前后关联的问题. RNNs的目的是用来处理序列数据. 具 ...
- 神经网络系列学习笔记(二)——神经网络之DNN学习笔记
一.单层感知机(perceptron) 拥有输入层.输出层和一个隐含层.输入的特征向量通过隐含层变换到达输出层,在输出层得到分类结果: 缺点:无法模拟稍复杂一些的函数(例如简单的异或计算). 解决办法 ...
- [ExtJS5学习笔记]第三节 sencha cmd学习笔记 生成应用程序构建的内部细节
本文地址: http://blog.csdn.net/sushengmiyan/article/details/38316829本文作者:sushengmiyan------------------- ...
- 【实验室笔记】C#上位机学习笔记
用C#编写上位机,基本流程是[1]串口配置,[2]串口发送数据,[3]串口接收数据. [1]串口配置 串口的属性配置包括: No.1串口端口号 No.2串口波特率 No.3串口数据位 No.4串口停止 ...
- [EXtJS5学习笔记]第一节 Sencha Cmd 学习笔记 简介 Sencha Cmd是什么
本文地址: http://blog.csdn.net/sushengmiyan/article/details/38295575 本文作者:sushengmiyan ----------------- ...
- 【学习笔记】Python基础教程学习笔记
教程视频网盘共享:http://pan.baidu.com/s/1hrTrR5E 03-python基础.if判断 print 输出数据 print("hahahah")----- ...
- 【Python学习笔记】Coursera之PY4E学习笔记——File
1.打开文件 使用handle=open(filename,mode)打开文件.这一函数将会返回一个handle(应该翻译为“柄”吧)用来操控文件,参数filename是一个字符串.参数mode是可选 ...
- 【Python学习笔记】Coursera之PY4E学习笔记——String
1.字符串合并 用“+”来进行字符串的合并,注意空格是要自己加的. 例: >>> a='Hello' >>> b= a+ 'There' >>> ...
随机推荐
- TienChin 渠道管理-权限分配
添加权限 如果您不想手动添加可以使用我如下的SQL,但是有一个注意点就是 parent_id 是渠道管理菜单的主键 id 即可一键插入. INSERT INTO `TienChin`.`sys_men ...
- spark读取空orc文件时报错java.lang.RuntimeException: serious problem at OrcInputFormat.generateSplitsInfo
问题复现: G:\bigdata\spark-2.3.3-bin-hadoop2.7\bin>spark-shell 2020-12-26 10:20:48 WARN NativeCodeLoa ...
- Properties集合的使用
Properties集合是唯一一个可以和IO流相结合的集合 可以将集合中的数据持久化存储,也可以将硬盘上的数据加载到该集合中. 1 Properties集合添加.遍历 1 private static ...
- Azure Data Factory(十二)传参调用 Azure Function
一,引言 在实际的项目中,Azure Data Factroy 中的 Data Flow 并不能彻底帮我们完成一系列复制逻辑计算, 比如我们需要针对数据集的每一行数据进行判断计算,Data Flow ...
- <semaphore.h> 和 <sys/sem.h> 的区别
<sys/sem.h>为 XSI(最初是 Unix System V)信号量提供接口. 这些不是基本 POSIX 标准的一部分(它们在 XSI 选项中,主要是为了传统的 Unix 兼容性) ...
- .NET 云原生架构师训练营(模块二 基础巩固 EF Core 关系)--学习笔记
2.4.4 EF Core -- 关系 一对多 一对一 多对多 示例 关系:https://docs.microsoft.com/zh-cn/ef/core/modeling/relationship ...
- [数据库] 数据库中的DDL、DML、DQL、DCL
SQL 程序语言有四种类型,对数据库的基本操作都属于这四种类,也就是标题上显示的 DDL.DML.DQL.DCL. 1. DDL DDL(Data Definition Language 数据定义语言 ...
- angularjs国际化多语言,angular-translate教程详解,$translate.instant()为什么不生效
壹 ❀ 引 最近项目要求支持国际化多语言,由于项目用的还是angularjs,那么首当其冲的选择了angularjs封装的I18N插件angular-translate,本文主要会从三个方向展开讨论, ...
- NC13230 合并回文子串
题目链接 题目 题目描述 输入两个字符串A和B,合并成一个串C,属于A和B的字符在C中顺序保持不变.如"abc"和"xyz"可以被组合成"axbycz ...
- python 中异常类型总结
异常类型: 异常名称 描述BaseException 所有异常的基类SystemExit 解释器请求退出KeyboardInterrupt ...