MyBatis使用小结

物联网开发131 - Micropython ESP32 C3连接TB6600驱动42BYGH39步进电机 如何使用合宙ESP32 C3连接TB6600驱动42BYGH39步进电机,实现控制步进电机正反转和旋转指定角度等 阅读详情

MyBatis的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>
    <typeAliases>
        <typeAlias alias="User" type="com.xxx.mybatis.models.User" />
    </typeAliases>
    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC" />

            <dataSource type="POOLED">  
                <property name="driver" value="com.mysql.jdbc.Driver" />
                <property name="url" value="jdbc:mysql://127.0.0.1:3306/yiibai" />
                <property name="username" value="root" />
                <property name="password" value="" />
            </dataSource>
        </environment>
    </environments>

    <mappers>
         <mapper resource="com/xxx/mybatis/models/User.xml" />
    </mappers>
</configuration>

该xml文件用来构建MyBatis的session factory。

MyBatis实体类

即POJO

Mapper示例

<?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.xxx.mybatis.models.UserMapper">
    <select id="GetUserByID" parameterType="int" resultType="User">
        select * from `user` where id = #{id}
    </select>
</mapper>

最初级使用代码示例

try {
    reader = Resources.getResourceAsReader("config/Configure.xml");
    sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);//构建session factory
} catch (Exception e) {
    e.printStackTrace();
}

SqlSession session = sqlSessionFactory.openSession();
try {
    User user = (User) session.selectOne("com.yiibai.mybatis.models.UserMapper.GetUserByID", 1);

    if(user!=null){
        String userInfo = "名字:"+user.getName()+", 所属部门:"+user.getDept()+", 主页:"+user.getWebsite();
        System.out.println(userInfo);
    }
} finally {
    session.close();
}

使用带注解的接口消除xml mapper

通过带注解的dao接口类可以替代xml形式的mapper

public interface IUser {
     @Select("select * from user where id= #{id}")
     public User getUserByID(int id);
}
SqlSession session = sqlSessionFactory.openSession();
try {
    IUser iuser = session.getMapper(IUser.class);
    User user = iuser.getUserByID(1);
    System.out.println("名字:"+user.getName());
    System.out.println("所属部门:"+user.getDept());
    System.out.println("主页:"+user.getWebsite());
} finally {
    session.close();
}

完全使用接口和xml mapper

接口

public interface IUser {
    public List<User> getUserList();

    public void insertUser(User user);

    public void updateUser(User user);

    public void deleteUser(int userId);

    public User getUser(int id);
}

xml mapper

<?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.yiibai.mybatis.dao.IUser">

    <select id="getUser" parameterType="int"
        resultType="com.xxx.mybatis.models.User">
        SELECT *
        FROM USER
        WHERE id = #{userId}
    </select>


    <insert id="insertUser" parameterType="User">
        INSERT INTO USER(name,
        dept, website,phone)
        VALUES(#{name}, #{dept}, #{website}, #{phone})
    </insert>

    <select id="getUserList" resultType="com.xxx.mybatis.models.User">
        SELECT * FROM USER
    </select>

    <update id="updateUser" parameterType="User">
        UPDATE USER
        SET
        name=
        #{name},
        dept = #{dept},
        website = #{website},
        phone = #{phone}
        WHERE
        id =
        #{id}
    </update>

    <delete id="deleteUser" parameterType="int">
        DELETE FROM USER WHERE id = #{id}
    </delete>

</mapper>

注意在User.xml 配置文件中,mapper namespace=”com.yiibai.mybatis.inter.IUser” ,命名空间对应非常重要,名称不能有错,必须与我们定义的 package 和 接口一致。

使用代码

try {
    reader = Resources.getResourceAsReader("config/Configure.xml");
    sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);//构建session factory
} catch (Exception e) {
    e.printStackTrace();
}

try{
    // 获取Session连接
    SqlSession session = sqlSessionFactory.openSession();

    // 获取Mapper
    IUser userMapper = session.getMapper(IUser.class);

    // 执行插入
    User user = new User();
    user.setId(0);
    user.setName("Google");
    user.setDept("Tech");
    user.setWebsite("http://www.google.com");
    user.setPhone("120");
    userMapper.insertUser(user);

    // 提交事务
    session.commit();
    System.out.println("Test insert finished...");
} catch (Exception e){
    e.printStackTrace();
}

