天天看点

MyBatis学习笔记Mybatis学习笔记(maven、Idea版)

Mybatis学习笔记(maven、Idea版)

环境搭建注意事项

①创建UserDao 接口 和 UserDao.xml 时的名字一样是为了和之前的知识保持一致,所以在SSM整合以后都用UserMapper接口和UserMapper.xml

②在idea创建目录时,他和包是不一样的。目录需要一级一级的创建。映射文件放在resource目录下

③mybatis的映射配置文件位置必须和接口的包结构一样

④映射文件的mapper标签的namespace属性的取值必须是接口的全限定类名

⑤映射配置文件的操作配置id的属性必须和接口的方法名一致。

映射文件放在mapper包目录下没有放到resource下,IDEA需要在pom.xm中使用一下配置才能加载mapper映射文件

<build>     
            <resources>
                <resource>
                    <directory>src/main/java</directory>
                    <includes>
                        <include>**/*.xml</include>
                        <include>**/*.properties</include>
                    </includes>
                    <filtering>true</filtering>
                </resource>
                <resource>
                    <directory>src/main/resources</directory>
                    <includes>
                        <include>**/*.xml</include>
                        <include>**/*.properties</include>
                    </includes>
                    <filtering>true</filtering>
                </resource>
            </resources>
    </build>
           

案例一

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>
    <!--配置别名 -->
    <typeAliases>
        <package name="com.cgx.pojo" />
    </typeAliases>


    <!-- 和spring整合后 environments配置将废除 -->
    <environments default="development">
        <environment id="development">
            <!-- 使用jdbc事务管理 -->
            <transactionManager type="JDBC" />
            <!-- 数据库连接池 -->
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.jdbc.Driver" />
                <property name="url"
                          value="jdbc:mysql://localhost:3306/test2?characterEncoding=utf-8" />
                <property name="username" value="root" />
                <property name="password" value="root" />
            </dataSource>
        </environment>
    </environments>
    
    <!--配置mapper映射文件的位置和spring整合后配置将交给spring -->
    <mappers>
        <mapper resource="com\cgx\dao\UserMapper.xml"></mapper>
    </mappers>
</configuration>



           

UserMapper.java

package com.cgx.dao;

import com.cgx.pojo.User;

import java.util.List;

public interface UserMapper {

    List<User> findAll();
    User findById(int id);
}

           

UserMapper.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">
<!-- namespace:命名空间,用于隔离sql -->
<mapper namespace="com.cgx.dao.UserMapper">
     
    <!--resultType用于指定返回结果集映射 -->
     <select id="findAll" resultType="com.cgx.pojo.User">
         select * from user
     </select>
    
    <!--parameterType用于指定传入参数的类型 -->
    <select id="findById" parameterType="int" resultType="user">
        select * from user where  id=#{id}
    </select>

</mapper>

           

测试

import com.cgx.pojo.User;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Before;
import org.junit.Test;

import java.io.InputStream;
import java.util.List;

/**
 * @ClassName Test01
 * @Author CGX
 * @Date 2020/8/6 20:35
 * @Version 1.0
 **/
public class Test01 {

    private SqlSessionFactory sqlSessionFactory = null;

    @Before
    public void init() throws Exception {
        // 1. 创建SqlSessionFactoryBuilder对象
        SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
        // 2. 加载SqlMapConfig.xml配置文件
        InputStream inputStream = Resources.getResourceAsStream("SqlMapConfig.xml");

        // 3. 创建SqlSessionFactory对象
        this.sqlSessionFactory = sqlSessionFactoryBuilder.build(inputStream);
    }

    @Test
    public void test01() {
        // 4. 创建SqlSession对象
        SqlSession sqlSession = sqlSessionFactory.openSession();

        // 5. 执行SqlSession对象执行查询,获取结果List<User>
        // 第一个参数是User.xml的statement的id,【第二个参数是执行sql需要的参数】;
        List<User> users = sqlSession.selectList("findAll");
        User user = sqlSession.selectOne("findById", 1);
        //6.打印
        System.out.println(users);
        System.out.println(user);
        // 7. 释放资源
        sqlSession.close();
    }
}

           

配置mapper映射器的三种方式

①< mapper resource=" " />(初学使用)

使用相对路径的资源

如:

<mappers>
        <mapper resource="com\cgx\dao\UserMapper.xml"></mapper>
    </mappers>
           

②< mapper class=" " />(了解)

使用mapper接口类路径

如:

< mapper class="cn.itcast.mybatis.mapper.UserMapper"/>
           
注意:此种方法要求mapper接口和mapper的映射文件名称相同,且放在同一目录下

③< package name=""/>(实际开发用)

注册指定包下的所有接口

如:

注意:此种方法要求mapper接口和mapper的映射文件名称相同,且放在同一目录下

动态SQL

if标签

where标签

SQL片段

foreach标签

<where>
		<!-- foreach标签,进行遍历 -->
		<!-- collection:遍历的集合,这里是QueryVo的ids属性 -->
		<!-- item:遍历的项目,可以随便写,,但是和后面的#{}里面要一致 -->
		<!-- open:在前面添加的sql片段 -->
		<!-- close:在结尾处添加的sql片段 -->
		<!-- separator:指定遍历的元素之间使用的分隔符 -->
		<foreach collection="ids" item="item" open="id IN (" close=")" separator=",">
			#{item}
		</foreach>
	</where>
           

一对一查询

<!-- association :配置一对一属性 -->
	<!-- property:order里面的User属性名 -->
	<!-- javaType:属性类型 -->
	<association property="user" javaType="user">
        <id property="id" column="user_id" />
        <result property="username" column="username" />
    </association>
           

一对多查询

<!-- 
     collection  配置一对多的关系
     javaType:  当前类中属性的类型
     ofType:每个orders的属性
-->
<collection property="orders" javaType="list" ofType="order">
<!-- 配置主键,是关联Order的唯一标识 -->
		<id property="id" column="oid" />
		<result property="number" column="number" />
</collection>
           
当关联查询的两个表有相同的属性时 那个使用别名 那么他的column也应该使用别名

Mybatis缓存

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JkQpTGu6-1596872789428)(D:\杂物\Typora笔记文档\image\Mybatis缓存.png)]

vaType=“list” ofType=“order”>

<id property="id" column="oid" />
	<result property="number" column="number" />
           

```

当关联查询的两个表有相同的属性时 那个使用别名 那么他的column也应该使用别名

Mybatis缓存

[外链图片转存中…(img-JkQpTGu6-1596872789428)]

继续阅读