万能的map:假如实体类(数据库中的表)字段数或参数过多,应当考虑到使用map。(因为如果写一个sql语句,前端传回来的数据就几个而且需要传入的参数类型是实体类,那么我们在contorller层就要构造一个有很多null值的对象传入这样就很麻烦,使用map就很简便了)
xml配置文件中parameterType属性是传参数的类型,如果是基本类型可以省略。下边看一下map的使用。
public interface UserMapper { //dao层接口 int addUser2(Map<String,Object> map); }
<!--xml中的sql语句--> <insert id="addUser2" parameterType="map"> insert into mybatis.user(id,name,pwd) values(#{mapId},#{mapName},#{mapPwd}) </insert>
//测试map的使用 @Test public void addUser2(){ SqlSession sqlSession = MybatisUtil.getSqlSession(); UserMapper mapper = sqlSession.getMapper(UserMapper.class); HashMap<String, Object> map = new HashMap<>(); map.put("mapId",6); map.put("mapName","李四"); map.put("mapPwd","456789"); mapper.addUser2(map); sqlSession.commit(); sqlSession.close(); }
Map传递参数,直接在sq|中取出key即可! [parameterType="map"]
对象传递参数,直接在sq|中取对象的属性即可! [parameterType="Object"]
只有一个基本类型参数的情况下,可以直接在sq|中取到!
多个参数用Map,或者注解!
解决实体类的属性名和数据库中表的字段名不一致的问题(如果不一致,取出来的对象会出现属性值为空的情况)
解决方案一:在sql语句中取别名,将取出的字段名取别名成和实体类中相对应的属性名。
解决方案二:使用resultMap结果集映射,select查询语句中将resultType属性换成resultMap,然后再写一个resultMap标签,其中id属性对应标签名,type属性是返回值类型,里面有一个result标签,column属性是数据库中的字段名,property属性是实体类的字段名。(数据库中取出来的结果是通过字段名和属性名映射来获取一个实体类的对象,不一致就会出现属性值为空的情况,这时我们使用resultMap将结果存放在里面,然后通过字段名和属性名不一致的一次映射来获取)
<resultMap id="UserMap" type="User"> <result column="pwd" property="password"/> </resultMap> <select id="getUserById" parameterType="int" resultMap="UserMap"> select * from mybatis.user where id = #{id} </select>
●resultmap 元素是MyBatis中最重要最强大的元素
●ResultMap的设计思想是,对于简单的语句根本不需要配置显式的结果映射,而对于复杂-点的语句
只需要描述它们的关系就行了。