首页 > 其他分享 >mybaits 笔记2022年8月学习笔记

mybaits 笔记2022年8月学习笔记

时间:2023-01-04 20:58:04浏览次数:49  
标签:username mapper map 笔记 mybaits user 2022 mybatis org

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, '女', '[email protected]')         </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, '女', '[email protected]') 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='[email protected]', 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>

 

 

 

 

 

标签:username,mapper,map,笔记,mybaits,user,2022,mybatis,org
From: https://www.cnblogs.com/fgxwan/p/17025966.html

相关文章

  • 2018年笔记,突然看到2018年以前的一些笔记
    看到以前一些笔记,以前怕别人看到的笔记,居然写太认真就删了,苦了此心血,现在越工作了笔记反尔随心,现在自己的笔记除了自己能看懂,别人看到肯会乱自己要反省自己,  纯属回忆......
  • AN IMAGE IS WORTH 16X16 WORDS TRANSFORMERS FOR IMAGE RECOGNITION AT SCALE---阅读
    ANIMAGEISWORTH16X16WORDS:TRANSFORMERSFORIMAGERECOGNITIONATSCALE---阅读笔记摘要​虽然Transformer架构已成为NLP任务的事实标准,但它在CV中......
  • 10-11代码笔记
    1.日期格式FormatDateTime函数详解c以短时间格式显示时间,即全部是数字的表示FormatdateTime('c',now);输出为:2004-8-79:55:40d对应于时间中的日期,日期是一位则显......
  • Good Bye 2022: 2023 is NEAR 补C
    A.KoxiaandWhiteboards题意:给定两个长度为n的数组,进行m次交换,第i次选择a中的一个数与bi交换,计算交换后n个数的和最大值分析:堆维护最小值进行交换#incl......
  • [概率论与数理统计]笔记:2.2 随机变量的数字特征
    2.2随机变量的数字特征离散型随机变量的数学期望设离散型随机变量\(X\)的可能值为\(x_i(i=1,2,\cdots)\),其概率分布为\[P\{X=x_i\}=p_i,\quadi=1,2,\cdots,\]若\(\su......
  • pyautogui + opencv 笔记
    安装pipinstallpyautoguipipinstallopencv-python==3.4.8.291,控制鼠标的移动获取屏幕分辨率>>>importpyautogui>>>宽,高=pyautogui.size()>>>宽,高......
  • 极光笔记 | 当前最佳实践:Header Bidding 与瀑布流混合请求技术
    通过这篇文章您讲将了解:HeaderBidding的发展史Waterfall、HeaderBidding的逻辑及优劣势为什么说HeaderBidding与瀑布流混合请求技术是当前最佳实践PART 01、Header......
  • 从零开始学node.js笔记 03
    一、模块的加载机制1、优先从缓存中加载模块在第一次加载后会被缓存,这也意味着多次调用require()不会导致模块的代码被执行多次。注意:不论是内置模块、用户自定义模块、还是......
  • redis部署手册_20221129
    1.软件版本及下载Keepalived:https://www.keepalived.org/download.htmlRedis下载地址:https://redis.io/download/本次安装版本:Redis:7.0.5Keepalived:2.2.72.主......
  • FreeSWITCH学习笔记3(3.5)- 初识FreeSWITCH
    目录配置SIP网关拨打外部电话:从某一分机上呼出呼入电话处理 配置SIP网关拨打外部电话 originatesofia/gateway/zlz/1003&echo(前提是设置了1003,并且选定了才......