3. CRUD
3.1 namespace
namespace中的包名要和mapper接口一致
3.2 查询语句
- id:就是对应的namespace中的方法名
- resultType:Sql语句执行的返回值
- parameterType:参数类型
- 注意点:增删改需要提交事务 sqlSession.commit()!!!
3.2.1 Select
-
编写接口
//根据ID查询用户 User getUserById(int id);
-
编写对应mapper中的sql语句
<select id="getUserById" parameterType="int" resultType="com.Yurrize.pojo.User"> select * from mybatis.user where id=#{id} </select>
-
测试
@Test public void getUserById(){ SqlSession sqlSession = MyBatisUtils.getSqlSession(); UserMapper mapper = sqlSession.getMapper(UserMapper.class); User userById = mapper.getUserById(1); System.out.println(userById); sqlSession.close(); }
3.2.2 Insert(需要提交事务)
-
编写接口
//insert一个用户 int addUser(User user);
-
编写对应mapper中的sql语句
<!--对象中的属性可以直接取出来--> <insert id="addUser" parameterType="com.Yurrize.pojo.User"> insert into mybatis.user(id, name, pwd) values (#{id},#{name},#{pwd}); </insert>
-
测试
//增删改需要提交事务 @Test public void addUser(){ SqlSession sqlSession = MyBatisUtils.getSqlSession(); UserMapper mapper = sqlSession.getMapper(UserMapper.class); int res=mapper.addUser(new User(4,"小智","852369")); if(res>0){ System.out.println("插入成功"); } //提交事务 sqlSession.commit(); sqlSession.close(); }
3.2.3 Update(需要提交事务)
-
编写接口
//修改用户 int updateUser(User user);
-
编写mapper中对应的sql语句
<update id="updateUser" parameterType="com.Yurrize.pojo.User"> update mybatis.user set name=#{name},pwd=#{pwd} where id=#{id}; </update>
-
测试
@Test public void updateUser(){ SqlSession sqlSession = MyBatisUtils.getSqlSession(); UserMapper mapper = sqlSession.getMapper(UserMapper.class); mapper.updateUser(new User(4,"小昔","5262356")); sqlSession.commit(); sqlSession.close(); }
3.2.4 Delete(需要提交事务)
-
编写接口
//删除用户 int deleteUser(int id);
-
编写mapper中的sql语句
<delete id="deleteUser" parameterType="int"> delete from mybatis.user where id=#{id}; </delete>
-
测试
@Test public void deleteUser(){ SqlSession sqlSession = MyBatisUtils.getSqlSession(); UserMapper mapper = sqlSession.getMapper(UserMapper.class); mapper.deleteUser(2); sqlSession.commit(); sqlSession.close(); }
3.3 分析错误
-
标签注意不要匹配错误
-
resource绑定mapper需要时路径* */ *****/ ****
-
程序配置文件需要符合规范
-
java.lang.NullPointerException空指针异常,没有注册到资源
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-J4jQdorJ-1648437028952)(C:\Users\12044\AppData\Roaming\Typora\typora-user-images\image-20220310153439354.png)]
-
输出xml文件中存在乱码问题,UTF-8编码
-
maven资源没有导出
3.4 万能的Map
假设,我们的实体类,或者数据据中的表,字段参数过多,我们应当使用map
//万能的Map
int addUser2(Map<String,Object>map);
<insert id="addUser2" parameterType="map">
insert into mybatis.user(id,name,pwd) values (#{id},#{name},#{password});
</insert>
@Test
public void addUser2(){
SqlSession sqlSession = MyBatisUtils.getSqlSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
HashMap<String, Object> map = new HashMap<>();
map.put("id",5);
map.put("name","小哥哥");
map.put("password",5154665);
mapper.addUser2(map);
sqlSession.commit();
sqlSession.close();
}
Map传递参数,直接在sql中取出key即可 (parameterType=“map”)
对象传递参数,直接在sql中取出对象即可(parameterType=“com.Yurrize.pojo.User”)
只有一个基本类型参数的情况下,可以直接在sql类型中取到 (parameterType=“int”)
多个参数用Map,或者注解
3.5 模糊查询
通常:
<select id="getUserLike" resultType="com.Yurrize.pojo.User">
select * from mybatis.user where name like #{value}
</select>
List<User> userList = mapper.getUserLike("%小%");
问题: select * from mybatis.user where id=?
select * from mybatis.user where id=1(正常)
select * from mybatis.user where id=1 or 1=1(异常)
用#防止出现sql注入:
<select id="getUserLike" resultType="com.Yurrize.pojo.User">
select * from mybatis.user where name like "%"#{value}"%"
</select>
List<User> userList = mapper.getUserLike("小");