• MyBatis入门学习笔记


    SqlMapConfig.xml下的配置:

    配置内容和顺序:

    • properties(属性)
      • property
    • setting(全局参数设置)
    • typeAliases(类型别名)
    • typeHandlers(类型处理器)
    • objectFactory(对象工厂)
    • plugins(插件)
    • environments(环境信息集合)
      • environment(单个环境信息)
        • transactionManager(事务)
        • dataSource(数据源)
    • mappers(映射器)

    properties:属性

    1. 可用于加载配置文件
      • 属性:
        • resource:配置文件地址
    2. 可修改某个配置属性
      • property
        • name:属性名称
        • value:属性值
    3. 加载的顺序
      • 先加载properties中property标签声明的属性
      • 再加载properties标签引入的配置文件中的属性,覆盖与property标签中相同的属性
      • parameterType的值会和properties的属性值发生冲突(最后读取parameterType传递的属性?)
    • 建议:如果引入配置文件,就尽量不要再property中声明属性

    typeAliases:类型别名

    1. 在SqlMapConfig的xml中可以为某个类的全限定名设置一个别名,在设置完之后可以使用别名而不使用全限定名称。
    2. 此处的别名可按单个类进行定义,也可按一个包进行定义,按包定义后,默认的别名是类名,首字母大小写均可

    MyBatis自带支持的别名:

    别名映射的类型
    _byte byte
    _long long
    _short short
    _int int
    _integer int
    _double double
    _float float
    _boolean boolean
    string String
    byte Byte
    long Long
    short Short
    int Integer
    integer Integer
    double Double
    float Float
    boolean Boolean
    date Date
    decimal BigDecimal
    bigdecimal BigDecimal

    mappers:映射

    1. 属性:
      • resource:使用相对于类路径的资源
      • url:使用完全限定路径
      • class:使用mapper接口的全限定名。注意:此种方法要求mapper接口和mapper映射文件要名称相同,且放到同一个目录下
    2. 标签:
      • package:注册指定包下的所有映射文件。注意:此种方法要求mapper接口和mapper映射文件要名称相同,且放到同一个目录下
    3. 完成mapper文件的编写后,必须要在SqlMapConfig.xml下进行加载

    Mapper代理:

    在使用MyBatis的命名sql时 除了用字符串调用指定名称的sql外,还可以通过mapper代理的方式来调用sql,但是需要按照规范进行开发:

    1. mapper接口的全限定名要和mapper映射文件的命名空间一致
    2. mapper接口的方法名要和mapper映射文件的statement的id一致
    3. mapper接口的传入参数要和mapper映射文件的statement中的parameterType的值一致,且它的参数是一个
    4. mapper接口的方法返回值要和mapper映射文件的statement中的resultType的值一致(如果返回的是集合 则泛型要一致)

    注意:Mapper代理使用的是jdk的代理策略

    映射文件下的配置

    基本语句

    select

    1. parameterType: 传入参数 可以为基本类型也可以为Bean类型
    2. parameterMap: 传入映射参数,过时了 官方文档都表示将来可能删除
    3. resultType: 传出参数 可以为基本类型
    4. resultMap: 传出结果映射,当查询结果有多个对象时使用,可以将查询结果封装为对象,需要先声明一个resultMap的配置

    insert

    • selectKey标签:查询主键,在标签内需要输入查询主键的sql。(用处:可以编写在insert语句发生后回传主键的sql,也可以编写在insert语句发生前传入主键的sql)
      • 属性:
        1. order:相对于insert语句来说,指定查询主键的sql和insert语句的执行顺序
        2. resultType:该标签下sql的返回类型

    #{}和${}区别

    • #{}表示占位符?,#{}接收简单类型时,大括号内的变量可以是任意值
    • ${}表示拼接符,${}接收简单类型时,大括号内的变量必须是value,且传入的值会原样输出,但是存在sql注入风险

    动态SQL

    标签

    sql

    表示sql片段。可以让代码有更高的复用性,需要先定义后使用。在需要使用时 引用以下代码:

    <include refid="sql片段id"></include>
    

    foreach

    可以循环传入参数值(传入值应为一个集合)

    where

    默认去掉后面第一个AND,如果没有参数会自动删除WHERE关键字

    if

    可以对输入的参数进行判断

    实际运行Demo

    主运行程序

    public static void main(String[] args) {
        //获取配置文件的路径
        String resource="SqlMapConfig.xml";
        //加载配置文件
        InputStream inputStream = Resource.getResourceAsStream(resource);
        //创建session工厂 工厂建议只创建一次
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().builder(inputStream);
        
        //打开session
        SqlSession session = sqlSessionFactory.openSession();
        //通过Mapper代理方式,根据用户id查询用户信息
        Mapper userMapper = session.getMapper(User.class);
        User userByMapper = userMapper.findUserById(1);
        //通过字符串调用指定sql语句的方式
        User userByStr = session.selectOne("com.mybatis.mapper.UserMapper.findUserById", "1");
        System.out.println(userByMapper);
        //关闭session
        session.close();
    }
    

    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">
    <configuration>
    	<properties resource="db.properties">
    	</properties>
    	<!-- 配置别名 -->
    	<typeAliases>
    		<typeAlias alias="User" type="com.mybatis.domain.User"></typeAlias>
    	</typeAliases>
    	<environments default="development">
    		<environment id="development">
    			<transactionManager type="JDBC" />
    			<dataSource type="POOLED">
    				<property name="driver" value="${db.driver}" />
    				<property name="url" value="${db.url}" />
    				<property name="username" value="${db.username}" />
    				<property name="password" value="${db.password}" />
    			</dataSource>
    		</environment>
    	</environments>
    	<mappers>
    		<mapper resource="com/mybatis/mapper/UserMapper.xml" />
    	</mappers>
    </configuration>
    

    db.properties配置文件

    db.driver=com.mysql.jdbc.Driver
    db.url=jdbc:mysql://127.0.0.1:3306/ee19_crmdb
    db.username=root
    db.password=8469
    

    UserMapper.xml配置文件 (需与UserMapper.java放在同一包下)

    <?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.mybatis.mapper.UserMapper">
    	<select id="findUserById" parameterType="string"
    		resultType="com.mybatis.domain.User">
    		select * from user where id = #{id}
    	</select>
    	<select id="findUsersByCondition" parameterType="User"
    		resultType="User">
    		select * from user
    		<where>
    			<if test="user != null">
    				<if test="username != null and username != ''">
    					AND username LIKE '%${username}%'
    				</if>
    				<if test="sex != null and sex != ''">
    					AND sex = #{sex}
    				</if>
    			</if>
    		</where>
    	</select>
    	<insert id="insertUser" parameterType="User">
    		<!-- 如果没有这段代码 则不会将id设置给插入的user对象 -->
    		<selectKey keyProperty="id" resultType="int" order="AFTER">
    			SELECT
    			LAST_INSERT_ID()
    		</selectKey>
    		INSERT INTO USER
    		(username,birthday,sex,address)
    		VALUES(#{username},#{birthday},#{sex},#{address})
    	</insert>
    </mapper>
    

    MyBatis与Hibernate对较

    Mybatis技术特点:

    1. 通过直接编写SQL语句,可以直接对SQL进行性能的优化;
    2. 学习门槛低,学习成本低。只要有SQL基础,就可以学习mybatis,而且很容易上手;
    3. 由于直接编写SQL语句,所以灵活多变,代码维护性更好。
    4. 不能支持数据库无关性,即数据库发生变更,要写多套代码进行支持,移植性不好。

    Hibernate技术特点:

    1. 标准的orm框架,程序员不需要编写SQL语句。
    2. 具有良好的数据库无关性,即数据库发生变化的话,代码无需再次编写。
    3. 学习门槛高,需要对数据关系模型有良好的基础,而且在设置OR映射的时候,需要考虑好性能和对象模型的权衡。
    4. 程序员不能自主的去进行SQL性能优化。
  • 相关阅读:
    GRUB2 分析 (三)
    GRUB2 分析 (二)
    快速填充像素的方法
    GRUB2 分析 (一)
    自制Linux映像和发行版Robomind
    为MarS Board安装无线网卡Linux驱动
    alsa音频播放过程中的基本概念
    常见Soc平台图形内存管理学习笔记
    snprintf笔记
    linux命令行配置wifi连接并通过ssh代理开启socks代理
  • 原文地址:https://www.cnblogs.com/runningRookie/p/11108782.html
Copyright © 2020-2023  润新知