Mybatis环境搭建,CRUD,动态sql,缓存,延时加载

数学建模:相关性分析学习——皮尔逊(pearson)相关系数与斯皮尔曼(spearman)相关系数 相关性分析:求解相关系数并绘制热力图进行对比 阅读详情

什么是框架?

他是我们软件开发中的一套解决方案,不同的框架解决不同的问题
使用框架的好处:
框架封装了很多的细节,使开发者可以使用极简的方法实现功能,大大提高开发效率

什么是三层架构?

表现层: 用于展示数据
业务层: 是处理业务需求
持久层: 和数据库进行交互

持久层技术解决方案
         JDBC技术:
                        Connection
                        PreparedStatement
                        ResultSet
          SpringJdbcTemplate:
                        Spring中对JDBC的简单封装
          Apache的DBUtils
                        和Spring的JDBCTemplate很像,都是简单封装

  以上都不是框架
      JDBC是规范
      Spring的JdbcTemplate和Apache的DBUtils都只是工具类

Mybatis框架概述:

是一个优秀的基于java的持久层框架,它内部封装了jdbc很多细节,所以我们只需关注sql语句本身,无需关注加载驱动,获取连接,创建statement对象等过程,使用ORM思想实现结果集的封装.

ORM(Object Relational Mapping) :对象关系映射

就是把数据库表和实体类的属性对应起来,让我们可以操作实体类就实现操作数据库表

mybatis的环境搭建:

1.创建maven工程并导入坐标
2.创建实体类和dao的接口
3.创建Mybatis的主配置文件
SqlMapConfig.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">

<!--mybatis的主配置文件-->
<configuration>
    <!--配置环境-->
    <environments default="mysql">
        <!--配置mysql的环境-->
        <environment id="mysql">
            <!--配置的事务类型-->
            <transactionManager type="JDBC"></transactionManager>
            <!--配置数据源,也叫连接池-->
            <dataSource type="POOLED">
                <!--配置连接数据库的4个基本信息-->
                <property name="driver" value="com.mysql.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://localhost:3306/test"/>
                <property name="user" value="debian-sys-maint"/>
                <property name="password" value="YN6bICN3ccV5FbIn"/>
            </dataSource>
        </environment>
    </environments>

    <!--指定映射配置文件的配置,映射配置文件是指给每个Dao独立的配置文件-->
    <mappers>
        <mapper resource="com/tulun/dao/IUserDao.xml"></mapper>
    </mappers>
</configuration>

4.创建映射配置文件
IUserDao.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.tulun.dao.IUserDao">
    <!--配置查询所有-->
    <select id="findAll">
        select *from user
    </select>
</mapper>

环境搭建的注意事项:
1.创建IUSerDao.xml 和 IUserDao.java时名称是为了和我们之前的知识保持一致,在Mybatis中,他把持久层的操作接口名称和映射文件也叫作:Mapper
所以IUserDao 和IUserMapper是一样的
2.在idea创建目录的时候,他和包是不一样的, 包在创建时:com.tulun.dao他是三级目录 目录在创建时:com.tulun.dao他是一级目录
3.mybatis的映射配置文件位置必须和dao接口的包结构相同
4.映射配置文件的mapper标签的namespace属性的取值必须是dao接口的全限定类名
5.映射配置文件的操作配置(select ),id属性必须是dao接口的方法名 当我们遵从了3,4,5点之后,我们在开发中就无需在写dao的实现类

Mybatis的基本代码:

第一步:读取配置文件
第二步:创建SqlSessionFactory工厂
第三步:创建SqlSession对象
第四步:创建Dao接口的代理对象
第五步:执行dao中的方法
第六步:释放资源

		//加载SqlMapConfig.xml配置文件
        InputStream in = Resources.getResourceAsStream("SqlMapConfig.xml");
        //创建SqlSessionFactory会话工厂
        SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(in);
        //创建会话
        SqlSession sqlSession = sessionFactory.openSession();
        //获取代理对象
        AccountDao accountDao = sqlSession.getMapper(AccountDao.class);
		//查询
        List<Account> accounts = accountDao.findAll();

        for(Account account : accounts) {
            System.out.println(account);
        }

        in.close();
        sqlSession.close();

