简诉网站建设的基本流程,响应式网站wordpress,wordpress首页底部模板修改,营销型文章目录1、MyBatis获取参数值case1-单个字面量类型的参数case2-多个字面量类型的参数case3-map集合类型的参数case4-实体类类型的参数case5-使用Param注解命名参数总结2、MyBatis的各种查询功能case1-查询结果是一个实体类对象case2-查询结果是一个List集合case3-查询单个数据…
文章目录1、MyBatis获取参数值case1-单个字面量类型的参数case2-多个字面量类型的参数case3-map集合类型的参数case4-实体类类型的参数case5-使用Param注解命名参数总结2、MyBatis的各种查询功能case1-查询结果是一个实体类对象case2-查询结果是一个List集合case3-查询单个数据case3-查询一条数据为Map集合case4-查询多条数据为Map集合3、特殊SQL的执行case1-模糊查询case2-批量删除case3-动态设置表名case4-添加功能获取自增的主键1、MyBatis获取参数值
MyBatis获取参数值有两种方式${} 和 #{}
${}的本质是字符串拼接#{}的本质是占位符赋值为字符串类型或日期类型的字段进行赋值时拼接的${}需要手动加单引号占位符则不用
case1-单个字面量类型的参数
当mapper接口的方法的参数是单个的字面量类型
package com.llg.mybatis.mapperpublic interface UserMapper{/*** 根据用户名获取用户信息*/User getUserByUsername(String username);
}
映射文件
!--User getUserByUsername(String username);--
select idgetUserByUsername resultTypeUserselect * from t_user where username #{username}
/select
!--User getUserByUsername(String username);--
select idgetUserByUsername resultTypeUser select * from t_user where username ${username}
/select
当mapper接口的方法的参数是单个的字面量类型此时可以使用${}和#{}以任意的名称最好见名识意获取参数的值注意${}需要手动加单引号 贴个坑 当mapper的方法参数是基础类型且只有一个时在mapper.xml文件中使用${}取值时会报There is no getter for property named ‘id’ in class java.lang.xx’异常 解决方法:--Param注解public AreaDict selectById(Param(id) Integer id);
select * from area_dict where area_dict_id ${id}--将${}换成#{}取值#{}能防止sql注入${}只是简单的字符串替换#{}先进行预处理select * from area_dict where area_dict_id #{id}--通过${value}或${_parameter}取值select * from area_dict where area_dict_id ${_parameter}
select * from area_dict where area_dict_id ${value}case2-多个字面量类型的参数
package com.llg.mybatis.mapperpublic interface UserMapper{/*** 通过用户名和密码验证登录*/User checkLogin(String username,String password);
} 若mapper接口中的方法参数为多个时此时MyBatis会自动将这些参数放在一个map集合中以两种方式进行存储 。以arg0,arg1…为键以参数为值 。以param1,param2…为键以参数为值 通过${}和#{}访问map集合的键就可以获取相对应的值注意${}需要手动加单引号 使用arg或者param都行要注意的是arg是从arg0开始的param是从param1开始的
!--User checkLogin(String username,String password);--
select idcheckLogin resultTypeUser select * from t_user where username #{arg0} and password #{arg1}
/select
!--User checkLogin(String username,String password);--
select idcheckLogin resultTypeUserselect * from t_user where username ${param1} and password ${param2}
/select case3-map集合类型的参数
参考case2的底层原理若mapper接口方法的参数有多个时可以手动将这些参数放在一个自己定义的map中存储此时方法的传参类型为map集合键名自己定义。
public interface UserMapper{/*** 验证登录传参为map集合*/User checkLoginByMap(MapString,Object map);
}
Test
public void checkLoginByMap() {SqlSession sqlSession SqlSessionUtils.getSqlSession();UserMapper mapper sqlSession.getMapper(UserrMapper.class);MapString,Object map new HashMap();map.put(usermane,admin);map.put(password,admin123);User user mapper.checkLoginByMap(map);System.out.println(user);
}
此时获取参数值仍是通过#{}或者${}访问map集合中的键
!--User checkLoginByMap(MapString,Object map);--
select idcheckLoginByMap resultTypeUserselect * from t_user where username #{username} and password #{password}
/select
case3即case2的一种演变不同的是我们手动创建了一个map集合访问的是我们自己定义的键。
case4-实体类类型的参数
mapper接口方法的参数是实体类类型的参数
public interface UserMapper{/*** 添加用户信息*/int insertUser(User user);
}
mapper接口中方法的参数是实体类类型此时可用#{}或者${}通过实体类中的属性名访问属性值。
!--int insertUser(User user);--
insert idinsertUserinsert into t_user values(null,#{username},#{password},#{age},#{sex},#{email})
/insert
测试
Test
public void testInsertUser() {SqlSession sqlSession SqlSessionUtils.getSqlSession();UserMapper mapper sqlSession.getMapper(UserMapper.class);User user new User(null,llg,llg123,23,男,llgqq.com);mapper.insertUser(user);
}
case5-使用Param注解命名参数
加入Param注解后MyBatis就会将这些参数放在Map集合中以两种方式进行存储
以Param注解括号中的值为键以方法的参数为值以自己的方式来设置键名即param1、param2。以参数为值
因此只需通过#{}和${}以键的方式访问值即可。
public interface UserMapper{/*** 验证登录使用Param注解*/User checkLoginByParam(Param(username) String username,Param(password) String password);
}这是case2和3的结合不用我们自己创建Map集合而键名又可以自己定义。
!--User CheckLoginByParam(Param(username) String username, Param(password) String password);--select idCheckLoginByParam resultTypeUserselect * from t_user where username #{username} and password #{password}/select
Test
public void checkLoginByParam() {SqlSession sqlSession SqlSessionUtils.getSqlSession();UserMapper mapper sqlSession.getMapper(UserMapper.class);mapper.CheckLoginByParam(admin,admin123);
}
总结
以上情况可以整合为两种来处理
实体类类型的参数使用Param注解标识参数
2、MyBatis的各种查询功能
如果查询出的数据只有一条可以通过:
实体类对象接收List集合接收Map集合接收结果{password123456, sex男, id1, age23, usernameadmin}
如果查询出的数据有多条一定不能用实体类对象接收会抛异TooManyResultsException可以通过:
实体类类型的LIst集合接收Map类型的LIst集合接收ListMapString,Object在mapper接口的方法上添加MapKey注解
case1-查询结果是一个实体类对象
/*** 根据用户id查询用户信息* param id* return*/
User getUserById(Param(id) int id);
!--User getUserById(Param(id) int id);--
select idgetUserById resultTypeUserselect * from t_user where id #{id}
/select
case2-查询结果是一个List集合
/*** 查询所有用户信息* return*/
ListUser getUserList();
!--ListUser getUserList();--
select idgetUserList resultTypeUserselect * from t_user
/select
case3-查询单个数据
/** * 查询用户的总记录数 * return * 在MyBatis中对于Java中常用的类型都设置了类型别名(类型别名不区分大小写) * 例如java.lang.Integer--int|integer * 例如int--_int|_integer * 例如Map--map,List--list */
Integer getCount();
注意这里的resultType我们需要将查询结果转换为一个int而不是User这里使用java.lang.Integer类的别名
!--int getCount();--
select idgetCount resultType_integerselect count(*) from t_user
/select
在MyBatis中对于Java中常用的类型都设置了类型别名 case3-查询一条数据为Map集合
当我们查询出来的数据没有任何一个实体类可以与之对应这个时候就可以将它转换为一个Map集合以字段为键以字段的值为值。
/** * 根据用户id查询用户信息为map集合 * param id * return */
MapString, Object getUserToMap(Param(id) int id);
!--MapString, Object getUserToMap(Param(id) int id);--
select idgetUserToMap resultTypemapselect * from t_user where id #{id}
/select
!--结果{password123456, sex男, id1, age23, usernameadmin}--
case4-查询多条数据为Map集合
使用Map类型的List集合
一条数据对应一个map若有多条数据就会产生多个map集合此时可以将这些map放在一个list集合中获取
/** * 查询所有用户信息为map集合 * return */
ListMapString, Object getAllUserToMap();
!--MapString, Object getAllUserToMap();--
select idgetAllUserToMap resultTypemap select * from t_user
/select
!--结果[{password123456, sex男, id1, age23, usernameadmin},{password123456, sex男, id2, age23, username张三},{password123456, sex男, id3, age23, username张三}]
--
使用MapKey注解
在mapper接口的方法上添加注解MapKey此时将每条数据转换的map集合做为值以某个字段的值做为键放在同一个Map集合中
/*** 查询所有用户信息为map集合* return* 通过MapKey注解设置map集合的键值是每条数据所对应的map集合*/
MapKey(id)
MapString, Object getAllUserToMap();
!--MapString, Object getAllUserToMap();--
select idgetAllUserToMap resultTypemapselect * from t_user
/select
!--结果{1{password123456, sex男, id1, age23, usernameadmin},2{password123456, sex男, id2, age23, username张三},3{password123456, sex男, id3, age23, username张三}}
--
3、特殊SQL的执行
在执行一些特殊的SQL的时候直接使用${}或者#{}会有问题需要额外做一些处理
case1-模糊查询
/*** 根据用户名进行模糊查询* param username * return */
ListUser getUserByLike(Param(username) String username);
映射文件
!--ListUser getUserByLike(Param(username) String username);--
select idgetUserByLike resultTypeUser!--select * from t_user where username like %${adm}%-- !--select * from t_user where username like concat(%,#{adm},%)-- select * from t_user where username like %#{adm}%
/select
模糊查询的SQL三种写法
使用${}获取参数使用concat函数拼接直接使用双引号最常用select * from t_user where username like %#{adm}%
case2-批量删除
批量删除只能使用${}若使用#{}SQL变为
#{}自动加一个单引号导致SQL语法错误delete from t_user where id in (1,2,3);正确的SQL应为
delete from t_user where id in (1,2,3)delete from t_user where id in (1,2,3)/*** 根据id批量删除* param ids * return int*/
int deleteMore(Param(ids) String ids);
delete iddeleteMoredelete from t_user where id in (${ids})
/delete//测试类
Test
public void deleteMore() {SqlSession sqlSession SqlSessionUtils.getSqlSession();SQLMapper mapper sqlSession.getMapper(SQLMapper.class);int result mapper.deleteMore(1,2,3);System.out.println(result);
}
case3-动态设置表名
和批量删除一样若表名使用#{}获取则SQL语法错误只能使用${}来实现
/*** 查询指定表中的数据* param tableName */
ListUser getUserByTable(Param(tableName) String tableName);!--ListUser getUserByTable(Param(tableName) String tableName);--
select idgetUserByTable resultTypeUserselect * from ${tableName}
/selectcase4-添加功能获取自增的主键
业务场景 。 添加班级信息 。 添加学生信息 。 为班级分配学生即将某学生的班级id改为新添加的班级的id
t_class(class_id,class_name)
t_student(student_id,student_name,class_id)//一对多的关系关联字段加在多的一方Mapper接口
/*** 添加用户信息* param user */
void insertUser(User user);
映射文件
!--void insertUser(User user);--
insert idinsertUser useGeneratedKeystrue keyPropertyidinsert into t_user values (null,#{username},#{password},#{age},#{sex},#{email})
/insert
注意两个属性
useGeneratedKeys设置当前标签中的SQL使用了自增的主键keyProperty将自增的主键的值赋给传输到映射文件中参数的某个属性
(因为增删改有统一的返回值是受影响的行数因此只能将获取的自增的主键放在传输的参数user对象的某个属性中)
//测试类
Test
public void insertUser() {SqlSession sqlSession SqlSessionUtils.getSqlSession();SQLMapper mapper sqlSession.getMapper(SQLMapper.class);User user new User(null, test2, test123, 23, 男, test2qq.com);mapper.insertUser(user);System.out.println(user);//输出user{id10, usernameton, password123, age23, sex男, email123321.com}自增主键存放到了user的id属性中
}