1,编辑测试方法
package com.jt.springboot_demo2_mybatis;
import com.jt.springboot_demo2_mybatis.mapper.DemoUserMapper;
import com.jt.springboot_demo2_mybatis.pojo.DemoUser;
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.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import java.io.IOException;
import java.io.InputStream;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class TestMybatis {
private SqlSessionFactory sqlSessionFactory;
/**
* mybatis的核心 sqlSessionFacotry对象
*
* @BeforeEach:测试API中的注解,在执行@Test注解方法时,会提前执行!!!
*/
@BeforeEach
public void init() throws IOException {
//1,指定资源文件
//指定配置文件地址
String resource = "mybaits\\mybaits.config.xml";
//通过IO流 加载指定的配置文件
InputStream inputStream = Resources.getResourceAsStream(resource);
//动态生成SqlSessionFactory
sqlSessionFactory =
new SqlSessionFactoryBuilder().build(inputStream);
}
/**
* 需求:查询age> 18 and age <100的用户信息
* 规则
*/
@Test
public void testSelect01() {
/** //自动提交事务
sqlSessionFactory.openSession(true);
*/
//获取SqlSession 类比 数据库链接
SqlSession sqlSession = sqlSessionFactory.openSession();
//获取Mapper接口
DemoUserMapper demoUserMapper = sqlSession.getMapper(DemoUserMapper.class);
DemoUser demoUser = new DemoUser();
Map<String,Object> map = new HashMap<>();
map.put("minAge", 18);
map.put("maxAge", 100);
List<DemoUser> userList = demoUserMapper.select01(map);
System.out.println(userList);
sqlSession.close();
}
/**
* 例如: 删除id=232/233/234的数据?
* Sql: delete from demo_user where id in (232,233,234)
* 规则: 如果遇到相同的多个数据,则一般采用集合的方式封装数据.
* 封装方式:
* 1. array
* 2. list
* 3. map<List>
*/
@Test
public void testDelect(){
//获取SQLSession 类比 数据库链接
SqlSession sqlSession = sqlSessionFactory.openSession(true);
//获取Mapper接口
DemoUserMapper demoUserMapper = sqlSession.getMapper(DemoUserMapper.class);
//将数据封装为数组
int[] ids = {232,233,234};
demoUserMapper.deleteIds(ids);
System.out.println("删除操作成功!!!");
}
}
2,编辑Mapper接口
package com.jt.springboot_demo2_mybatis.mapper;
import com.jt.springboot_demo2_mybatis.pojo.DemoUser;
import org.apache.ibatis.annotations.Param;
import java.util.List;
import java.util.Map;
/**
* 说明:
* 1,根据面向接口开发的思想要定义一个Mapper接口
* 2,在接口中可以写接口方法,谁用谁去实现!!!
* 3,Mybatis中的实现类以xml文件的形式存在
*/
public interface DemoUserMapper {
//1,查询所有的表数据
List<DemoUser> select01(Map<String, Object> map);
void deleteIds(int[] ids);
}
3,编辑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">
<!--xml映射文件 必须与接口一对一绑定
namespace指定需要绑定的接口名称,不能重复-->
<mapper namespace="com.jt.springboot_demo2_mybatis.mapper.DemoUserMapper">
<!--根据age查询数据
xml文件中的转义字符.
> > 大于
< < 小于
& & 号
说明:如果sql中有大量的转义字符 建议使用转义标签体
语法: <![CDATA[ xxx内容 报文 ]]>
-->
<select id="select01" resultType="com.jt.springboot_demo2_mybatis.pojo.DemoUser">
<!--select * from demo_user where age > #{minAge} and age < #{maxAge}-->
<![CDATA[ select * from demo_user where age > #{minAge} and age < #{maxAge}]]>
</select>
<!--
需求: 批量删除多个数据
难点: 如果使用#{集合}获取的是集合对象的整体.删除无效.
思路: 将数组拆分为单个数据. 可以通过遍历的方式操作
语法: mybatis为了参数取值方便,特意封装了遍历的标签 foreach
关于标签参数说明:
<foreach collection=""></foreach>
1.如果传递的参数是数组, 则collection="array"
2.如果传递的参数是list集合, 则collection="list"
3.如果传递的参数是Map集合, 则collection="map中的key"
标签属性说明:
1.collection 集合的名称
2.item 每次遍历的数据的形参变量
3.open 循环的开始标签
4.close 循环的结束标签
5.index 循环遍历下标 一般不用
6.separator 循环遍历的分割符
-->
<delete id="deleteIds">
delete from demo_user where id in (
<foreach collection="array" item="id" separator=",">
#{id}
</foreach>
)
</delete>
</mapper>
总结
抽取生成SqlSessionFactory的方法 @BeforeEach
利用Mybatis查询数据时,如果返回值结果确定唯一则使用POJO对象接收.如果不能确定.使用List集合接收.
mybatis默认支持单值传参.如果遇到多值,需要将多值转化为单值.
策略: 1.利用POJO对象封装
2.利用万能的Map集合
3.如果参数一定使用多值操作,则使用@Param(“sex”) String sex
#号 和 $符用法
#号有预编译效果, 为数据添加一对""号
$符 没有预编译的效果, 一般以字段名称为参数时使用.
mybatis原生条件下 做"更新"操作时,需要手动提交事务.
//自动提交事务
sqlSessionFactory.openSession(true);
6.xml中常见的转义字符