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月学习笔记的更多相关文章

  1. Opencv学习笔记(六)SURF学习笔记

    原创文章,转载请注明出处:http://blog.csdn.net/crzy_sparrow/article/details/7392345 本人挺菜的,肯定有非常多错误纰漏之处 ,希望大家不吝指正. ...

  2. [ExtJS5学习笔记]第二节 Sencha Cmd 学习笔记 使你的sencha cmd跑起来

    本文地址: http://blog.csdn.net/sushengmiyan/article/details/38313537 本文作者:sushengmiyan ----------------- ...

  3. 神经网络系列学习笔记(四)——神经网络之RNN学习笔记

    不同于传统的FNNs(Feed-forward Neural Networks,前向反馈神经网络),RNNs引入了定向循环,能够处理那些输入之间前后关联的问题. RNNs的目的是用来处理序列数据. 具 ...

  4. 神经网络系列学习笔记(二)——神经网络之DNN学习笔记

    一.单层感知机(perceptron) 拥有输入层.输出层和一个隐含层.输入的特征向量通过隐含层变换到达输出层,在输出层得到分类结果: 缺点:无法模拟稍复杂一些的函数(例如简单的异或计算). 解决办法 ...

  5. [ExtJS5学习笔记]第三节 sencha cmd学习笔记 生成应用程序构建的内部细节

    本文地址: http://blog.csdn.net/sushengmiyan/article/details/38316829本文作者:sushengmiyan------------------- ...

  6. 【实验室笔记】C#上位机学习笔记

    用C#编写上位机,基本流程是[1]串口配置,[2]串口发送数据,[3]串口接收数据. [1]串口配置 串口的属性配置包括: No.1串口端口号 No.2串口波特率 No.3串口数据位 No.4串口停止 ...

  7. [EXtJS5学习笔记]第一节 Sencha Cmd 学习笔记 简介 Sencha Cmd是什么

    本文地址: http://blog.csdn.net/sushengmiyan/article/details/38295575 本文作者:sushengmiyan ----------------- ...

  8. 【学习笔记】Python基础教程学习笔记

    教程视频网盘共享:http://pan.baidu.com/s/1hrTrR5E 03-python基础.if判断 print 输出数据 print("hahahah")----- ...

  9. 【Python学习笔记】Coursera之PY4E学习笔记——File

    1.打开文件 使用handle=open(filename,mode)打开文件.这一函数将会返回一个handle(应该翻译为“柄”吧)用来操控文件,参数filename是一个字符串.参数mode是可选 ...

  10. 【Python学习笔记】Coursera之PY4E学习笔记——String

    1.字符串合并 用“+”来进行字符串的合并,注意空格是要自己加的. 例: >>> a='Hello' >>> b= a+ 'There' >>> ...

随机推荐

  1. TienChin-系统功能介绍

    线索管理 添加线索 查看线索 删除线索 修改线索 分配线索: ​将录入到系统的线索,分配给某一个市场专员去处理 跟进线索: ​持续跟进一条线索 1.判断是否伪线索 2.持续跟进,每次跟进需要有记录 3 ...

  2. go中context源码解读

    context 前言 什么是context 为什么需要context呢 context底层设计 context的实现 几种context emptyCtx cancelCtx timerCtx val ...

  3. silce的扩容,截取,使用规范总结

    切片 什么是slice slice的创建使用 slice使用的一点规范 slice和数组的区别 slice的append是如何发生的 复制Slice和Map注意事项 接收 Slice 和 Map 作为 ...

  4. TextBrewer:融合并改进了NLP和CV中的多种知识蒸馏技术、提供便捷快速的知识蒸馏框架、提升模型的推理速度,减少内存占用

    TextBrewer:融合并改进了NLP和CV中的多种知识蒸馏技术.提供便捷快速的知识蒸馏框架.提升模型的推理速度,减少内存占用 TextBrewer是一个基于PyTorch的.为实现NLP中的知识蒸 ...

  5. 机器学习算法(四): 基于支持向量机的分类预测(SVM)

    机器学习算法(四): 基于支持向量机的分类预测 本项目链接:https://www.heywhale.com/home/column/64141d6b1c8c8b518ba97dcc 1.相关流程 支 ...

  6. SpringBoot 整合多数据源的事务问题

    代码 先贴代码: 核心就是:Spring给我们提供的一个类 AbstractRoutingDataSource,然后我们再写一个切面来切换数据源,肯定要有一个地方存储key还要保证上下文都可用,所以我 ...

  7. (python)代码学习||2024.2.3||题目是codewars上的【Validate Sudoku with size `NxN`】

    题目的要求是写一个Sudoku类,类中要有一个实例函数判断传给对象的二维数组是否符合数独规则 题目链接:https://www.codewars.com/kata/540afbe2dc9f615d5e ...

  8. .NET 云原生架构师训练营(模块二 基础巩固 HTTP管道与中间件)--学习笔记

    2.3.2 Web API -- HTTP管道与中间件 管道 中间件 ASP.NET Core 中间件:https://docs.microsoft.com/zh-cn/aspnet/core/fun ...

  9. NC14701 取数游戏2

    题目链接 题目 题目描述 给定两个长度为n的整数列A和B,每次你可以从A数列的左端或右端取走一个数.假设第i次取走的数为ax,则第i次取走的数的价值vi=bi⋅ax,现在希望你求出∑vi的最大值. 输 ...

  10. 使用JS访问本地数据库

    1 前言 有时候,数据业务比较大,比如查询百万级的数据,如果使用JSP查询数据库,JSP的返回结果一般放在域名后面返回给客户端,而返回结果的长度是有限制的,数据过长可能会丢失部分数据:另一方面数据量大 ...