Mybatis(二):实现“增删改查”
Mybatis(二):实现“增删改查”
- 前言
- 一、MyBatis的增删改查
-
- 1、添加
- 2、修改
- 3、删除
- 4、查询
-
- 4.1 查询一个实体
- 4.1 查询集合
- 二、MyBatis获取参数值的两种方式(重点)
-
- 1、单个字面量类型的参数
- 2、多个字面量类型的参数
- 3、map集合类型的参数
- 4、实体类类型的参数
- 5、使用@Param标识参数
- 6、结论
- 三、MyBatis的各种查询功能
-
- 1、查询一个实体类对象
- 2、查询一个list集合
- 3、查询单个数据
- 4、查询一条数据为map集合
- 5、查询多条数据为map集合
- 6、结论
前言
本博主将用CSDN记录软件开发求学之路上亲身所得与所学的心得与知识,有兴趣的小伙伴可以关注博主!也许一个人独行,可以走的很快,但是一群人结伴而行,才能走的更远!
一、MyBatis的增删改查
1、添加
UserMapper接口:
/**
*添加用户信息
*/
int insertUser();
UserMapper.xml:
insert into t_user values(null,'张三','123',23,'女')
2、修改
UserMapper接口:
/**
* 修改用户信息
*/
void updateUser();
UserMapper.xml:
update t_user set username = '张三' where id = 4
3、删除
UserMapper接口:
/**
* 删除用户信息
*/
void deleteUser();
UserMapper.xml:
delete from t_user where id = 5
4、查询
4.1 查询一个实体
UserMapper接口:
/**
* 查询用户信息
*/
User getUserId();
UserMapper.xml
select * from t_user where id = 3
4.1 查询集合
UserMapper接口:
/**
* 查询用户信息
*/
List getAllUser();
UserMapper.xml:
<!--List getAllUser();-->
select * from t_user
注意:
⭕ 查询的标签select必须设置属性resultType或resultMap,用于设置实体类和数据库表的映射关系
● resultType:自动映射,用于属性名和表中字段名一致的情况
● resultMap:自定义映射,用于一对多或多对一或字段名和属性名不一致的情况
⭕当查询的数据为多条时,不能使用实体类作为返回值,只能使用集合,否则会抛出异常TooManyResultsException,但是若查询的数据只有一条,可以使用实体类或集合作为返回值
二、MyBatis获取参数值的两种方式(重点)
MyBatis获取参数值的两种方式:${}和#{}
⭕${}的本质就是字符串拼接,使用字符串拼接的方式拼接sql,若为字符串类型或日期类型的字段进行赋值时,需要手动加单引号;
⭕ #{}的本质就是占位符赋值,但是#{}使用占位符赋值的方式拼接sql,此时为字符串类型或日期类型的字段进行赋值时,可以自动添加单引号
1、单个字面量类型的参数
⭕ 若mapper接口中的方法参数为单个的字面量类型,此时可以使用${}和#{}以任意的名称获取参数的值,但是需要注意${}的单引号问题
⭕ 代码演示:
UserMapper
/**
* @description:查询用户信息
* @author: Hey
* @date: 2022/7/3 16:53
* @param: [username]
* @return: com.ir.mybatis.pojo.User
**/
User getUserByUsername(String username);
UserMapper.xml
select * from t_user where username = #{username};
UserMapperTest
/**
* @description:
* @author: Hey
* @date: 2022/7/3 15:29
* @param: []
* @return: void
**/
@Test
public void getUserByUsername(){
UserMapper userMapper = SqlSessionUtils.getSqlSession().getMapper(UserMapper.class);
System.out.println(userMapper.getUserByUsername("张三"));
}
2、多个字面量类型的参数
⭕ mapper接口方法的参数为多个时,此时MyBatis会将这些参数放在一个map集合中,以两种方式进行存储
- 以arg0,arg1…为键,以参数为值
- 以param1,param2…为键,以参数为值
因此只需要通过${}和#{}访问map集合的键就可以获取相对应的 值,但是需要注意${}的单引号问题。
⭕ 代码演示:
UserMapper
/**
* @description:检查用户登录信息
* @author: Hey
* @date: 2022/7/3 15:46
* @param: [username, password]
* @return: com.ir.mybatis.pojo.User
**/
User checkLoginByParameter(String username,String password);
UserMapper.xml
select * from t_user where username=#{arg0} and password=#{arg1};
UserMapperTest
/**
* @description:
* @author: Hey
* @date: 2022/7/3 15:30
* @param: []
* @return: void
**/
@Test
public void checkLoginByParam(){
UserMapper userMapper = SqlSessionUtils.getSqlSession().getMapper(UserMapper.class);
User user = userMapper.checkLoginByParameter("张三","123");
System.out.println(user);
}
3、map集合类型的参数
⭕ 若mapper接口中的方法需要的参数为多个时,此时可以手动创建map集合,将这些数据放在map中,只需要通过${}和#{}访问map集合的键就可以获取相对应的值,但是需要注意${}的单引号问题
⭕ 代码演示:
UserMapper
/**
* @description:通过自定义Map来验证登录
* @author: Hey
* @date: 2022/7/3 15:45
* @param:
* @return:
**/
User checkLoginByMap(Map map);
UserMapper.xml
<!--User checkLoginByMap(Map map);-->
select * from t_user where username=#{username} and password=#{password};
UserMapperTest
/**
* @description:测试通过自定义Map验证登录
* @author: Hey
* @date: 2022/7/3 15:55
* @param: []
* @return: void
**/
@Test
public void checkLoginByMap(){
UserMapper userMapper = SqlSessionUtils.getSqlSession().getMapper(UserMapper.class);
Map map = new HashMap();
map.put("username","张三");
map.put("password","123");
User user = userMapper.checkLoginByMap(map);
System.out.println(user);
}
4、实体类类型的参数
⭕ 若mapper接口中的方法参数为实体类对象时,此时可以使用${}和#{},通过访问实体类对象中的属性名获取属性值,但是需要注意${}的单引号问题
⭕ 代码演示:
UserMapper
/**
* @description:添加用户
* @author: Hey
* @date: 2022/7/3 16:11
* @param: [user]
* @return: int
**/
Integer insertUser(User user);
UserMapper.xml
insert into t_user values(null,#{username},#{password},#{age},#{sex},#{email})
UserMapperTest
/**
* @description:添加用户
* @author: Hey
* @date: 2022/7/3 16:24
* @param: []
* @return: void
**/
@Test
public void insertUser(){
UserMapper userMapper = SqlSessionUtils.getSqlSession().getMapper(UserMapper.class);
Integer result = userMapper.insertUser(new User(null,"喜羊羊","123456",18,"男","123123@qq.com"));
System.out.println(result);
}
5、使用@Param标识参数
⭕ 可以通过@Param注解标识mapper接口中的方法参数,此时,会将这些参数放在map集合中,以如下两种方式来取值访问:
- 以@Param注解的value属性值为键,以参数为值;
- 以param1,param2…为键,以参数为值;
只需要通过${}和#{}访问map集合的键就可以获取相对应的值,但是需要注意${}的单引号问题
⭕ 代码演示:
UserMapper
/**
* @description:通过参数注解验证登录
* @author: Hey
* @date: 2022/7/3 16:59
* @param: [username, password]
* @return: com.ir.mybatis.pojo.User
**/
User checkLoginByParam(@Param("username") String username, @Param("password") String password);
UserMapper.xml
select * from t_user where username = #{username} and password = #{password}
UserMapperTest
/**
* @description:通过注解方式验证登录
* @author: Hey
* @date: 2022/7/3 16:57
* @param: []
* @return: void
**/
@Test
public void testCheckLoginByParam(){
SqlSession sqlSession = SqlSessionUtils.getSqlSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
User user = mapper.checkLoginByParam("admin", "123456");
System.out.println(user);
}
6、结论
将以上五种情况分为两类情况
⭕ 情况一:参数为实体类型
⭕ 情况二:参数都用@Param来修饰
三、MyBatis的各种查询功能
1、查询一个实体类对象
SelectMapper
/**
* @description:通过id查询用户
* @author: Hey
* @date: 2022/7/3 17:54
* @param: [id]
* @return: com.ir.mybatis.pojo.User
**/
User getUserById(@Param("id") Integer id);
SelectMapper.xml
select * from t_user where id= #{id};
SelectMapperTest
/**
* @description:通过id查询用户
* @author: Hey
* @date: 2022/7/3 17:58
* @param: []
* @return: void
**/
@Test
public void getUserById(){
SelectMapper selectMapper = SqlSessionUtils.getSqlSession().getMapper(SelectMapper.class);
User user = selectMapper.getUserById(3);
System.out.println(user);
}
2、查询一个list集合
SelectMapper
/**
* @description:获取多个用户
* @author: Hey
* @date: 2022/7/3 17:56
* @param: []
* @return: java.util.List
**/
List getAllUser();
SelectMapper.xml
select * from t_user;
SelectMapperTest
/**
* @description:查询所有用户
* @author: Hey
* @date: 2022/7/3 18:00
* @param: []
* @return: void
**/
@Test
public void getAllUser(){
SelectMapper selectMapper = SqlSessionUtils.getSqlSession().getMapper(SelectMapper.class);
List list = selectMapper.getAllUser();
for (User user:list
) {
System.out.println(user);
}
}
3、查询单个数据
在MyBatis中,对于Java中常用的类型都设置了类型别名
| Alias | Mapped Type |
|---|---|
| _byte | byte |
| _char (since 3.5.10) | char |
| _character (since 3.5.10) | char |
| _long | long |
| _short | short |
| _int | int |
| _integer | int |
| _double | double |
| _float | float |
| _boolean | boolean |
| string | String |
| byte | Byte |
| char (since 3.5.10) | Character |
| character (since 3.5.10) | Character |
| long | Long |
| short | Short |
| int | Integer |
| integer | Integer |
| double | Double |
| float | Float |
| boolean | Boolean |
| date | Date |
| decimal | BigDecimal |
| bigdecimal | BigDecimal |
| biginteger | BigInteger |
| object | Object |
| date[] | Date[] |
| decimal[] | BigDecimal[] |
| bigdecimal[] | BigDecimal[] |
| biginteger[] | BigInteger[] |
| object[] | Object[] |
| map | Map |
| hashmap | HashMap |
| list | List |
| arraylist | ArrayList |
| collection | Collection |
| iterator | Iterator |
SelectMapper
/**
* @description:查询用户信息的总记录数
* @author: Hey
* @date: 2022/7/3 20:40
* @param: []
* @return: java.lang.Integer
**/
Integer getCount();
SelectMapper.xml
select count(1) from t_user;
SelectMapperTest
/**
* @description:查询用户信息的总记录数
* @author: Hey
* @date: 2022/7/3 20:45
* @param: []
* @return: void
**/
@Test
public void getCount(){
SelectMapper selectMapper = SqlSessionUtils.getSqlSession().getMapper(SelectMapper.class);
int result = selectMapper.getCount();
System.out.println(result);
}
4、查询一条数据为map集合
SelectMapper
/**
* @description:根据id查询用户信息为一个map集合
* @author: Hey
* @date: 2022/7/3 20:59
* @param: [id]
* @return: java.util.Map
**/
Map getUserByIdToMap(@Param("id")Integer id);
SelectMapper.xml
select * from t_user where id=#{id}
SelectMapperTest
/**
* @description:根据id查询用户信息为一个map集合
* @author: Hey
* @date: 2022/7/3 21:03
* @param: []
* @return: void
**/
@Test
public void getUserByIdToMap(){
SelectMapper selectMapper = SqlSessionUtils.getSqlSession().getMapper(SelectMapper.class);
System.out.println(selectMapper.getUserByIdToMap(5));
//{password=123456, sex=男, id=5, age=18, email=123123@qq.com, username=喜羊羊}
}
5、查询多条数据为map集合
方式一:
SelectMapper
/**
* @description:查询所有用户信息为Map集合
*
* 将表中的数据以map集合的方式查询,一条数据对应一个map;
* 若有多条数据,就会产生多个map集合,此时可以将这些map放在一个list集合中获取
*
* @author: Hey
* @date: 2022/7/3 21:15
* @param: []
* @return: java.util.List<java.util.Map>
**/
List<Map> getAllUserToMap();
SelectMapper.xml
select * from t_user
SelectMapperTest
/**
* @description:查询所有用户信息为Map集合
* @author: Hey
* @date: 2022/7/3 21:17
* @param: []
* @return: void
**/
@Test
public void testGetAllUserToMap(){
SqlSession sqlSession = SqlSessionUtils.getSqlSession();
SelectMapper mapper = sqlSession.getMapper(SelectMapper.class);
System.out.println(mapper.getAllUserToMap());
/**
* [{password=123, sex=女, id=1, age=23, email=12345@qq.com, username=张三},
* {password=123456, sex=男, id=2, age=18, email=123123@qq.com, username=喜羊羊}]
*/
}
方式二:
SelectMapper
/**
* @description:查询所有用户信息为Map集合
*
* 将表中的数据以map集合的方式查询,一条数据对应一个map;
* 若有多条数据,就会产生个map集合,并且最终要以一个map的方式返回数据,此时需要通过@MapKey注解设置map集合的键,值是每条数据所对应的map集合
*
* @author: Hey
* @date: 2022/7/3 21:15
* @param: []
* @return: java.util.List<java.util.Map>
**/
@MapKey("id")
Map getAllUserToMap();
SelectMapper.xml
select * from t_user
SelectMapperTest
/**
* @description:查询所有用户信息为Map集合
* @author: Hey
* @date: 2022/7/3 21:17
* @param: []
* @return: void
**/
@Test
public void testGetAllUserToMap(){
SqlSession sqlSession = SqlSessionUtils.getSqlSession();
SelectMapper mapper = sqlSession.getMapper(SelectMapper.class);
System.out.println(mapper.getAllUserToMap());
/**
* {
* 1={password=123, sex=女, id=1, age=23, email=12345@qq.com, username=张三},
* 2={password=123456, sex=男, id=2, age=18, email=123123@qq.com, username=喜羊羊}
* }
*/
}
6、结论
MyBatis的各种查询功能:
⭕ 若查询出的数据只有一条
● 可以通过实体类对象接收
● 可以通过list集合接收
● 可以通过map集合接收
结果:
{password=123456, sex=男, id=3, age=23, email=12345@qq.com, username=admin}
⭕ 若查询出的数据有多条
● 可以通过实体类类型的list集合接收
● 可以通过map类型的list集合接收
●可以在mapper接口的方法上添加@MapKey注解,此时就可以将每条数据转换的map集合作为值,以某个字段的值作为键,放在同一个map集合中
⭕ 注意:一定不能通过实体类对象接收,此时会抛异常TooManyResultsException
本文来自网络,不代表协通编程立场,如若转载,请注明出处:https://www.net2asp.com/d7ffb7ac0a.html
