Mybatis 学习笔记+心得

1.作用:java的持久层框架,解决实体和数据库的映射问题

2.导包

<dependency>
    <groupId>org.mybatis</groupId>
    <artifactId>mybatis</artifactId>
    <version>3.4.6</version>
</dependency>

3.两种方式:xml配置文件和注解,同一接口只能用一种

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.xmz.dao.IUserDao">
    <!--配置查询结果的列名和实体类的属性的对应关系-->
    <resultMap id="userAccountMap" type="user">
        <!-- 取完别名后可用<resultMap id="userMap" type="user">-->
        <!--主键字段的对应-->
        <id property="id" column="id"></id>
        <!--非主键字段的对应-->
        <result property="username" column="username"></result>
        <result property="address" column="address"></result>
        <result property="sex" column="sex"></result>
        <result property="birthday" column="birthday"></result>
        <!--配置user对象中accounts集合的映射-->
        <collection property="accounts" ofType="account" select="com.xmz.dao.IAccountDao.findAccountById" column="id">
<!--            <id column="id" property="id"></id>-->
<!--            <result column="uid" property="uid"></result>-->
<!--            <result column="money" property="money"></result>-->
        </collection>
    </resultMap>

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

注解:常用这种方式,更加便捷

    @Select("select * from manager ")
    @Results(id = "managerMap", value = {
            @Result(id=true, column = "id", property = "id"),//id指示主键
            @Result(column = "name", property = "name"),
            @Result(column = "password", property = "password"),
    })
    List<Manager> findAll();

    @Select("select * from manager where id = #{id} ")
    @ResultMap(value = {"managerMap"})   //@ResultMap("managerMap")
    List<Manager> findById(int id);

//    @Select("select * from user where username like '%${value}%' ")
    @Select("select * from manager where name like #{name} ")
    @ResultMap("managerMap")
    List<Manager> findByName(String username);

4.总的环境配置: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可以在内部配置连接数据库的信息,也可以通过属性引用外部配置文件信息
        resources属性:指定配置文件路径,按照类路径来写,并且必须存在于类路径下
        url属性:要求按照url写法来写地址(和resources效果一样)
            url=协议+主机+端口+URI
    -->
    <properties resource="jdbcConfig.properties">
        <!--
        <property name="driver" value="com.mysql.jdbc.Driver"/>
        <property name="url" value="jdbc:mysql://localhost:3306/mybatis"/>
        <property name="username" value="root"/>
        <property name="password" value="WANan123"/>
        -->
    </properties>

    <!--配置参数-->
    <settings>
        <!-- 开启mybatis支持延迟加载-->
        <setting name="lazyLoadingEnabled" value="true"/>
        <setting name="aggressiveLazyLoading" value="false"/>
    </settings>

    <!--
        使用typeAliases配置别名,只能配置domain中类的别名
    -->
    <typeAliases>
        <!--type属性指定实体类全限定类名,alias属性指定类名,且不区分大小写-->
        <!--<typeAlias type="com.xmz.domain.User" alias="user"></typeAlias>-->
        <!-- 用于配置别名的包,当指定后,该包下的实体类都会注册别名,并且类名为别名,不区分大小写-->
        <package name="com.xmz.domain"/>
    </typeAliases>

    <environments default="mysql">
        <!-- 配置环境-->
        <environment id="mysql">
            <!--配置事务-->
            <transactionManager type="JDBC"></transactionManager>
            <!--配置连接池-->
            <dataSource type="POOLED">
                <property name="driver" value="${jdbc.driver}"/>
                <property name="url" value="${jdbc.url}"/>
                <property name="username" value="${jdbc.username}"/>
                <property name="password" value="${jdbc.password}"/>
            </dataSource>
        </environment>
    </environments>
    <!-- 配置映射文件位置-->
    <mappers>
<!--        <mapper resource="com/xmz/dao/IUserDao.xml"></mapper>

            使用注解时的配置
            <mapper resource="com.xmz.dao.IUserDao"></mapper>
-->
        <!--也有package标签,用于指定dao接口所在的包,指定后不需要再写mapper以及resources和class-->
        <package name="com.xmz.dao"/>
    </mappers>

5.注解的一对一,一对多

一对一:

@Result(property = "user", column = "uid", one = @One(
        select="com.xmz.dao.IUserDao.findById", fetchType= FetchType.EAGER))

一对多:

@Result(property = "accounts",column = "id",
        many = @Many(select = "com.xmz.dao.IAccountDao2.findAccountByUid",
                fetchType = FetchType.LAZY))

6.xml配置文件的一对一,一对多

一对一:

<resultMap id="accountUserMap" type="account">
        <id property="id" column="id"></id>
        <result property="uid" column="uid"></result>
        <result property="money" column="money"></result>
        <!--一对一关系映射,配置封装user的内容-->
<!--        <association property="user" column="uid" javaType="user">-->
<!--            <id property="id" column="id"></id>-->
<!--            <result column="username" property="username"></result>-->
<!--            <result column="address" property="address"></result>-->
<!--            <result column="sex" property="sex"></result>-->
<!--            <result column="birthday" property="birthday"></result>-->
<!--        </association>-->
<!--
        select属性指定查询用户的唯一标识
        column属性指定更具用户id查询所需要的参数
 -->
        <association property="user" column="uid" javaType="user" select="com.xmz.dao.IUserDao.findById"></association>
    </resultMap>

一对多:

<resultMap id="roleMap" type="role">
    <id property="roleId" column="rid"></id>
    <result property="roleName" column="role_name"></result>
    <result property="roleDesc" column="role_desc"></result>
    <collection property="users" ofType="user">
        <id property="id" column="id"></id>
        <result column="username" property="username"></result>
        <result column="address" property="address"></result>
        <result column="sex" property="sex"></result>
        <result column="birthday" property="birthday"></result>
    </collection>
</resultMap>

7.多表组合查询

select u.*, r.id as rid, r.role_name, r.role_desc from role r
 left outer join user_role ur on rid = ur.rid
 left outer join user u on u.id = ur.uid

8.xml的相关语句if,foreach,where

    <select id="findUserByCondition" resultType="com.xmz.domain.User" parameterType="user">
        select * from user
        <where>
            <if test="username!=null">
                and username like #{username}
            </if>
            <if test="sex!=null">
                and sex like #{sex}
            </if>
        </where>
    </select>

    <select id="findUserInIds" resultType="com.xmz.domain.User" parameterType="queryvo">
--         select * from user
        <include refid="defaultUser"></include>
        <where>
            <if test="ids!=null and ids.size()>0">
                <foreach collection="ids" open="and id in (" close=")" item="uid" separator=",">
                    #{uid}
                </foreach>
            </if>
        </where>
    </select>

9.实际调用测试

private InputStream in;
private SqlSession sqlSession;
private IAccountDao2 accountDao2;

@Before//用于在测试方法执行之前执行
public void init() throws Exception{
    in = Resources.getResourceAsStream("SqlMapConfig.xml");
    SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(in);
    //设置自动提交commit
    sqlSession = factory.openSession(true);
    //sqlSession = factory.openSession();
    accountDao2 = sqlSession.getMapper(IAccountDao2.class);
}

@After//用于在测试方法执行之后执行
public void destroy() throws Exception{
    //sqlSession.commit();
    sqlSession.close();
    in.close();
}
/**
 * 测试查询所有
 * @throws Exception
 */
@Test
public void testFindAll() throws Exception{
    List<Account> accounts = accountDao2.findAll();
    for (Account account:accounts){
        System.out.println(account);
    }
}

Guess you like

Origin blog.csdn.net/qq_36603180/article/details/108786771