mybatis:基于xml的环境搭建

前期准备

创建好数据库表对应的实体类----实体类最好实现序列化接口Serializable

创建好实体类对应的dao层接口----每一个实体类都会对应一个dao接口,每一个dao接口也都对应一个配置文件!

  • mybatis中,约定俗成地将持久层的操作接口和对应的映射文件的名称叫做XxxMapper,即IUserMapper.java和IUserMapper.xml。
  • mybatis中dao接口映射文件的包结构必须和对应dao接口的包结构相同,配置文件的名称和接口名称也要保持一致。

1,导入依赖

<dependencies>
    <!-- mybatis本身的依赖jar包 -->
    <dependency>
        <groupId>org.mybatis</groupId>
        <artifactId>mybatis</artifactId>
        <version>3.4.5</version>
    </dependency>
    <!-- mysql数据库的依赖jar包 -->
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>5.1.6</version>
    </dependency>
    <!--日志的依赖jar包,通常还需要配合log4j的配置文件使用-->
    <dependency>
        <groupId>log4j</groupId>
        <artifactId>log4j</artifactId>
        <version>1.2.17</version>
    </dependency>
    <!--测试类的依赖jar包,用于junit测试-->
    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>4.12</version>
    </dependency>
    ……
</dependencies>

2、主配置文件

该文件用于配置mybatis的环境以及连接。在main的resources下创建一个xml文件,名称任意,一般约定俗成地叫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"/>
            <!--配置数据源,也就是连接池
            POOLED表示使用连接池,采用传统的javax.sql.DataSource规范中的连接池,mybatis中有针对规范的实现。
            UNPOOLED表示不使用连接池,用的是传统获取连接的方式-->
            <dataSource type="POOLED">
                <!--配置连接数据库的四个基本信息-->
                <property name="driver" value="com.mysql.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://localhost:3306/day22"/>
                <property name="username" value="root"/>
                <property name="password" value="root"/>
            </dataSource>
        </environment>
    </environments>

    <!--指定dao接口映射配置文件的位置-->
    <mappers>
        <!--注意,此处的路径在书写时不会有任何提示-->
        <mapper resource="com/zhanpeng/dao/IUserDao.xml"/>
    </mappers>
</configuration>

 另外也可以将数据库的连接信息放在外部properties文件中,然后再读取,在configuration标签下添加如下配置

<properties resource="jdbcConfig.properties"/>
结束-----------------------------------------------
<--然后再引用-->
……
<!--引用连接数据库的四个基本信息,注意这里的引用和文件中的key名保持一致-->
<property name="driver" value="${driver}"/>
<property name="url" value="${url}"/>
<property name="username" value="${username}"/>
<property name="password" value="${password}"/>
……

给实体类取别名

在接口的映射配置文件中,有很多地方需要用到全类名,我们可以在主配文件中给全类名取别名。一旦取了别名,将不再区分大小写。

<!--在configuration标签下配置,且必须在environments之前-->
<!--该标签只能为实体类配置别名-->
<typeAliases>
    <typeAlias type="com.zhanpeng.domain.User" alias="user"/>
</typeAliases>

<!-- 上面的方式一次只能为一个全类名取别名,我们还可以在<typeAliases>中
定义package标签,为整个domain包都配置别名,如下:-->
<typeAliases>
    <!-- 此时类名就是别名 -->
    <package name="com.zhanpeng.domain"/>
</typeAliases>

在<mappers>标签中,也可以定义package标签,用于指定dao接口以及对应配置文件所在的包(二者的包结构是一样的),和使用mapper标签指定路径是一样的效果。

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

3、配置dao接口映射文件

<?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">

<!--命名空间用于指定dao接口的全类名-->
<mapper namespace="com.zhanpeng.dao.IUserDao">
    <!--配置方法的名称,参数以及返回值类型
        以及对应执行的sql语句
    -->
    <select id="findAll" resultType="com.zhanpeng.domain.User">
        SELECT * FROM USER;
    </select>     
</mapper>