Mybatis的CRUD操作

<mapper namespace="com.tulun.dao.IUserDao">

    <!--配置查询所有的结果的列名和实体类属性名的对应关系-->
    <resultMap id="userMap" type="com.tulun.domain.User">
        <!--配置主键字段的对应-->
        <!-- <id property="" column=""></id> -->
        <!--非主键字段的对应-->
        <!-- <result property="userId" column="id"></result> -->
        <result property="userName" column="username"></result>
        <result property="userSex" column="sex"></result>
        <result property="UserBirthday" column="birthday"></result>
        <result property="userAddress" column="address"></result>
    </resultMap>

    <!--查询所有-->
    <select id="findAll" resultMap="userMap">
        select *from user;
    </select>
    
    <!--保存用户  parameterType:参数的类型-->
    <insert id="saveUser" parameterType="com.tulun.domain.User">
        <!--配置插入操作后,获取插入数据的id-->
        <selectKey keyProperty="userId" keyColumn="id" resultType="Integer" order="AFTER">
            select last_insert_id();
        </selectKey>
        insert into user(id,username,birthday,sex,address)values (#{userId},#{userName},#{UserBirthday},#{UserSex},#{UserAddress});
    </insert>
    
    <!--更新用户-->
    <update id="updateUser" parameterType="com.tulun.domain.User">
        update user set username=#{userName},birthday=#{UserBirthday},address=#{UserAddress} where id=#{id};
    </update>

    <!--删除用户-->
    <delete id="deleteUser" parameterType="Integer">
        delete from user where id=#{id};
    </delete>

    <!--根据id查询用户-->
    <select id="findById" parameterType="Integer" resultMap="userMap">
        select * from user where id=#{id};
    </select>
    
    <!--根据用户名查询 模糊查询-->
    <select id="findByName" parameterType="java.lang.String" resultMap="userMap">
        <!--select * from user where username like #{username}; -->
        select * from user where username like '%${value}%'
    </select>

    <!--查询总用户数-->
    <select id="findTotal" resultMap="userMap">
        select count(id) from user;
    </select>

    <!--根据queryVo的条件查询用户-->
    <select id="findUserByVo" parameterType="com.tulun.domain.QueryVo" resultMap="userMap">
        select * from user where username like #{user.userName};
    </select>
</mapper>

Mybatis的参数深入:
parameterType(输入类型):传递简单类型
传递pojo(实体类)对象
传递pojo包装对象 什么是ognl表达式:Object(对象) Graphic(图) Navigation(导航) Language(语言)
它是通过对象的取值方法来获取数据.在写法上吧get省略了.比如:获取用户的名称:
类中的写法:user.getUsername();
ognl表达式写法:user.username; mybatis中为什么可以直接写username而不用user.呢
因为在parameterType中已经提供了属性所属的类,所以比用些对象名.

Mybatis的标签使用:

properties标签:

<!--配置properties
    可以在标签内部配置连接数据库的信息.也可以通过属性引用外部配置文件信息
    resource属性:
        用于指定配置文件的位置,是按照类路径的写法来写,必须存在类路径下.
    url属性:
        是要求按照Url的写法来写地址
        URL: Uniform Resource Locator 统一资源定位符.他是可以唯一标识一个资源的位置
        它的写法:
            http://localhost:8080/mybatisserver/demoSerlet
            协议  主机   端口     URI
        URI:Uniform Resource Identifier 统一资源标识符.他是在应用中可以唯一定位一个资源的
-->

<!--配置properties 1.通过加载配置文件的方式 配置resource属性-->
<properties resource="jdbcConfig.properties"></properties> 

<!--配置properties 2.通过配置url的方式-->
<properties url="file:///home/fly/IdeaProjects/mybatis/mybatis_CRUD/src/main/resources/jdbcConfig.properties"></properties>

typeAliases标签:


<!--使用typeAliases 配置别名.只能配置domain中的类的别名-->
<typeAliases>
一. <!--typeAlias用于配置别名 type属性指定的是实体类全限定类名 ,alias属性指定别名,当指定了别名之后就不在区分大小写-->
    <typeAlias type="com.tulun.domain.User" alias="user"></typeAlias>

二. <!--用于指定配置别名的包 ,当指定之后,该包下的实体类都会注册别名,并且类名就是别名,不区分大小写-->
    <package name="com.tulun.domain"/>
</typeAliases>

<!--配置映射文件-->
<mappers>
    <mapper resource="com/tulun/dao/IUserDao.xml"></mapper>

    <!--package标签是指定dao接口所在的包,当指定之后就不需要再写mapper 以及resource 或者class-->
    <package name="com.tulun.dao"/>\
</mappers>

mapper里的标签(可以实现动态sql)

if标签

<!--根据条件查询-->
<select id="findUserByCondition" parameterType="user" resultMap="userMap">
    select *from user where 1=1
    <if test="userName != null ">
        and username =#{userName}
    </if>
</select>

where标签

<select id="findUserByCondition" parameterType="user" resultMap="userMap">
    select *from user
    <where>
        <if test="userName != null ">
            and username =#{userName}
        </if>
        <if test="UserSex !=null">
            and sex =#{UserSex}
        </if>
    </where>
</select>

sql标签

<!--了解的内容 用于抽取重复的语句-->
<sql id="defaultUser">
    select *from user;
</sql>

<!--查询所有-->
<select id="findAll" resultMap="userMap">
    <include refid="defaultUser"></include>
</select>

foreach标签

<!--根据queryVo的id集合 实现查询用户列表-->
<select id="findUserInIds" resultMap="userMap" parameterType="queryVo">
    select * from user
    <where>
        <if test="ids != null and ids.size()>0">
            <foreach collection="ids" open="and id in(" close=")" item="id" separator=",">
            <!--这个id 由 item的 id 决定-->
                #{id}
            </foreach>
        </if>
    </where>
</select>

连接池:

可以减少我们获取连接所消耗的时间. (连接池就是一个用于存储连接的容器,容器就是一个集合对象,该集合必须是线程安全的,不能两个线程拿到同一个连接,该集合还必须实现队列的特性:先进先出) ```


mybatis中的连接池:
    mybatis连接池提供了三种方式的配置
    配置的位置:
       主配置文件SqlMapConfig.xml中的datasource标签,type属性表示采用那种连接池的方式
       type的取值:
           POOLED :采用传统的javax.sql.DataSource规范中的连接池 ,mybatis中有针对规范的实现(相当于我们手动创造一个连接)
           UNPOOLED :采用传统的获取连接的方式,虽然也实现了javax.sql.DataSource接口,但是并没有采用池的思想.
          (拓展)   JNDI :采用服务器提供的JNDI技术实现来获取DataSource对象,不同的 服务器拿到的dataSource是不一样的.
          注意:如果不是web或者maven的war工程,是不能使用的.
    我们测试时候使用tomcat服务器,采用的连接池:dbcp连接池

Mybatis的延迟加载

问题:在一对多中,有一个用户,他有100个账户,在查询的时候,要不要吧关联的账户查出来?
在查询用户时,用户下的账户信息应该是什么时候使用,什么时候查询
在查询账户时,账户的所属用户信息应随着账户查询时一起查出来
什么是延迟加载
在真正使用数据时才发起查询,不用的时候不查询(按需加载,懒加载)
什么是立即加载
不管用不用,只要调用方法,马上发起查询
在对应的四种表关系中:一对一 多对一 一对多 多对多
一对多,多对多:通常情况下采用延迟加载.
多对一,一对一:通常情况下采用立即加载.

//SqlMapConfig文件:

<!-配置参数--->
<settings>
          <!--开启Mybatis支持延迟加载-->    
          <setting name ="lazyLoadingEnable" value = "true"/>  //默认值为true

          <!--当开启时,任何方法的调用都会加载该对象的所有属性-->
          <setting name ="aggressiveLazyLoading" value = "false"/></setting> 
</settings>

mybatis中的一级缓存和二级缓存

一级缓存:

mybatis的sqlSession对象的缓存

但我们执行查询之后,查询的结果会同时存入到sqlSession为我们提供的区域,该区域的结构是一个map.
当我们再一次查询同样的数据,mybatis会先去sqlSession中查看是否有,有的话直接拿出来用,
当sqlSession对象消失后,mybatis的一级缓存也就消失了. 
sqlSession.clearCache();可以清空缓存 
当调用sqlSession的修改,添加,删除,commit()等方法时,就会清空一级缓存

     User user1 = userDao.findById(1);
     System.out.println(user1);
     sqlSession.clearCache();  //清空缓存
     //update(),commit(),delete();
     User user2 = sqlSession.getMapper(IUserDao.class).findById(1);
     System.out.println(user2);
     System.out.println(user1 == user2);
     
打印结果:
com.tulun.domain.User@6c64cb25
com.tulun.domain.User@5158b42f
false

二级缓存

指的是mybatis中的sqlSessionFactory对象的缓存,由同一个sqlSessionFactory对象创建的sqlSession共享其缓存. 二级缓存存放的是数据,不是对象

二级缓存的使用步骤: 
1.让mybatis框架支持二级缓存(在sqlMapConfig.xml中配置)

<!--配置二级缓存-->
<setting name="cacheEnabled" value="true"/>

2.让当前的映射文件支持二级缓存(在IUserDao.xml中配置)

<!--开启user支持二级缓存-->
<cache/>

3.让当前的操作支持二级缓存(在select标签中配置)

<select id="findById" resultType="com.tulun.domain.User" useCache="true">
        select *from user where id =#{id}
</select>

Mybatis的注解开发:

注解代码:
SqlMapConfig.xml

<mappers>
        <package name="com.tulun.dao"/>
</mappers>

IUserDao ( Interface )

/**
 * 查询所有
 * @return
 */
@Select("select *from user")
List<User> findAll();

/**
 * 保存用户
 * @param user
 */
@Insert("insert into user(id,username,address,sex,birthday) value(#{id},#{username},#{address},#{sex},#{birthday})")
void saveUser(User user);

/**
 * 更新用户
 * @param user
 */
@Update("update user set username=#{username},sex=#{sex},birthday=#{birthday},address=#{address} where id =#{id}")
void updateUser(User user);

/**
 * 删除用户
 * @param id
 */
@Delete("delete from user where id =#{id}")
void deleteUser(Integer id);

/**
 * 查询一个用户
 * @param id
 * @return
 */
@Select("select * from user where id=#{id}")
User findUserById(Integer id);

/**
 * 根据名字查询用户
 * @param name
 * @return
 */
@Select("select * from user where username like #{username}")
List<User> findUserByName(String name);

注意:使用注解开发的时候,就不必配置com.tulun.dao.IUserDao.xml文件,因为如果两个都有,mybatis加载的时候,就不知道该怎么办.

IUserDao(Interface)

举例://如果User实体类属性名和数据库属性名不一样,可以使用以下标签
@Results(id = "userMap",value = {
        @Result(id = true, column = "id",property = "userId"),//id为主键
        @Result(column = "username",property = "userName"),
        @Result(column = "sex",property = "userSex"),
        @Result(column = "birthday",property = "userBirthday"),
        @Result(column = "address",property = "userAddress"),
})
/**
 * 查询所有
 * @return
 */
@Select("select *from user")
@ResultMap(value = {"userMap"})   //标准写法
List<User> findAll();

多表查询操作

多对一(账户查用户)

在mybatis中,多对一的查询就是一对一(多个账户对应一个用户 mybatis认为:一个账户对应一个用户)
在Account实体类中就应该有一个private User user; 属性
IAccountDao(Interface)
@Results(id = "accountMap",value = {
        @Result(id = true, column = "id",property = "userId"),//id为主键
        @Result(column = "uid",property = "uid"),
        @Result(column = "money",property = "money"),
        @Result(property = "user",column = "uid",one = @One(select = "com.tulun.dao.IUserDao.findById",fetchType = FetchType.EAGER))
})                         
property: user属性   
cloumn:根据uid在user库进行查找   
one=@One(select ="在user库查找的方式")  
fetchType.EAGER:立即加载方式 (还有lazy懒加载,default默认)

一对多(用户查账户)

在User实体类中就应该有一个 private List<Account> accounts; 属性
IUserDao(Interface)
 
@Results(id = "userMap",value = {
        @Result(id = true, column = "id",property = "userId"),//id为主键
        @Result(column = "username",property = "userName"),
        @Result(column = "sex",property = "userSex"),
        @Result(column = "birthday",property = "userBirthday"),
        @Result(column = "address",property = "userAddress"),
        @Result(property = "accounts",column = "id",many =@Many(select = "com.tulun.dao.IAccount.findAccountByUid",fetchType = FetchType.LAZY))
})
property: accounts属性   
cloumn:根据id在account库进行查找   
many=@Many(select ="在account库查找的方式")  
fetchType.LAZY:懒加载方式

缓存的配置

mybatis中不管xml还是注解,一级缓存都是本身具备的.
二级缓存:

 SqlSession sqlSession = factory.openSession();
 User user1 = sqlSession.getMapper(IUserDao.class).findById(1);
 System.out.println(user1);
 sqlSession.close(); //释放一级缓存
 
 SqlSession sqlSession = factory.openSession();// 再次打开sqlSession
 User user2 = sqlSession.getMapper(IUserDao.class).findById(1);
 System.out.println(user2);

使开启二级缓存:
SqlMapConfig.xml文件

<settings>
    <!--配置二级缓存-->
    <setting name="cacheEnabled" value="true"/>
</settings>

IUserDao接口

@CacheNamespace(blocking = true)  //开启二级缓存
public interface IUserDao {
}
文石NoteX3国行版安装 Google Play经验分享 文石NoteX3国行版安装 Google Play经验分享。 阅读详情

相关推荐

腾讯云CodeBuddy+微信小程序:5分钟开发番茄小闹钟

番茄钟是一种简单的时间管理方法。这个方法很简单:你专注工作25分钟,然后休息5分钟。这样可以让你更专心,不容易分心,还能防止过度疲劳。 很多人用番茄钟来提高工作效率,因为它能帮助你更好地管理时间。不过,市面上的一些免费番茄钟应用常常会有广告弹出来,影响使用体验。这就是为什么我们要开发一个没有广告的番茄钟小程序,让用户可以专心工作,不被打扰。

2201_75366661的博客 1689

buffer pool 及CRUD动态过程

mysql buffer pool 及CRUD动态过程

weixin_42751024的博客 360

ADS实战指南:负载牵引(Loadpull)在射频功放设计中的关键应用

本文深入解析了负载牵引(Loadpull)技术在射频功率放大器设计中的核心作用与实战方法。通过生动的比喻和详细的ADS软件操作指南,阐述了如何通过系统扫描负载阻抗,在史密斯圆图上绘制等功率线与等效率线,从而精准找到最优阻抗点,以平衡输出功率与效率,是应对5G等现代通信系统严苛要求的必备技能。

weixin_29198045的博客 602

Mybatis框架

Mybatis 是spring框架中用于提交数据的一个持久层框架。 它支持动态SQL、存储过程,以及高级映射(一对一,一对多)。降低SQL与程序代码的耦合。 导入Mybatis jar包 <!--mybatis依赖包--> <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybat

Mr_Jin的博客 2509

C# WinForm项目目录结构详解:从入门到精通(附常见问题解决方案)

本文详细解析了C# WinForm项目目录结构,从解决方案与项目基础结构到核心文件功能,再到关键目录解析,帮助开发者快速掌握WinForm项目组织方式。文章还提供了常见问题解决方案,如引用丢失、配置文件不生效等,是WinForm开发从入门到精通的实用指南。

dream的博客 647

具身智能端侧硬件选型实战:从算力需求到芯片对比与避坑指南

在边缘计算和嵌入式AI快速发展的今天,端侧智能设备的落地不再单纯比拼芯片的标称算力。TOPS数值只是初筛指标,真实的推理性能还受内存带宽、数据精度、稀疏性以及散热功耗等多重因素制约。理解不同视觉感知、决策规划与语言交互任务对算力的差异化需求,是选型的第一步。本文从技术原理出发,剖析了Jetson Orin、地平线征程、RK3588等主流平台的实测表现,并揭示了散热设计、供电链路与软件生态这三个极易被忽略的隐形瓶颈。通过完整的部署调优实录,展示了量化、缓存与电源模式优化如何提升端侧推理效率,为具身智能、无人车

weixin_29164185的博客 364

MyBatis框架

一、MyBatis 介绍MyBatis 是一款优秀的持久层框架,它支持自定义 SQL、存储过程以及高级映射。MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。持久化和ORM【1】持久化就是程序的数据,在瞬时状态(new)和持久状态(数据库等)之间的转化。通过数据库操作进行转化。

瞭望红尘的博客 2900

unity中简单全景搭建

全景场景能够直观的展现一部分区域的全貌,在全景场景中我们能360°观看周围的景象,仿佛自身就在这个场景中,在场景的外部,我们能发现场景就是一个密封的球体,我们是处在球体的内部观察周围,在球内部观察四周看到的都是球的内表面,所以我们看到的全景其实就是贴在密封球体内的一张全景图片。接下来要介绍的就是如何在unity中用一个球体来搭建全景场景。

qq_31791999的博客 3637

《MyBatis 全网最详精讲:从入门到实战,一篇吃透主流持久层框架!》

本文全面详解 MyBatis 核心架构、执行流程、配置文件、映射文件、动态 SQL等高频考点与实战技能。从基础搭建到实际应用,图文 + 代码双讲解,面试能答深、工作能落地,是 Java 开发必学、面试必问的核心框架,看完彻底告别只会用不会讲的尴尬!

8年 Java 全栈开发经验,专注于后端架构、JVM 优化与面试实战。用硬核源码解析 + 实战案例,帮你从基础到进阶,吃透 Java 核心。 1万+

基于YOLOv8/YOLOv7/YOLOv6/YOLOv5的田间杂草检测系统(深度学习模型+UI界面+Python代码+训练数据集)

精准农业是现代农业发展的核心方向,其中杂草的实时、准确检测是减少除草剂滥用、实现变量喷施的关键技术瓶颈。本文详细阐述了一套完整的、基于YOLO(You Only Look Once)系列目标检测算法的田间杂草检测系统。系统覆盖从模型对比选型(YOLOv5, YOLOv6, YOLOv7, YOLOv8)、自定义数据集构建与标注、模型训练与优化,到最终构建基于PyQt5/FastAPI/Gradio的可视化UI界面的全流程。本文提供了完整的Python代码、项目结构、训练技巧及公开数据集指引,旨在为农

YOLO 358

vue2/3 - 详细实现高德地图轨迹回放,vue高德地图车辆历史行驶轨迹播放,在地图上绘制行程轨迹|起点和终端的路程绘制|用户运动轨迹绘制及播放等(支持开始/暂停、进度条拖放、控制播放轨迹的倍速等)

vue2,vue3,nuxt,高德地图,轨迹,vue高德地图轨迹回放,历史轨迹回放,轨迹回放功能支持倍速及进度条拖拽,VUE高德地图轨迹回放、倍速调整、进度条拖拽,vue3高德地图轨迹回放,Vue实现地图路径回放,vue中使用高德地图实现历史轨迹回放并能控制播放轨迹的倍速,多条轨迹陆续播放,巡航轨迹做带进度条和倍速的轨迹回放,Vue高德地图路径回放,历史轨迹回放并能控制播放轨迹的倍速,使用高德地图实现轨迹播放和进度条控制,vue高德地图如何实现轨迹回放,高德地图做轨迹绘制用什么api,高德轨迹API,驾车轨

✅ 精选推荐文章 1万+

MyBatis总结

mybatis

qq_43728862的博客 645

从零开始跑通3DGS教程:(三)坐标系与尺度编辑(CloudCompare)

本文所属《从零开始跑通3DGS教程》系列文章; sfm重建的点云已经丢掉了尺度信息,并且坐标系跟图像数据有关(SFM初始化选择的图像),所以如果想恢复物理真实尺度,以及在想要的视角下渲染,那么需要对尺度和坐标系进行编辑修正,下文介绍如何使用CloudCompare修改坐标系和尺度

诺有缸的高飞鸟的博客 2872

MyBatis进阶(一)连接池 & 事务提交 & 动态 SQL 语句 & 延迟加载 & 缓存

MyBatis Mybatis 的连接池技术 1.1MyBatis连接池分类 在 Mybatis 中我们将它的数据源 dataSource 分为以下几类, 可以看出 Mybatis 将它自己的数据源分为三类: JNDI 使用 JNDI 实现的数据源 POOLED 使用连接池的数据源 UNPOOLED 不使用连接池的数据源 相应地,MyBatis 内部分别定义了实现了 java.sql.DataSource 接口的 UnpooledDataSource, Pool

Leessang 529

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

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

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

MyBatis使用动态SQL注解@SelectProvider、@InsertProvider、@UpdateProvider、@DeleteProvider

MyBatis 3.x 版本提供了以下4个CRUD的高级注解。 @SelectProvider:用于构建动态查询SQL。 @InsertProvider:用于构建动态新增SQL。 @UpdateProvider:用于构建动态更新SQL。 @DeleteProvider:用于构建动态删除SQL。 动态SQL注解主要用于编写动态SQL。这里以@SelectProvider为例,它主要包含两个注解属性,其中,type表示工具类,method表示工具类的某个方法(用于返回具体的SQL语句)。 【示例】使

pan_junbiao的博客 1万+

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

学习Mybatis框架总结

学习Mybatis框架(持久层框架)—介绍篇 1.1.1 什么是框架 框架(Framework)是整个或部分系统的可重设计,表现为一组抽象构件实例间交互的方法;另一种定义认为,框架是可被应用开发者定制的应用骨架。前者是从应用的方面,后者是从目的方面给出的定义。(半成品的应用) 三层架构—表现层,业务层,持久层 表现层:用于展示数据的 业务层:是处理业务需求 持久层:和数据库就行交互的 持久层技术的解决方案: JDBC技术: 1、Connection 2、PreparedStatement 3、Result

qq_36588953的博客 460

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

Mybatis学习笔记--延迟加载与缓存

本篇简单介绍了Mybatis中的延迟加载机制,如何使用一对一、一对多延迟加载,以及使用延迟加载时的相关参数配置。同时介绍了Mybatis中的缓存的概念,以及其相关的使用方法,一级缓存与二级缓存。

龙源IT 的博客 619

MyBatis-3

文章目录Mybatis中的连接池以及事务控制1.Mybatis中连接池使用2.Mybatis事务控制(自动提交事务)Mybatis动态SQL1.if标签2.where标签3.foreach标签以及include标签Mybatis中多表操作1.一对一1.IAccountDao接口2.Account实体类3.IAccountMapper.xml映射文件4.IAccountDaoTest测试2.一对多1.IUserDao接口2.User实体类3.IUserMapper.xml映射文件4.IUserDaoTest测

ginger_mr的博客 531

Hibernate MySQL MyBatis

十二、Hibernate 113.为什么要使用 hibernate? 1.对jdbc 访问数据库的代码进行了封装,大大简化了数据访问层繁琐的重复性代码。 2.Hibernate 是一个基于JDBC的主流持久化框架,是一个优秀的ORM实现,它很大程度的简化dao层的编码工作。 3.Hibernate 使用Java 反射机制,而不是字节码程序来实现透明性。 4.Hibernate 的性能非常好,因为它是一个轻量级框架,映射的灵活性很出色,它支持各种关系数据库,从一对多到多对多的各种复杂关系。 详细可

Soup's Blog 1930

【ssm入门#4-MyBatis】延迟加载(一对一、一对多)+缓存机制(一级缓存、二级缓存)+注解开发(CRUD、属性映射、一对一、一对多、接口中注解开启二级缓存)+IDEA:找不到主类错误

延迟加载 一对一: 在MyBatis中,一对一的实现是靠<association>标签实现的,设置第二步查询的入口属性column赋予参数,传递给select此属性指向的从表实体类的操作方法,即可实现。还要注意延迟加载<configuration> 下<environments>标签前设置延迟加载开关: <settings> <setting name="lazyLoadingEnabled" value="true"/>

Jelly_Bean的博客 258

Mybatis相关知识点

本文主要讲解了Mybatis的相关知识点

m0_74306775的博客 876

Mybatis框架学习笔记(04)

目录Mybatis基于注解的开发01Mybatis的常用注解02使用Mybatis注解实现CRUD2.1 新建maven工程(Mybatis)2.2 数据库还是使用之前的数据库2.3 编写实体类(User.java)2.4 编写 SqlMapConfig 配置文件2.5db.properties和log4j.properties2.6 使用注解方式配置持久层接口(重点在这里)2.7编写测试类(UserTest.java)03使用注解完成复杂的映射关系以及实现延时加载3.1复杂映射关系的说明3.2 复杂映射关

529

从零开始重新认识 MyBatis

第一次接触MyBatis框架还是在半年前,当时第一次用的时候觉得真爽啊,不用自己封装工具类了,也不用自己管理数据库连接了,而且性能也提高了不少。但是后来在开发中逐渐接触到更多的框架之后,比如 MyBatisPlus 以及 JPA 等,发现这些框架更牛,省去了最基本的CRUD,于是就去使用那些更能提高开发效率的框架了,到现在前前后后也有半年没碰这个框架了,很是惭愧,现在忘得一干二净了,今天花了一天的时间回顾了一下 MyBatis 的基本操作,以及底层原理,被该框架所使用到的设计模式以及思想所折服。太强了,每.

WS的小屋 485

MyBatis删除操作全解析

冲突率优化98.4%(3.2%→0.0052%)RTO提升90%(45分钟→5分钟)可维护性100%自动化(Nacos配置管理)日均处理量达120万+(阿里云金融场景验证)完整技术方案已通过JMeter压测(QPS>450万/秒)、灾备演练(RTO<5分钟)和客户验证(日均处理120万+操作),满足电商高并发场景的核心需求。模块关键内容数据/效果技术参数/机制冲突场景分类脏读(QPS>500时冲突率3.2%)、死锁(跨服务调用压测3次)、超时失效(平均2.1s)

我是Java程序员廖志伟,感谢朋友们的支持! 516

SpringBoot校园二手交易平台:从环境搭建到业务扩展的完整实践指南

Web应用开发的核心在于理解从概念到实现的完整路径。SpringBoot作为Java领域主流的快速开发框架,通过约定优于配置的理念简化了项目搭建过程。其核心原理是基于Spring生态的自动配置和起步依赖,能够快速整合MyBatis-Plus、Thymeleaf等常用组件,显著提升开发效率。在技术价值层面,SpringBoot不仅解决了传统SSH/SSM框架配置繁琐的问题,更通过内嵌容器实现了应用的一键部署,为微服务架构奠定了基础。典型的应用场景包括企业级后台管理系统、电商平台以及各类信息展示系统。本文以校园

chuannaoxuan4674的博客 358
上一篇: SpringMVC简介(常用注解,拦截器,异常处理)
下一篇: Spring IOC,AOP,事务和JDBC Template操作
Java-fly
博客等级 码龄9年 13粉丝 31原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值