一对多关联,多对一关联

User用户与Post文章之间存在一对多关系

public class User implements Serializable{
    private int id;
    private String username;
    private String mobile;
    private List<Post> posts;
public class Post implements Serializable{
    private int id;
    private User user;
    private String title;
    private String content;

mapper中的一对多映射语句

<resultMap type="User" id="resultUserMap">
    <result property="id" column="user_id" />
    <result property="username" column="username" />
    <result property="mobile" column="mobile" />

    <collection property="posts" ofType="com.xxx.pojo.Post" column="userid">
        <id property="id" column="post_id" javaType="int" jdbcType="INTEGER"/>    
        <result property="title" column="title" javaType="string" jdbcType="VARCHAR"/>
        <result property="content" column="content" javaType="string" jdbcType="VARCHAR"/> 
    </collection>
</resultMap>

<select id="getUser" resultMap="resultUserMap" parameterType="int">
    SELECT u.*,p.*
    FROM user u, post p
    WHERE u.id=p.userid AND id=#{user_id} 
</select>

mapper中的多对一映射语句

<resultMap type="Post" id="resultPostsMap">
    <result property="id" column="post_id" />
    <result property="title" column="title" />
    <result property="content" column="content" />

    <association property="user" javaType="User">  
        <id property="id" column="userid"/>   
            <result property="username" column="username"/>   
            <result property="mobile" column="mobile"/>   
        </association> 
</resultMap>

<select id="getPosts" resultMap="resultPostsMap" parameterType="int">
    SELECT u.*,p.*
    FROM user u, post p
    WHERE u.id=p.userid AND p.post_id=#{post_id} 
</select>

多对多关联

在多对多关联中需要建立中间关联表的实体。
User用户与Group用户组之间存在多对多关系

public class User {
    private int id;
    private String username;
    private String mobile;
    private List<Group> groups;
public class Group {
    private int groupId;
    private String groupName;
    private List<User> users;
public class UserGroup {
    private int userId;  
    private int groupId;

Group的mapper配置片段

<resultMap type="Group" id="resultGroupMap_1">
    <result property="id" column="id" />
    <result property="groupName" column="group_name" />
    <collection property="users" column="group_id"
        select="com.yiibai.maper.UserGroupMaper.getUsersByGroupId" />
</resultMap>

<select id="getGroup" resultMap="resultGroupMap_1"
    parameterType="int">
    SELECT *
    FROM `group`
    WHERE group_id=#{id}
</select>

User的mapper配置片段

<resultMap type="User" id="resultUser">
    <result property="id" column="group_id"/>
    <result property="name" column="name"/>
        <collection property="groups" column="id" select="com.yiibai.maper.UserGroupMaper.getGroupsByUserId"/>
</resultMap>

<select id="getUser" resultMap="resultUser" parameterType="int">
    SELECT *
    FROM user
    WHERE id=#{id}
</select> 

UserGroup的mapper配置片段

<!-- 根据一个用户组ID,查看这个用户组下的所有用户 -->
<resultMap type="User" id="resultUserMap_2">
    <result property="id" column="id"/>
    <result property="username" column="username"/>
    <result property="mobile" column="mobile"/>
</resultMap>

<select id="getUsersByGroupId" resultMap="resultUserMap_2" parameterType="int">
    SELECT u.*, ug.group_id
    FROM user u, user_group ug
    WHERE u.id=ug.user_id AND ug.group_id=#{group_id}
</select>

<!-- 根据一个用户ID,查看这个用户所对应的组-->
<resultMap type="Group" id="resultGroupMap_2">
    <result property="groupId" column="group_id"/>
    <result property="groupName" column="group_name"/>
</resultMap> 

<select id="getGroupsByUserId" resultMap="resultGroupMap_2" parameterType="int">
    SELECT g.*, u.user_id
    FROM group g, user_group u
    WHERE g.group_id=u.group_id AND u.user_id=#{user_id}
</select>

MyBatis与Spring集成(非扫描mapper,mapper在配置文件中显示声明)

在集成过程中,涉及三类比较重要的文件。

