1.Mybatis案例学习
1.1 简化测试操作
private SqlSessionFactory sqlSessionFactory;
/**
* 设计思路:
* 1.要求每次执行测试方法时 都先生成一个SqlSessionFactory
* 2.从sqlSessionFactory中获取sqlSession
* 3.完成业务操作
* 注解说明:
* @BeforeEach 当每次执行@Test注解方法时,都会先执行该方法.
*/
@BeforeEach
public void init() throws IOException {
String resource = "mybatis/mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
}
@Test
public void testFind2(){
SqlSession sqlSession = sqlSessionFactory.openSession();
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
List<User> userList = userMapper.findAll();
System.out.println(userList);
sqlSession.close();
}
2.Mybatis CUDR操作
2.1根据ID查询数据
2.1.1 需求说明
查询 id=1的用户数据
2.1.2 编辑接口方法
2.1.3 编辑UserMapper.xml映射文件
<!--根据ID查询用户数据-->
<select id="findUserById" parameterType="Integer" resultType="com.jt.pojo.User">
select * from demo_user where id = #{id}
</select>
2.1.4 编辑单元测试方法
@Test
public void testUserById(){
int id = 1;
SqlSession sqlSession = sqlSessionFactory.openSession();
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
User user = userMapper.findUserById(id);
System.out.println(user);
sqlSession.close();
}
2.2 用户新增测试
2.2.1 编辑UserMapper 接口
2.2.2 编辑UserMapper.xml
<!--
实现用户新增
1.关于对象参数传递说明: saveUser(User user);
2.mybatis取值语法: #{属性名}
3.用户在执行"更新"操作时,自动的返回影响的行数
-->
<insert id="saveUser">
insert into demo_user(id,name,age,sex)
value (null,#{name},#{age},#{sex})
</insert>
2.2.3 编辑测试代码
/实现User对象的新增操作
//mybatis在执行"更新"操作时 需要提交事务
@Test
public void testSaveUser(){
User user = new User(null,"嫦娥",16, "女");
SqlSession sqlSession = sqlSessionFactory.openSession();
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
int rows = userMapper.saveUser(user);
System.out.println("影响的行数:"+rows);
//提交事务
sqlSession.commit();
sqlSession.close();
}
2.3 用户修改
2.3.1 编辑测试API
/**
* 需求: 要求将id=232的数据 name="嫦娥姐姐" age=99岁
*/
@Test
public void testUpdateUser(){
//1.封装数据
User user = new User(232,"嫦娥姐姐",99,null);
SqlSession sqlSession = sqlSessionFactory.openSession();
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
int rows = userMapper.updateUser(user);
if(rows>0){
//事务提交
sqlSession.commit();
}
System.out.println("影响了:" + rows+"行");
sqlSession.close();
}
2.3.2 编辑UserMapper 接口
2.3.3 编辑UserMapper 映射文件
update demo_user set name=#{name},age=#{age} where id=#{id} ## 2.4用户删除 ### 2.4.1编辑测试方法 ```java /** * 完成删除操作 将name="嫦娥姐姐"的数据删除. * sql: delete from demo_user where name=#{嫦娥姐姐} */ @Test public void deleteUserByName(){ //获取SqlSession,之后自动提交事务 SqlSession sqlSession = sqlSessionFactory.openSession(true); UserMapper userMapper = sqlSession.getMapper(UserMapper.class); String name = "嫦娥姐姐"; int rows = userMapper.deleteUserByName(name); sqlSession.close(); } ``` ### 2.4.2 编辑Mapper接口和映射文件int deleteUserByName(String name);
<delete id="deleteUserByName">
delete from demo_user where name=#{name}
</delete>
2.5 利用Map 集合封装数据
2.5.1需求说明
需求:查询 age > 100 并且 age < 1000 的用户
sql: select * from demo_user where age > 100 and age < 1000
2.5.2 编辑测试方法
//需求: 查询 age> 100 并且 age < 1000的用户.
//知识点: 如果有重名属性,一般使用Map集合封装数据
@Test
public void testMap(){
//获取SqlSession,之后自动提交事务
SqlSession sqlSession = sqlSessionFactory.openSession(true);
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
Map map = new HashMap();
map.put("minAge",100);
map.put("maxAge",1000);
List<User> userList = userMapper.findByAge(map);
System.out.println(userList);
sqlSession.close();
}
2.5.3 编辑接口 / 映射文件
在UserMapper文件中添加方法
List<User> findByAge(Map map);
<!--
语法: findByAge(Map map);
取值: #{key} 根据key 获取value的数据
关于转义的说明:
xml文件中个别的字母需要转义
大于 > >
小于 < <
与号 & &
转义标签 <![CDATA[ 需要转义的内容 ]]>
-->
<select id="findByAge" resultType="com.jt.pojo.User">
<!--select * from demo_user where age > #{minAge}
and age < #{maxAge}
-->
<![CDATA[
select * from demo_user where age > #{minAge}
and age < #{maxAge}
]]>
</select>
2.5.4 转义标签总结
大于 > >
小于 < <
与号 & &
转义标签 <![CDATA[ 需要转义的内容 ]]>
2.6 @Param 注解说明
2.6.1 注解用法
2.6.2 编辑测试方法
/**
* 测试@Param注解
* 需求: 查询 age> 100 并且 age < 1000的用户.
*/
@Test
public void testParam(){
SqlSession sqlSession = sqlSessionFactory.openSession(true);
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
int minAge = 100;
int maxAge = 1000;
List<User> userList = userMapper.findParam(minAge,maxAge);
System.out.println(userList);
sqlSession.close();
}
2.6.3 编辑接口 / 映射文件
List<User> findParam(@Param("minAge") int minAge,
@Param("maxAge") int maxAge);
<select id="findParam" resultType="com.jt.pojo.User">
<![CDATA[
select * from demo_user where age > #{minAge}
and age < #{maxAge}
]]>
</select>
2.7 模糊查询
2.7.1 业务需求
查询 name 中包含 "乔"字的用户
sql : select * from demo_user where name like “%乔%”
2.7.2 编辑测试类
/**
* 查询name中包含"乔"字的用户
*/
@Test
public void testLike(){
SqlSession sqlSession = sqlSessionFactory.openSession(true);
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
String name = "乔";
List<User> userList = userMapper.findUserByLike(name);
System.out.println(userList);
sqlSession.close();
}
2.7.3 编辑接口 和映射文件
List<User> findUserByLike(String name);
<select id="findUserByLike" resultType="com.jt.pojo.User">
select * from demo_user where name like "%"#{name}"%"
</select>
3.简化Mybatis 配置
3.1 别名设置
3.1.1 别名说明
说明:resultType中的属性 每次都需要添加全路径 比较繁琐 可以 使用别名进行优化
3.1.2别名设置
3.1.3 使用别名
3.1.4 使用 别名包
3.2 简化sql语句
<!--说明:
1.如果配置了别名包: 则映射时会自动的拼接包路径
2. include refid="引用SqlID"
-->
<select id="findUser" resultType="User">
select <include refid="user_cloumn"/> from demo_user
</select>
<!--2.简化Sql-->
<sql id="user_cloumn">
id,name,age,sex
</sql>
4. 课堂总结
1. 简化test 方法 @BeforeEach
2. Mybatis常用 CURD操作
2.1 编辑接口
2.2 编辑映射文件 接口与 映射文件必须 一 一 对应
2.3 insert / update /delete 自动 返回影响行数 select 必须 有 resultType 包路径
3. 参数传递
3.1 基本类型数据 1 个
3.2 可以将多个参数封装为POJO对象 不能有重名属性
3.3 更加通用的封装为 Map 集合 @Param ("key")
4. xml 中转义字符写法
5. 模糊查询 xml写法 like "%"#{属性名}"%"
6. 简化配置
6.1 别名包
6.2 sql标签