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接口和mapper的映射文件名称相同,且放在同一目录下< mapper class="cn.itcast.mybatis.mapper.UserMapper"/>
③< 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)]