  1. Spring的配置文件applicationContext.xml
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
    <property name="driverClassName" value="com.mysql.jdbc.Driver" />
    <property name="url" value="jdbc:mysql://127.0.0.1:3306/yiibai?characterEncoding=utf8" />
    <property name="username" value="root" />
    <property name="password" value="" />
</bean>

<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
    <property name="dataSource" ref="dataSource" />
    <property name="configLocation" value="config/Configuration.xml" />
</bean>

<bean id="userMaper" class="org.mybatis.spring.mapper.MapperFactoryBean"> 
    <property name="sqlSessionFactory" ref="sqlSessionFactory" />
    <property name="mapperInterface" value="com.xxx.maper.UserMaper" />
</bean>
  1. MyBatis的配置文件mybatisConfiguration.xml (可以配置MyBatis相关的setting属性)
    在mybatisConfiguration.xml中不在需要配置environments节点,但是仍要配置mappers节点(下文会通过配置spring中sqlSessionFactory内的mapperLocations,将mappers节点配置也给省略)。

  2. MyBatis中的映射文件

调用Spring context中的dao接口

ctx = new ClassPathXmlApplicationContext("config/applicationContext.xml");

UserMaper userMaper = (UserMaper) ctx.getBean("userMaper");

// 测试id=1的用户查询,可根据数据库中的情况修改.
User user = userMaper.getUserById(1);
System.out.println("获取用户 ID=1 的用户名:"+user.getUsername());

MyBatis与Spring集成(扫描mapper,mapper无需在配置文件中显示声明)

如果想使用MyBatis的扫描mapper的功能,需要在Spring中增加配置。

<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
    <property name="dataSource" ref="dataSource" />
    <property name="configLocation" value="classpath:config/Configuration.xml" />
    <property name="mapperLocations" value="classpath*:com/yiibai/mapepr/*.xml" />
    //不在需要在mapper中指定type全限定名
    <property name="typeAliasesPackage" value="com.xxx,com.yyy"/>
</bean>

<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
    <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory" />
    <property name="basePackage" value="com.xxx.maper" />
    //可以指定扫描包下面有特殊注解的mapper类
    <property name="annotationClass" value="com.xxx.common.persistence.annotation.MyBatisDao"/>
</bean>

通过自动注入,可以将dao接口的实现注入到具体的service中。

@Autowired
private UserMapper userMapper;

更多参考官方文档:http://www.mybatis.org/mybatis-3/zh/index.html

引入高分辨率特征层保持的YOLOv10小目标增强:从思路到完整实现 大概两个月前,我在做一个无人机航拍图像检测的项目,目标是识别图片里的小型车辆和行人。用的数据集是VisDrone,相信做小目标检测的朋友对这个数据集都不陌生。一开始我直接跑了官方YOLOv10的代码,结果在tiny vehicle这一类上mAP50只有可怜的0.312。那些小目标基本就是几个像素点,YOLOv10在三次下采样之后,这些小目标的特征几乎就消失不见了。 后来我折腾了大概三周,尝试了各种方法:改anchor、调loss权重、做数据增强、甚至考虑过换检测头。最后发现最有效的还是引入一个高分辨率特征 阅读详情

相关推荐

如何修复Windows卡在“正在准备Windows”的问题?这里有详细步骤

如何修复Windows卡在“正在准备Windows”的问题?这里有详细步骤。

wyxtx的博客 5662

java.lang.IndexOutOfBoundsException: No group 1

java.lang.IndexOutOfBoundsException: No group 1

u012542525的博客 614

QMT量化交易实战:如何用通达信预警数据自动买卖股票(附完整Python代码)

本文详细介绍了如何利用QMT平台结合通达信预警数据实现股票自动化交易,提供完整的Python代码实现。通过实时监控通达信预警板块文件,系统自动执行买卖操作,提升交易效率。文章涵盖系统架构设计、数据对接、信号处理、订单执行等核心模块,适合量化交易初学者和通达信用户参考实践。

weixin_29251567的博客 678

字符串替换IndexOutOfBoundsException: No group1

mybatis 插入 含有美元符号($) 字符串 报 java.lang.IndexOutOfBoundsException: No group 1 的问题 1.做了一个网页中替换字符的功能,用的是str.replaceAll,结果报错No group 1. 2.谷歌一下 java.lang.IndexOutOfBoundsException: No group 这个错误会发现是 String.replace方法出现反斜杠或美元符号$时会出现这个异常 原因: android文本替换的时候里面还有$符号,导

chench 2213

硬件原理图:从软件思维到硬件接口的嵌入式开发破局指南

本文为软件开发者提供了读懂硬件原理图的嵌入式开发破局指南。文章将硬件原理图类比为“硬件系统的架构图”,引导读者将软件API调用思维迁移到硬件接口理解上,详细解析了电阻、电容、二极管等常见元器件的“硬件API”功能与选型逻辑,并通过实战电路拆解,阐述了从原理图分析到驱动代码编写的完整思维链条,帮助开发者建立软硬件协同的系统级视角。

lg888的博客 496

DIY音乐播放器:用VS1053模块+Arduino打造你的专属MP3播放器(附完整代码)

本文详细介绍了如何使用VS1053音频解码模块与Arduino开发板,从零开始构建一个功能完备的桌面级MP3播放器。内容涵盖硬件架构设计、SPI总线共享、底层驱动编写、双缓冲区数据流管理以及用户交互实现,并提供完整的代码示例与性能优化建议,帮助创客打造高度可定制的专属音乐播放设备。

weixin_29189003的博客 287

MyBatis 配置中那些值得注意的坑

当你在使用Mybatis 时进行配置的时候有这样几个坑一定要注意下。

极客星云-优快云博客 9357

Labview项目01:标准可配置序列测试框架

摘要:本文介绍了一个基于LabVIEW2020开发的通用测试框架系统。该系统采用模块化设计,包含主界面、调试界面、设置界面和登录界面。主功能包括:1)可配置测试序列,支持延时、预定值输出、随机值输出等操作;2)单步测试功能自主添加;3)界面支持测试序列编辑和权限管理。系统采用队列机制处理事件和测试流程,通过CSV文件存储测试序列,支持参数化配置。用户可自定义测试VI(A_.vi和N_.vi格式),并通过调试界面验证测试序列。最终测试结果在主界面显示,提供整体判断功能。该系统既可作为学习参考,也可用于实际测试

weixin_38637405的博客 1552

mybatis-plus超详细介绍

简介 1. MyBatisPlus 介绍 MyBatis-Plus( 简称 MP),是一个 MyBatis 的增强工具包,只做增强不做改变**.** 为简化开 发工作、提高生产率而生 我们的愿景是成为 Mybatis 最好的搭档,就像 魂斗罗 中的 1P、2P,基友搭配,效率翻倍。 2. 代码及文档发布地址 官方地址: http://mp.baomidou.com 代码发布地址: Github:...

迷雾总会解 8427

Spring Boot 调用豆包大模型如何开启联网搜索?

场景推荐方案有权限创建 Bot + 需强集成✅ 使用bot-xxxx无 Bot 权限 / 追求通用性✅ 自行集成搜索引擎 + 普通豆包模型仅需基础对话❌ 无需考虑联网豆包大模型确实支持联网搜索,但前提是:你用的是“智能体 Bot”,且它被配置了“网页搜索”插件,并调用正确的 API 端点。希望本文能帮你少走弯路,快速构建出真正“知天下事”的智能助手!

lpfasd123的博客 1123

AI编程工具到底是初学者的绊脚石还是垫脚石?

现在是AI时代,我们要做的,是学会拥抱AI、使用AI,成为AI的驾驭者,如果你因为害怕使用AI学不到东西,那么大可不必,因为AI必然是今后的趋势,相信会用AI在今后的求职面试中也会有很大的占比。另外我之前写了多篇有关AI编程开发工具Trae的使用技巧和教程,需要的话你可以关注公众号后通过菜单栏获取。另外我也把所有Trae相关的文章整合到了腾讯ima知识库,感兴趣的可以关注公众号以后回复。

cpp加油站的专栏 184

mybatis 插入 含有美元符号($) 字符串 报 java.lang.IndexOutOfBoundsException: No group 2 的问题...

