文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

MyBatis配置与CRUD超详细讲解

2023-02-21 12:02

关注

namespace:命名空间 必须绑定一个对应Mapper接口

使用全限定名: com.yuqu.Dao.UserMapper

id:对应上面的Mapper接口下面的某一方法名

resultType:表示返回结果类型 如:com.yuqu.pojo.User

parameterType:参数类型,基本数据类型通常忽略不写

CRUD增删改查

增删改切记提交事务:sqlSession.commit();

在确保已经配置好了mybatis-config.xml核心配置文件之后,我们每次需要操作sql时,就只需要操作接口UserMapper和UserMapper.xml配置文件即可

示例代码

UserMapper.xml

<mapper namespace="com.yuqu.dao.UserMapper">
    <select id="getUserList" resultType="com.yuqu.pojo.User">
        select * from testmybatis.tb_user;
    </select>
    <select id="getUserById" parameterType="int" resultType="com.yuqu.pojo.User">
        select * from testmybatis.tb_user where id = #{id};
    </select>
    <insert id="insertUser" parameterType="com.yuqu.pojo.User">
        insert into testmybatis.tb_user (id,username,password,gender,addr) values(#{id},#{username},#{password},#{gender},#{addr});
    </insert>
    <update id="updateUser" parameterType="com.yuqu.pojo.User">
        update testmybatis.tb_user set username=#{username},password=#{password},gender=#{gender},addr=#{addr} where id = #{id};
    </update>
    <delete id="deleteUser" parameterType="int">
        delete from testmybatis.tb_user where id = #{id};
    </delete>
</mapper>

Test代码(仅以添加为例)

    @Test
    public void testInsertUser(){
        // 获取SqlSession
        SqlSession sqlSession = MyBatisUtils.getSqlSession();
        // 执行sql
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
        int res = mapper.insertUser(new User(4, "赵六", "1234", '妖', "郑州"));
        if (res > 0){
            System.out.println("插入成功!");
            // 增删改必须提交事务
            sqlSession.commit();
        }
    }

Map传参

上述UserMapper.xml所示,如果参数过多时,当我们进行添加操作或者修改操作就会非常麻烦。所以,可以优化采用Map来进行可选参数。以查询用户selectUser为例:

// UserMapper接口
// 查询用户 Map入参 简单实现模糊查询
    int selectUser2(Map<String,Object> map);
// UserMapper.xml
<select id="selectUser2" parameterType="map" resultType="com.yuqu.pojo.User">
        select * from testmybatis.tb_user where username = #{helloName};
    </select>
// @Test
@Test
    public void testSelectUser2(){
        SqlSession sqlSession = MyBatisUtils.getSqlSession();
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
        Map<String, Object> map = new HashMap<String, Object>();
        map.put("helloName","顺子");
        User user = mapper.selectUser2(map);
        System.out.println(user);
        sqlSession.close();
    }

map传递参数,可以直接在sql中获取key,实现定制化参数

对象传递参数,直接在sql中取出sql的对象属性。但要保证字段名相同

基本数据类型时直接在sql中获取

模糊查询

// UserMapper
// 模糊查询用户
    List<User> getUserLikeList(String value);
// UserMapper.xml
<select id="getUserLikeList" resultType="com.yuqu.pojo.User">
        select * from testmybatis.tb_user where username like #{value};
    </select>

还有一种方式就是直接把sql固定写死,获取用户输入的一个稳定的值

select * from testmybatis.tb_user where username like "%"#{value}"%";

MyBatis配置解析

核心配置文件mybatis-config.xml

参考mybatis官网给出的配置信息:

configuration(配置)
    properties(属性)
    settings(设置)
    typeAliases(类型别名)
    typeHandlers(类型处理器)
    objectFactory(对象工厂)
    plugins(插件)
    environments(环境配置)
        environment(环境变量)
            transactionManager(事务管理器)
            dataSource(数据源)
    databaseIdProvider(数据库厂商标识)
    mappers(映射器)

环境变量(Environments)

mybatis可以配置多种环境,但每个sqlSessionFactory智能选择一个环境

一个数据库对应一个SqlSessionFactory

我们可以在environments元素下配置多个环境environment,每个环境都需要设置单独的id,当我们需要用到哪一个的时候就需要将default设置为哪一个环境的id

<environments default="development"><environments>

environments下包含

事务管理器transactionManger

<transactionManager type="JDBC">
  <property name="skipSetAutoCommitOnClose" value="true"/>
</transactionManager>

事务管理器不仅有JDBC一种,还有一种 MANAGED

<transactionManager type="MANAGED">
  <property name="closeConnection" value="false"/>
</transactionManager>

MyBatis官网提示: 如果你正在使用 Spring + MyBatis,则没有必要配置事务管理器,因为Spring 模块会使用自带的管理器来覆盖前面的配置

数据源DataSource

之前学过的比如dbcp、c3p0、druid等等。用于连接数据库

mybatis内置了三种数据源:type="[UNPOOLED|POOLED|JND]"

UNPOOLED:表示无池连接,用完即销毁

POOLED:有池连接,用完后回收等待下次使用。(默认情况使用)

JND:表示正常连接

属性(Properties)

属性可以通过外部文件配置,也可以在Properties的子元素当中配置,在Properties子元素配置如下示例:

<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://localhost:3306/mybatis?useSSL=true&amp;useUnicode=true&amp;characterEncoding=UTF-8&amp;serverTimezone=UTC"/>
                <property name="username" value="root"/>
                <property name="password" value="123456"/>
            </dataSource>
        </environment>
    </environments>

也可以通过典型的Java属性文件进行配置,比如db.properties文件

driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/mybatis?useSSL=true&;useUnicode=true&;characterEncoding=UTF-8&;serverTimezone=UTC
username=root
password=123456

最后价格文件用properties标签引入到mybatis-config.xml中,环境则更改为初始形式

<!--  引入外部资源  -->
    <properties resource="db.properties" />
<environments default="development">
        <environment id="development">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                <property name="driver" value="${driver}"/>
                <property name="url" value="${url}"/>
                <property name="username" value="${username}"/>
                <property name="password" value="${password}"/>
            </dataSource>
        </environment>
    </environments>

通过官网可以知道,我们也可以将db.properties中的配置信息只写一半,另一半在引入的同时用双标签闭合,在其中用properties的子标签property重新引入即可

<properties resource="db.properties" >
        <property name="username" value="root"/>
        <property name="password" value="123456"/>
    </properties>

如果同时存在于外部文件和property中,优先使用外部文件的配置信息

类型别名(typeAliases)

typeAliases用于简化全限定名的书写,仅限于在xml中配置

指定全限定类名别名:

<typeAliases>
   <typeAlias type="com.yuqu.pojo.User" alias="user" />
</typeAliases>

type代表全限定名,将其映射为一个简化名称 user。如上所示在需要用到com.yuqu.pojo.User的地方就可以替换成user

指定包名配置

<typeAliases>
   <package name="com.yuqu.pojo"/>
</typeAliases>

经此配置后,mybatis会自动查找在com.yuqu.pojo下的所需Java Bean。

在没有对实体类添加注解用法:默认使用Bean的首字母小写的非限定类名来作为它的别名

添加注解的用法:

@Alias("hello")
public class User {
    //...
}

接下来就可以在任何要用com.yuqu.pojo.User的地方使用hello代替

建议在实体类较少的情况下使用第一种指定全限定类名的别名

实体类较多时可以使用指定包名配置

其他的Java类型内建的别名可以参考MyBatis官网

映射器(mappers)

在定义sql映射语句之前,首先我们要告诉mybatis去哪里获取这些语句。这个时候就需要用到映射器mappers,mybatis根据映射的路径去找到对应的文件或者接口再去执行sql语句

映射器使用一:使用相对于类路径的资源引用(建议使用)

<mappers>
  <mapper resource="org/mybatis/builder/PostMapper.xml"/>
</mappers>
    // 如果将Mapper文件直接放在resource下就可以改成
<mappers>
  <mapper resource="PostMapper.xml"/>
</mappers> 

映射器使用二:使用class文件的完全限定类名

<mappers>
	<mapper class="org.mybatis.builder.PostMapper" />
</mappers>

映射器使用使用三:将包内的映射器接口全部注册为映射器

<mappers>
  <package name="org.mybatis.builder"/>
</mappers>

生命周期和作用域

错误的使用生命周期和作用域会导致非常严重的并发问题

SqlSessionFactoryBuilder:

SqlSessionFactory:

SqlSession:

到此这篇关于MyBatis配置与CRUD超详细讲解的文章就介绍到这了,更多相关MyBatis配置与CRUD内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