文章目录
1.概述
我们在上一小节完成了MyBatis的相关配置,并通过测试类完成了对其功能的测试,这一小节,我们将通过MyBatis完成常规业务的CRUD操作。
2.具体案例
2.1 根据ID查询数据
2.1.1 需求
要求根据ID获取对应用户的数据
2.1.2 编辑接口方法
package com.study.mapper;
import com.study.pojo.User;
import java.util.List;
public interface UserMapper {
//查询User表中的所有数据
public List<User> findAll();
//根据ID查询数据
public User findUserById(Integer id);
}
2.1.3 编辑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是mybaits映射文件的唯一标识,与接口对应-->
<mapper namespace="com.study.mapper.UserMapper">
<!--id 表示接口方法
resultType 返回值结果类型
-->
<select id="findAll" resultType="com.study.pojo.User">
select * from demo_user
</select>
<!--根据ID查询用户数据-->
<select id="findUserById" parameterType="Integer" resultType="com.study.pojo.User">
select * from demo_user where id = #{id}
</select>
</mapper>
要注意的是,我们根据传入的参数进行查询,传入的参数是一个变量,变量使用#{id},id代表参数的名称,并且使用parameterType="Integer"来制定参数的类型。
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 需求
根据User对象,实现用户新增
2.2.2 编辑接口方法
//根据User对象,实现用户新增
public Integer saveUser(User user);
因为是新增数据,接口方法中可以不返回内容,我们这里为了便于观察执行是否成功,返回一个Integer类型的变量,变量的内容为影响的行数。
2.2.3 编辑UserMapper.xml 映射文件
<!--实现数据新增 新增成功之后自动返回影响的行数
数据取值时 使用#{属性名} 获取数据
-->
<insert id="saveUser">
insert into demo_user(id,name,age,sex) value (null,#{name},#{age},#{sex})
</insert>
ID作为主键,一般都是自增的形式存在,不会手动的传入值,所以我们这里使用null即可,入库时,数据库会自动为其赋值。
2.2.4 编辑单元测试方法
//实现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();
}
因为我们这里要给对象进行赋值,为了方便在进行创建时就赋值,所以要在我们User的pojo
类中添加无参构造和全参构造的注解。
并且对于新增等对数据库中数据有影响的操作,在操作完成后,一定要提交数据库事务,否则虽然你已经操作了,但是数据库并没有保存你对数据库内容作出的更改。

2.3 用户信息修改案例
2.3.1 需求
我们可以在数据库查看我们刚刚添加的数据,这里根据用户ID修改用户的相关数据

2.3.2 编辑接口方法
//根据用户信息的ID修改用户的相关数据
public Integer updateUser(User user);
2.3.3 编辑UserMapper.xml 映射文件
<update id="updateUser">
update demo_user set name = #{name}, age = #{age}, sex = #{sex} where id = #{id}
</update>
2.3.4 编辑单元测试方法
/*
* 根据用户信息的ID修改用户的相关数据
*/
@Test
public void updateUser(){
//1.首先进行数据的封装
User user = new User(231,"嫦娥姐姐",99,"仙女");
SqlSession sqlSession = sqlSessionFactory.openSession();
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
Integer rows = userMapper.updateUser(user);
//2.因为对数据的修改不是一定会成功的,所以进行判断,成功后才提交事务
if(rows>0){
sqlSession.commit();
}
System.out.println("影响了:" + rows+"行");
sqlSession.close();
}
我们可以看到数据以成功修改:


2.4 用户删除案例
2.4.1 需求
我们将刚才修改的用户信息进行删除操作
2.4.2 编辑接口方法
//将刚才修改的用户信息进行删除操作
public Integer deleteUserById(Integer id);
2.4.3 编辑UserMapper.xml 映射文件
<delete id="deleteUserById">
delete from demo_user where id = #{id}
</delete>
2.4.4 编辑单元测试方法
/*
* 将刚才修改的用户信息进行删除操作
*/
/*
* 将刚才修改的用户信息进行删除操作
*/
@Test
public void testDeleteUserById(){
int id = 231;
//获取sqlSession后自动提交事务
SqlSession sqlSession = sqlSessionFactory.openSession(true);
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
Integer rows = userMapper.deleteUserById(id);
System.out.println("影响了:" + rows+"行");
sqlSession.close();
}
sqlSessionFactory.openSession方法可对其提供参数开启自动的事务提交功能,
执行后我们可以看到数据以成功删除:


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的用户.
public List findByAge(Map map);
我们将多个查询条件封装到一个map集合中,并将查询到的多个结果,封装为一个list集合进行返回。
2.5.3 编辑UserMapper.xml 映射文件
<!--特殊转义字符
> >
< <
& &
万能转义标签 <![CDATA[ 需要转义的内容 ]]>
-->
<select id="findByAge" resultType="com.study.pojo.User">
<!--select * from demo_user where age >= #{minAge} and age <= #{maxAge}-->
<![CDATA[
select * from demo_user where age >= #{minAge} and age <= #{maxAge}
]]>
</select>
在sql语句的完成中,有些符号并不能直接输入,例如小于号会被当做开始标签解析,此时需要使用转义符代替。并且,我们的查询条件被封装到了map集合中,所以在sql中需要填入的是map集合中{key:value}结构中的key,即minAge以及maxAge;
2.5.4 编辑单元测试方法
/*
* //查询 age> 100 并且 age < 1000的用户.
*/
@Test
public void testMap(){
//利用map集合封装查询条件
Map map = new HashMap();
map.put("minAge", 100);
map.put("maxAge", 1000);
SqlSession sqlSession = sqlSessionFactory.openSession(true);
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
List userListe = userMapper.findByAge(map);
System.out.println(userListe);
sqlSession.close();
}
我们运行测试方法,可以在控制台看到对应输出的查询结果:

2.6 @Param注解使用
2.6.1 需求
查询 age> 100 并且 age < 1000的用户.
Sql: select * from demo_user where age > 100 and age < 1000
我们使用另一种方式来实现2.5的需求
2.6.2 编辑接口方法
//方法二:利用@param注解
public List findParamByAge(@Param("minAge") int minAge,@Param("maxAge") int maxAge);
对于MyBatis来说,一般只支持单值传参,此时我们就需要将多值转换为单值进行传参,我们首选上面使用的map集合封装,这里我们使用@Param注解,其本质也是疯转为map集合,@Param注解中传入的参数就是key。
2.6.3 编辑UserMapper.xml 映射文件
<select id="findParamByAge" resultType="com.study.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.6.4 编辑单元测试方法
@Test
public void testParam(){
//利用@Param注解集合封装查询条件
int minAge = 100;
int maxAge = 1000;
SqlSession sqlSession = sqlSessionFactory.openSession(true);
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
List userListe = userMapper.findParamByAge(minAge,maxAge);
System.out.println(userListe);
sqlSession.close();
}
2.7 模糊查询案例
2.7.1 需求
查询name中包含"乔"字的用户
Sql: 'ELECT * FROM demo_user WHERE NAME LIKE “%乔%” ’
2.7.2 编辑接口方法
//查询name中包含"乔"字的用户
public List selectUserListByLike(String name);
2.7.3 编辑UserMapper.xml 映射文件
<select id="selectUserListByLike" resultType="com.study.pojo.User">
select * from demo_user where name like "%"#{name}"%"
</select>
2.7.4 编辑单元测试方法
@Test
public void testLike(){
SqlSession sqlSession = sqlSessionFactory.openSession(true);
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
String name = "乔";
List userListe = userMapper.selectUserListByLike(name);
System.out.println(userListe);
sqlSession.close();
}
运行后我们可以在控制台看到查询结果:

3. 简化Mybatis配置
3.1 别名设置
3.1.1 别名说明
说明: resultType中的属性每次都需要添加全路径 比较繁琐.可以使用别名进行优化

3.1.2 别名设置
编辑mybatis-config.xml配置文件,在<configuration>标签中添加别名设置标签<typeAliases>,其配置内容顺便有要求,别名设置标签<typeAliases>应作为<configuration>表中中的第一个配置;

<!--
要注意MyBatis.config配置文件,对于配置信息的引入有顺序要求
peoperties?,settings?,typeAliases?,typeHandlers?,objectFactory
-->
<typeAliases>
<!--type:pojo对象路径 alias:pojo对象别名-->
<typeAlias type="com.study.pojo.User" alias="User"/>
</typeAliases>
3.1.3 使用别名
<!--id 表示接口方法
resultType 返回值结果类型
-->
<select id="findAll" resultType="User">
select * from demo_user
</select>
我们将resultType的值改为别名后测试是否可以正常运行。
3.1.4 使用别名包
说明 :当 相关类太多时,要一行一行的写别名,比较麻烦,所以实际操作时,一般使用别名包直接指定,别名包中包含的路径一般是不变的,不同只是 路径下的类名不同,设置别名包后便可以直接使用类名,不再重复写全路径与设置别名。
<!--
要注意MyBatis.config配置文件,对于配置信息的引入有顺序要求
peoperties?,settings?,typeAliases?,typeHandlers?,objectFactory
-->
<typeAliases>
<!--type:pojo对象路径 alias:pojo对象别名-->
<!--<typeAlias type="com.study.pojo.User" alias="User"/>-->
<package name="com.study.pojo"/>
</typeAliases>
我们再次运行3.1.3中的方法,看是否正常。
3.2 简化Sql语句
说明:实际工作中,sql查询语句考虑到 效率问题一般不写*号,都是具体的字段名,当字段较多时,重复写字段也是比较麻烦的,所以可以通过include 直接引入设置好的相关字段。
<!--说明:
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>
1055




被折叠的 条评论
为什么被折叠?