  一:问题描述:     在springboot-security框架生成BCryptPasswordEncoder()方法生成加密后的密码后,带有$符号,导致新增用户的时候插入不了,报(IndexOutOfBoundsException: No group 2)的错误!   谷歌一下java.lang.IndexOutOfBoundsException: No group...

weixin_30278311的博客 980

嵌入式Modbus协议面试题及参考答案

Modbus 协议采用主从模式进行通信,这种模式定义明确,便于在工业环境中实现设备之间的有序数据交互。在主从模式中,存在一个主站(Master)和多个从站(Slave)。主站通常是工业控制系统中的上位机,如 PLC、工控机等,它负责发起通信请求,控制整个通信过程。从站则是各种现场设备,如传感器、执行器等,它们接收主站的请求,并根据请求进行相应的操作,然后将结果返回给主站。主站的主要功能包括:发起数据读取或写入请求、控制通信的时序和流程、处理从站返回的数据。

大模型大数据攻城狮的专栏 2042

Mybatis代码笔记小结

根据站长的Mybatis部分内容 敲代码后的注释小结 Mybatis基础概念 MyBatis的传入参数parameterType类型分两种 基本数据类型:int,string,long,Date; 复杂数据类型:类和Map 如何获取参数中的值: 2.1 基本数据类型:#{value}或${value} 获取参数中的值 2.2 复杂数据类型:#{属性名}或KaTeX parse error: Expected 'EOF', got '#' at position 15: {属性

m0_50292871的博客 166

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

MyBatis小结

1.@param_mybatis的参数绑定 @param("给绑定的参数起一个名字") 对于参数为复杂的类型---Map Map就是实体<K,V>,通过@param注解value的属性值作为键,参数为值,通过#{}来访问键从而获取对应的的参数值. 2.自定义继承自mybatis的连接池数据源工厂类 连接池的特点: 1)创建一些固定的可重用的连接对象,重复利用它们,当某个连接对象被某个持有的线程使用完毕之后,然后归还连接池中; 2)保证线程安全. 自定义继承自mybatis的连接池

qq_52619957的博客 6191

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

mybatis小结

引言 1.Mybatis框架概念:是持久层框架,封装了JDBC,解决了DAO中通用问题 2.JDBC开发的DAO存在的问题: a)手工的ORM,产生大量冗余代码 b)手工进行日期处理:java.util.Date----java.sql.Date c)JDBC没有缓存:查询效率低 3.Mybatis的好处: 自动进行ORM映射,减少冗余代码 自动进行日期...