补充说明

框架需要通过【接口全类名+方法名】来定位【唯一的sql语句以及返回值类型】,实际上底层是以键值对的方式来存储的。

实体类属性名和表字段名不一致

如果【实体类属性名和表字段名不一致】,会影响到查询语句的返回值封装,有两种解决方案

1、在定义sql语句时,给每个变量取别名,让此别名和成员变量名保持一致。(查询时星号的地方写全),这是在sql的层面上解决问题,效率较高。但是一旦查询语句很多时就会很麻烦。

2、在接口对应的映射文件中的mapper标签下添加映射的配置:

<--id是唯一标识,保证唯一即可
type是要对应的实体类的全类名
-->
<resultMap  id="userMap" type="com.zhanpeng.domain.User">
    <!--主键的对应-->
    <id property="userId" column="id"></id>
    <!--非主键的对应-->
    <result property="userSex" column="sex"></result>
    ……
</resultMap>


在方法实现中的返回值属性不能再用resultType,而是要改成resultMap,来指定映射关系的唯一id标识,比如:
<!--配置查询所有-->
<select id="findAll" resultMap="userMap">
    SELECT * FROM USER;
</select>
这种方式虽然效率相对较低,但是只用定义一次,接口中所有的方法都能用。

延迟加载的配置

数据查询的时机

  • 延迟加载:在真正使用数据时才发起查询,不用的时候不查询。属于按需加载(懒加载)
  • 立即加载:不管用不用,只要一调用方法,马上就发起查询。

在对一查询时,mybatis默认是立即加载;对多查询时,默认是延迟加载。

比如修改对一查询为延迟加载,在主配置文件中配置开启

<settings>
    <!--配置立即加载还是延迟加载,mybatis3.4.1版本后默认就是false,表示允许延迟加载,可省略该配置-->
    <setting name="aggressiveLazyLoading" value="false"></setting>
    <!--允许延迟加载后是否开启延迟加载-->
    <setting name="lazyLoadingEnabled" value="true"></setting>
</settings>

然后在接口的映射配置文件中配置查询所有,并且去掉关联的从表的对应信息,在association标签中添加select属性,该属性值为从表对应接口中按id查询的语句的唯一标识,即全类名+方法名。

<mapper namespace="com.zhanpeng.dao.AccountMapper">
    <resultMap id="userAccount" type="Account">
        <id property="aid" column="aid"></id>
        <result property="uid" column="uid"></result>
        <result property="money" column="money"></result>
        <!--配置延迟加载,column在此时不可省略。为约束的外键-->
        <association property="user" column="uid" javaType="user" select="com.zhanpeng.dao.UserMapper.findById"></association>
    </resultMap>
    <!--配置查询所有账户-->
    <select id="findAll" resultMap="userAccount">
        SELECT * FROM account;
    </select>
</mapper>

二级缓存的配置

在主配置文件中的settings标签下配置支持二级缓存;这一步可省略,因为默认值就是true。

<setting name="cacheEnabled" value="true"></setting>

在接口的映射配置文件中添加<cache/>配置其支持二级缓存

让当前操作支持二级缓存,即在select标签中添加useCache属性=true,使其支持二级缓存

<mapper namespace="com.zhanpeng.dao.UserMapper">
    <!--开启支持二级缓存-->
    <cache/>
    <!--配置根据id查询用户-->
    <select id="findById" parameterType="INT" resultType="User" useCache="true">
        SELECT * FROM USER WHERE id=#{uid};
    </select>
</mapper>

示例参考:https://blog.csdn.net/weixin_43111386/article/details/98763206

几点说明:

  1. 在sql语句中推荐使用#{paraName}获取引用的值
  2. 当参数是一个基础类型的时候,参数名paraName任意,此时只是充当一个占位符而已
  3. #{}和${}引用值的区别如下:
发布了70 篇原创文章 · 获赞 1 · 访问量 2262

猜你喜欢

转载自blog.csdn.net/caozp913/article/details/103605871
今日推荐