Mybatis-02 相关配置文件标签&执行过程

第一章 基于代理Dao实现CRUD

要求:
    1. 映射文件和持久层接口在同一包下
    2. 映射文件的namespace属性必须是持久层的全限定类名
    3. Sql语句标签的id和持久层方法名必需相同

1.1 主配置文件

1.1.2 sqlMapConfig.xml配置的内容和顺序

![](https://img2018.cnblogs.com/blog/1882316/202002/1882316-20200208003728488-2089408284.png)

properties标签:引用外部的配置文件来配置连接数据库信息。
    resource属性:用于指定配置文件的位置,类路径的写法。
    url属性:指按照url的写法来写地址。
    URL:Uniform Resource Locator 统一资源定位符。它是可以唯一标识一个资源的位置。
    它的写法:
        http://localhost:8080/mybatisserver/demo1Servlet
        协议      主机     端口       URI
        URI:Uniform Resource Identifier 统一资源标识符。它是在应用中可以唯一定位一个资源的。

typeAliases标签:用于配置别名
    type属性:指定的是实体类全限定类名
    alias属性:指定别名
    packeage标签:指定配置别名的包,配置后报下的实体类都注册别名,且类名就是别名。
        name属性:指定包

mappers标签:
    mapper标签:
        resource属性:使用相对于类路径的资源
        class属性:使用mapper接口类路径 
        package属性:指定dao接口所在的包

<?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 url="file:///D:/IdeaProjects/day02_eesy_01mybatisCRUD/src/main/resources/jdbcConfig.properties">
       <!-- <property name="driver" value="com.mysql.jdbc.Driver"></property>
        <property name="url" value="jdbc:mysql://localhost:3306/eesy_mybatis"></property>
        <property name="username" value="root"></property>
        <property name="password" value="1234"></property>-->
    </properties>

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

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

    <!--配置环境-->
    <environments default="mysql">
        <!-- 配置mysql的环境-->
        <environment id="mysql">
            <!-- 配置事务 -->
            <transactionManager type="JDBC"></transactionManager>

            <!--配置连接池-->
            <dataSource type="POOLED">
                <property name="driver" value="${jdbc.driver}"></property>
                <property name="url" value="${jdbc.url}"></property>
                <property name="username" value="${jdbc.username}"></property>
                <property name="password" value="${jdbc.password}"></property>
            </dataSource>
        </environment>
    </environments>
    <!-- 配置映射文件的位置 -->
    <mappers>
        <!--<mapper resource="com/itheima/dao/IUserDao.xml"></mapper>-->
        <!-- package标签是用于指定dao接口所在的包,当指定了之后就不需要在写mapper以及resource或者class了 -->
        <package name="com.itheima.dao"></package>
    </mappers>
</configuration>

2.映射文件

2.1 约束信息:

<?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.itheima.dao.IUserDao">

2.2 相关标签

2.2.1 保存:

    select标签:
        id属性:与接口方法名相同
        resultType属性:指定结果集类型
        parameterType属性:指定传入参数类型
sql 语句中使用#{}字符:(Mybatis要求写法) 
        #{}代表占位符,相当于jdbc的?,用于执行语句时代替数据,具体数据由里面内容决定。
    #{}写法:
        通过get方法,mybatis通过反射拿到它的值,所以值应该和生成的get方法后面的相同。如getUserName --> #{username}
        传递javabean对象时,mybatis使用的是ognl表达式解析对象字段值:
            他是apache提供的一种表达式语言,Object Graphic Navigation Language 对象图导航语言 
            他是按照一定语法格式来获取数据的,语法格式就是#{对象.属性}的方式。即:类中的写法:user.getUsername();OGNL表达式写法:user.username
	mybatis中为什么能直接写username,而不用user.呢:
		因为在parameterType中已经提供了属性所属的类,所以此时不需要写对象名。

        如果只有一个参数,且时int或者别的基本类型,里面的值可以随便写。即#{aaa} #{id} 都是可以的。

如: 
<insert id="saveUser" parameterType="com.sweetbetter.domain.User">
    insert into user(username,sex,address) values(#{username},#{sex},#{addresss})
</insert>

    如果id是自动增长的,想要获取自动增长的id:
    用到selectKey标签:keyColumn列明对应表的,keyProperty对应实体类的,order什么时候执行
    select last_insert_id(); 获取最后一次插入的id

    <insert id="saveUser" parameterType="com.sweetbetter.domain.User">
    <selectKey keyProperty="id" keyColumn="id" resultType="int" order="AFTER"> <!--会将获取到的id值保存到传入的那个user中-->
    insert into user(username,sex,address) values(#{username},#{sex},#{addresss})
</insert>

2.2.2模糊查询

    第一种:
    <select id="findByName" resultType="com.sweetbetter.domain.User" parameterType="string">
    select * from user where username like #{username}
    </select>
![](https://img2018.cnblogs.com/blog/1882316/202002/1882316-20200207233616633-425856964.png)
    此时,调用时传入的参数需要添加%
    
    第二种:
    <select id="findByName" resultType="com.sweetbetter.domain.User" parameterType="string">
    select * from user where username like '%${value}%'
    </select>  
    不同的是,#{}改为了${value},**注意value是固定的**
![](https://img2018.cnblogs.com/blog/1882316/202002/1882316-20200207233817066-653847129.png)
    
    #{}和${}的区别:
    通过#{}可以实现 preparedStatement向占位符中设置值,自动进行java类型和jdbc类型转换,防止sql注入。
    ${}表示拼接 sql 串,通过${}可以将 parameterType 传入的内容拼接在 sql中且不进行 jdbc 类型转换, ${}可以接收简 单类型值或 pojo 属性值,如果 parameterType 传输单个简单类型值,${}括号中只能是 value。 

2.2.3 删除

<delete id="deleteUser" parameterType="int">
    delete from user where id = #{id}
</delete>

2.2.4 resultType&parameterType&resultMap细节

parameterType:
基本类型和String我们可以直接写类型名称,也可以使用包名.类名的方式,例如:java.lang.String。
是因为mybaits在加载时已经把常用的数据类型注册了别名,从而我们在使用时可以不写包名。
resultType:
现在只有实体类中的属性名称必须和查询语句中的列名保持一致才能封装,但通过设置resultMap可以设置或者sql语句用as设置别名。
resultMap设置别名:

<!--type属性:指定实体类的全限定类名
id属性:给定一个唯一标识,是给查询select标签引用用的-->
<!--id标签:用于指定主键字段
result 标签:用于指定非主键字段
    column属性:用于指定数据库列名 
    property属性:用于指定实体类属性名称
-->
<resultMap type="com.sweetbetter.domian.User">
    <id column="id" property="userId" />
    <result column="username" property="userName" />
   <result column="address" property="userAddress" />
</resultMap>
<!-- 配置查询所有操作 --> 
<select id="findAll" resultMap="userMap">  
select * from user 
</select>

ps:它和parameterType一样,如果注册过类型别名的,可以直接使用别名。
mysql中windows系统中不区分大小写

3.源码分析mybatis运行过程

posted @ 2020-02-10 21:12  sweetbetter  阅读(177)  评论(0)    收藏  举报