qq_41611829的博客 364

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

mybatis 使用经验小结

http://www.cnblogs.com/yjmyzz/p/4261024.html

nimeijian的专栏 429

Mybatis基础知识小结

ORM说白了就是建立数据库字段和Java对象(POJO)的一种映射关系技术而Mybatis由于建立这种映射需要我们手动编写SQL, 所以说它是半自动的。

沉梦听雨的博客 1252

Mybatis 小结

封装了JDBC Statement操作,负责对JDBC statement 的操作,如设置参数、将Statement结果集转换成List集合。对用户传递的参数转换成JDBC Statement 所需要的参数。资源加载模块java数据类型和jdbc数据类型之间的映射和转换。根据用户传递的parameterObject,动态地生成SQL语句,将信息封装到BoundSql对象中,并返回。动态生成的SQL语句及相应的参数信息。10.

weixin_42679286的博客 466

Mybatis小结

Mybatis什么是框架?为什么使用框架?主流框架介绍jdbc问题总汇什么是Mybatis (是一个不完全的orm(对象关系映射)框架。)Mybatis中的xml文件等Mybatis执行过程面试小结 什么是框架? 可以理解为帮助我们实现了一部分功能,优点:减少代码量,提高开发效率 为什么使用框架? 每个优秀的框架都是对底层的代码做了轻量级的封装,目的是减少代码量,提高开发效率. JAVAEE三...

Tamandjey的博客 233

MyBatis的IFNULL的使用小结

Mybatis-MySQL 中使用IFNULL(p1,p2)函数 但是有一些需要注意的地方. 假设数据 title: student id name age 1 Ann 18 2 Bom 19 3 Hehe SELECT name,age FROM student WHERE id = 3; 此时查询结果就是 name age hehe 使用I...

weixin_38137028的博客 2万+

Mybatis的入门小结

Mybatis之所以能长盛不衰的主要原因就是它的几个优点 灵活、小巧 简单易学 数据持久化 1.首先使用Mybatis要使用到三个包 2.创建一个Web项目 3.

weixin_45068831的博客 117

Mybatis框架小结

mybatis知识点小结

m0_62565675的博客 468
上一篇: byte转换至16进制字符串_计算机原/反/补码
下一篇: CentOS 7配置FastDFS与Ngnix实践
AlainGogogo
博客等级 码龄18年 5粉丝 20原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值