CSDN话题挑战赛第2期
参赛话题:学习笔记
学习之路,长路漫漫,需要您的陪伴。
关注一波,您的关注是我最大的动力。
Mybatis
上一篇文章Mybatis快速入门(1)我们介绍了Mybatis的简单CRUD,那么当有传参时如何接收呢?
MyBatis获取参数值的两种方式:${}和#{}
${}的本质就是字符串拼接,#{}的本质就是占位符赋值
${}使用字符串拼接的方式拼接sql,若为字符串类型或日期类型的字段进行赋值时,需要手动加单引
号;但是#{}使用占位符赋值的方式拼接sql,此时为字符串类型或日期类型的字段进行赋值时,可以自
动添加单引号
1)Mybatis获取参数值
①单个字面量类型的参数
若mapper接口中的方法参数为单个的字面量类型
此时可以使用${}和#{}以任意的名称获取参数的值,注意${}需要手动加单引号
②多个字面量类型的参数
若mapper接口中的方法参数为多个时
此时MyBatis会自动将这些参数放在一个map集合中,以arg0,arg1…为键,以参数为值;以
param1,param2…为键,以参数为值;因此只需要通过${}和#{}访问map集合的键就可以获取相对应的
值,注意${}需要手动加单引号
③map集合类型的参数
若mapper接口中的方法需要的参数为多个时,此时可以手动创建map集合,将这些数据放在map中
只需要通过${}和#{}访问map集合的键就可以获取相对应的值,注意${}需要手动加单引号
④实体类类型的参数
若mapper接口中的方法参数为实体类对象时
此时可以使用${}和#{},通过访问实体类对象中的属性名获取属性值,注意${}需要手动加单引号
⑤使用@Param标识参数
可以通过@Param注解标识mapper接口中的方法参数
此时,会将这些参数放在map集合中,以@Param注解的value属性值为键,以参数为值;以
param1,param2…为键,以参数为值;只需要通过${}和#{}访问map集合的键就可以获取相对应的值,
注意${}需要手动加单引号
2)Mybatis的各种查询功能
因为测试时经常需要用到sqlsession,所以我们抽取出来封装成一个工具类SqlSessionUtils
public class SqlSessionUtils {
public static SqlSession getSqlSession(){
SqlSession sqlSession = null;
try {
InputStream is = Resources.getResourceAsStream("mybatis-config.xml");
SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(is);
sqlSession = sqlSessionFactory.openSession(true);
} catch (IOException e) {
e.printStackTrace();
}
return sqlSession;
}
}
①查询实体类对象
SelectMapper
/*
* 查询一条记录
*/
User getUserById(@Param("id")Integer id);
SelectMapper.xml
<!--User getUserById(@Param("id")Integer id);-->
<select id="getUserById" resultType="User">
select * from t_user where id = ${id}
</select>
测试
@Test
public void TestGetUserById() {
SqlSession sqlSession = SqlSessionUtils.getSqlSession();
SelectMapper mapper = sqlSession.getMapper(SelectMapper.class);
System.out.println(mapper.getUserById(8));
}
②查询一个list集合
SelectMapper
/*
* 查询所有记录
*/
List<User> getAllUser();
SelectMapper .xml
<!--List<User> getAllUser();-->
<select id="getAllUser" resultType="User">
select * from t_user;
</select>
测试
@Test
public void TestGetAllUser() {
SqlSession sqlSession = SqlSessionUtils.getSqlSession();
SelectMapper mapper = sqlSession.getMapper(SelectMapper.class);
mapper.getAllUser().forEach(System.out::println);
}
③ 查询单个数据
SelectMapper
/*
* 查询记录条数
*/
Integer getCount();
SelectMapper .xml
<!--Integer getCount();-->
<select id="getCount" resultType="Integer">
select count(*) from t_user;
</select>
测试
@Test
public void TestGetCount() {
SqlSession sqlSession = SqlSessionUtils.getSqlSession();
SelectMapper mapper = sqlSession.getMapper(SelectMapper.class);
System.out.println(mapper.getCount());
}
④查询一条数据为map集合
SelectMapper
/*
* 查询一条记录
*/
Map<String,Object> getUserByIdToMap(@Param("id")Integer id);
SelectMapper .xml
<!--Map<String,Object> getUserByIdToMap(@Param("id")Integer id);-->
<select id="getUserByIdToMap" resultType="map">
select * from t_user where id = ${id}
</select>
测试
@Test
public void TestGetUserByIdToMap() {
SqlSession sqlSession = SqlSessionUtils.getSqlSession();
SelectMapper mapper = sqlSession.getMapper(SelectMapper.class);
System.out.println(mapper.getUserByIdToMap(8));
}
⑤查询多条数据为map集合
SelectMapper
/*
* 查询所有记录(map)
*/
//方法1:
// List<Map<String,Object>> getAllUserToMap();
//方法2:
/*
* 将表中的数据以map集合的方式查询,一条数据对应一个map;若有多条数据,
* 就会产生多个map集合,并 且最终要以一个map的方式返回数据,此时需要
* 通过@MapKey注解设置map集合的键,值是每条数据所对应的 map集合
*/
@MapKey("id")
Map<String,Object> getAllUserToMap();
SelectMapper .xml
<!--方法1与方法2 xml的写法一致-->
<!--List<Map<String,Object>> getAllUserToMap();-->
<select id="getAllUserToMap" resultType="map">
select * from t_user;
</select>
测试
@Test
public void TestGetAllUserToMap() {
SqlSession sqlSession = SqlSessionUtils.getSqlSession();
SelectMapper mapper = sqlSession.getMapper(SelectMapper.class);
//方法1的输出方式
// mapper.getAllUserToMap().forEach(System.out::println);
//方法2的输出方式
System.out.println(mapper.getAllUserToMap());
}
3)Mybatis的获取参数举例
在ParameterMapper 接口中创建以下方法
public interface ParameterMapper {
/*
* 插入用户
*/
int insertUser(User user);
/*
* 根据用户输入的账户和密码验证登录(Param)
*/
User checkLoginByParam(@Param("username")String username,@Param("password")String password);
/*
* 根据用户输入的账户和密码验证登录(map)
*/
User checkLoginByMap(Map<String,Object> map);
/*
* 根据用户名获取用户信息
*/
User getUserByUserName(String username) ;
/*
* 根据用户输入的账户和密码验证登录
*/
User checkLogin(String username,String password);
/*
* 查询所有的员工信息
**/
List<User> getAllUser() ;
}
在对应的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">
<mapper namespace="com.atguigu.mybatis.mapper.ParameterMapper">
<!--User getUserByUserName(String username) ;-->
<select id="getUserByUserName" resultType="user">
<!--select * from t_user where username = #{username}-->
select * from t_user where username = '${username}'
</select>
<!-- User checkLogin(String username,String password) ;-->
<select id="checkLogin" resultType="user">
<!--select * from t_user where username = #{arg0} and password = #{arg1}-->
select * from t_user where username = '${param1}' and password = '${param2}'
</select>
<!--User checkLoginByMap(Map<String,Object> map);-->
<select id="checkLoginByMap" resultType="user">
<!--select * from t_user where username = #{username} and password = #{password}-->
select * from t_user where username = '${username}' and password = '${password}'
</select>
<!-- int insertUser(User user);-->
<insert id="insertUser">
insert into t_user values(null,#{username},#{password},#{age}, #{sex},#{email})
</insert>
<!--List<User> getAllUser() ;-->
<select id="getAllUser" resultType="user">
select * from t_user;
</select>
</mapper>
测试类写法:
public class ParameterMapperTest {
@Test
public void testInsertUser() {
SqlSession sqlSession = SqlSessionUtils.getSqlSession();
ParameterMapper parameterMapper = sqlSession.getMapper(ParameterMapper.class);
int res = parameterMapper.insertUser(new User(1,"李四","123",24,'男',"123@qq.com"));
System.out.println(res);
}
@Test
public void testcheckLoginByMap() {
SqlSession sqlSession = SqlSessionUtils.getSqlSession();
ParameterMapper parameterMapper = sqlSession.getMapper(ParameterMapper.class);
Map<String,Object> map = new HashMap<>();
map.put("username","admin");
map.put("password","123456");
User user = parameterMapper.checkLoginByMap(map);
System.out.println(user);
}
@Test
public void testcheckLogin() {
SqlSession sqlSession = SqlSessionUtils.getSqlSession();
ParameterMapper parameterMapper = sqlSession.getMapper(ParameterMapper.class);
User user = parameterMapper.checkLogin("admin","123456");
System.out.println(user);
}
@Test
public void testGetUserByUserName() {
SqlSession sqlSession = SqlSessionUtils.getSqlSession();
ParameterMapper parameterMapper = sqlSession.getMapper(ParameterMapper.class);
User user = parameterMapper.getUserByUserName("admin");
System.out.println(user);
}
@Test
public void testGetAllUser() {
SqlSession sqlSession = SqlSessionUtils.getSqlSession();
ParameterMapper parameterMapper = sqlSession.getMapper(ParameterMapper.class);
List<User> list = parameterMapper.getAllUser();
list.forEach(System.out::println);
}
}
/* * 总结: * Mybatis获取参数值的两种方式:#{},${} * ${}本质是字符串连接 * #{}本质是占位符赋值 * Mybatis获取参数值的各种情况 * 1.mapper接口方法的参数为单个的字面量类型 * 可以通过${}和#{}以任意的名称获取参数值,但是需要注意单引号问题 * 2.mapper接口方法的参数为多个时 * 此时mybatis会将参数封装在一个map集合里,以两种方式进行存储 * a > 以arg0,arg1...为键,以参数为值 * b > 以param1,param2...为键,以参数为值 * 因此只需通过#{},${}以键的方式访问值即可,但是需要注意${}的单引号问题 * 3.mapper接口方法的参数为多个时,也可以自定义map * 提前将参数放进map集合,以map为参数传递, * 直接通过#{},${}以自己设定的键访问值即可,但是需要注意${}的单引号问题 * 4.mapper接口方法的参数是实体类类型 * 只需通过#{},${}以属性的方式访问属性值即可,但是需要注意${}的单引号问题 * 5.使用@Param注解命名参数 * 此时mybatis会将参数封装在一个map集合里,以两种方式进行存储 * a > 以@Param的值为键,以参数为值 * b > 以param1,param2...为键,以参数为值 * 因此只需通过#{},${}以键的方式访问值即可,但是需要注意${}的单引号问题 * * * 总结:总的可分为两种情况,一个是参数是实体类的,一个是参数是使用@Param注解 */
4)特殊SQL的执行
即#{}和${}什么时候能用什么时候不能用
Mapper接口中的写法:
public interface SqlMapper {
/*
* 模糊查询测试(like)
*/
List<User> getUserByLike(@Param("username")String username);
/*
* 批量删除
*/
int deleteMore(@Param("ids")String ids);
/*
* 查询指定表的所有数据(动态获取表名)
*/
List<User> getUserByTableName(@Param("tableName")String tableName);
/*
* 插入数据获取主键
*/
void insertUser(User user);
}
对应的xml文件中对应的写法:
<!--List<User> getUserByLike(@Param("username")String username);-->
<select id="getUserByLike" resultType="user">
<!--用#{username}不行,会被当成字符串,不会解析,即 %?%,想用#号只能用第二三种-->
<!--select * from t_user where username like '%${username}%'-->
<!--select * from t_user where username like concat('%',#{username},'%')-->
<!--最常用-->
select * from t_user where username like "%"#{username}"%"
</select>
<!--int deleteMore(@Param("ids")String ids);-->
<delete id="deleteMore">
<!--不能用#{},解析时会自动加上单引号,会报错-->
delete from t_user where id in (${ids});
<!--delete from t_user where id > #{ids};-->
</delete>
<!--List<User> getUserByTableName(@Param("tableName")String tableName);-->
<select id="getUserByTableName" resultType="user">
<!--不能用#{},解析时会自动加上单引号,而表名不能加单引号,会报错-->
select * from ${tableName};
</select>
<!--
void insertUser(User user);
将表中自增的字段赋值到实体类中
useGeneratedKeys:设置当前标签中的sql使用了自增的主键
keyProperty:将自增的主键的值赋值给传输到映射文件中的参数(这里是User)的某个属性(的id属性)
-->
<insert id="insertUser" useGeneratedKeys="true" keyProperty="id">
insert into t_user values(null,#{username},#{password},#{age},#{sex},#{email})
</insert>
测试类的写法:
@Test
public void testGetUserByLike() {
SqlSession sqlSession = SqlSessionUtils.getSqlSession();
SqlMapper mapper = sqlSession.getMapper(SqlMapper.class);
System.out.println(mapper.getUserByLike("a"));
}
@Test
public void testDeleteMore() {
SqlSession sqlSession = SqlSessionUtils.getSqlSession();
SqlMapper mapper = sqlSession.getMapper(SqlMapper.class);
int res = mapper.deleteMore("5");
System.out.println(res);
}
@Test
public void testGetUserByTableName() {
SqlSession sqlSession = SqlSessionUtils.getSqlSession();
SqlMapper mapper = sqlSession.getMapper(SqlMapper.class);
List<User> list = mapper.getUserByTableName("t_user");
System.out.println(list);
}
@Test
public void testInsertUser() {
SqlSession sqlSession = SqlSessionUtils.getSqlSession();
SqlMapper mapper = sqlSession.getMapper(SqlMapper.class);
User user = new User(0,"王五","123",23,'男',"123@qq.com");
mapper.insertUser(user);
System.out.println(user);
//输出结果:User{id=10, username='王五', password='123', age=23, sex=男, email='123@qq.com'}
}
点赞,关注,收藏,您的支持是我更新的最大动力!!!
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/118508.html