文章目录
增删改查实现
所有的操作只跟接口和配置文件有关,
实体类和工具类不需要变
只需要修改接口、配置文件、测试类
1、namespace
namespace中的包名要和 Dao/mapper接口的包名一致!
2、select
选择,查询语句
- id:对应的namespace中的方法名
- resultType:Sql语句执行的返回值!
- 返回值:类/基本数据类型,以类为准
- parameterType:参数的类型
步骤:
-
编写接口
-
//根据ID查询用户 User getUserById(int id);
-
-
编写对应的mapper中的sql语句
-
<select id="getUserById" parameterType="int" resultType="com.yin.pojo.User"> select * from user where id = #{id} </select>
-
-
测试(增删改需要提交事务)
-
@Test public void getUserById(){ //获取执行sql的对象 SqlSession sqlSession = MybatisUtils.getSqlSession(); //获得接口 UserMapper mapper = sqlSession.getMapper(UserMapper.class); User user = mapper.getUserById(1); System.out.println(user); sqlSession.close(); }
-
3、insert
//插入一个用户
int addUser(User user);
<!--对象中的属性,可以直接取出来-->
<insert id="addUser" parameterType="com.yin.pojo.User" >
insert into user (id,name ,pwd)
values (#{id},#{name},#{pwd});
</insert>
@Test
//增删改需要提交事务
public void addUser(){
//获取执行sql的对象
SqlSession sqlSession = MybatisUtils.getSqlSession();
//获得接口
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
//增加用户
int user = mapper.addUser(new User(4, "赵六", "123"));
if (user > 0){
System.out.println("插入成功!");
}
//提交事务
sqlSession.commit();
sqlSession.close();
}
4、updata
//修改一个用户
int upDataUser(User user);
<update id="upDataUser" parameterType="com.yin.pojo.User">
update user
set id = #{id}, name = #{name}, pwd = #{pwd}
where id = #{id};
</update>
//修改一个用户
@Test
public void upDataUser(){
//获得执行sql的对象
SqlSession sqlSession = MybatisUtils.getSqlSession();
//得到接口
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
mapper.upDataUser(new User(3,"小明","123"));
sqlSession.commit();
sqlSession.close();
}
5、delete
//删除一个用户
int deleteUser(int id);
<delete id="deleteUser" parameterType="int">
delete
from user
where id = #{id};
</delete>
//删除一个用户
@Test
public void deleteUser(){
SqlSession sqlSession = MybatisUtils.getSqlSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
mapper.deleteUser(4);
sqlSession.commit();
sqlSession.close();
}
注意
- 增删改,需要提交事务
6、分析错误
- 标签不要匹配错误
- resource 绑定Mapper需要使用路径:/分开
- 程序配置文件必须符合规范
- 空指针异常:NullPointerException,没有注册到资源
- 不能这样定义
- 输出xml文件存在中文乱码问题!
- maven资源没有导出问题
读错方式
从下往上读,如:
7、万能的Map
假设,我们的实体类,或者数据库中的表,字段或者参数过多,我们应当考虑使用Map!
-
Map传递参数,直接在sql中取出key即可!
-
parameterType="map"
-
-
对象传递参数,直接在sql中取对象的属性即可!
-
parameterType="com.yin.pojo.User" //(对象)
-
-
只有一个基本类型参数的情况下,可以直接在sql中取到!
- 可以不写,基本参数类型
-
多个参数用Map,或者注解!
添加用户
//万能的map 好处:不需要知道数据库中有什么,只需要查对应的字段
int addUser2(Map<String,Object> map);
<!--map
values中:传递的是map中的key,可以自定义-->
<insert id="addUser2" parameterType="map" >
insert into user (id, name, pwd)
values (#{userid}, #{userName}, #{userWord});
</insert>
//map
@Test
public void addUser2(){
SqlSession sqlSession = MybatisUtils.getSqlSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
Map<String, Object> map = new HashMap<>();
map.put("userid",6);
map.put("userName","小花");
map.put("userWord",123);
mapper.addUser2(map);
//提交事务
sqlSession.commit();
sqlSession.close();
}
查看用户
User getUserById2(Map<String, Object> map);
<select id="getUserById2" parameterType="map" resultType="com.yin.pojo.User">
select * from user where id = #{id} and name = #{name }
</select>
@Test
public void getUserById2(){
SqlSession sqlSession = MybatisUtils.getSqlSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
Map<String, Object> map = new HashMap<>();
map.put("id",1);
map.put("name","张三");
User userById2 = mapper.getUserById2(map);
System.out.println(userById2);
sqlSession.close();
}
==========================================
User{id=1, name='张三', pwd='123'}
8、模糊查询
模糊查询这么写?
在项目中遇到的问题,业务中遇到
Java代码执行的时候,传递通配符% %
安全的
关键代码
List<User> userLike = mapper.getUserLike("%小%");
代码实现
//模糊查询
List<User> getUserLike(String value);
<!--模糊查询-->
<select id="getUserLike" resultType="com.yin.pojo.User">
select * from mybatis.user where name like #{value}
</select>
@Test
public void getUserLike(){
SqlSession sqlSession = MybatisUtils.getSqlSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
List<User> userLike = mapper.getUserLike("%小%");
for (User user : userLike) {
System.out.println(user);
}
sqlSession.close();
}
//输出
User{id=3, name='小明', pwd='123'}
User{id=6, name='小花', pwd='123'}
在sql拼接中使用通配符
不安全,会出现sql注入
<!--sql注入:让where 这第一段失效
select * from mybatis.user where id = ? //?让用户传递
select * from mybatis.user where id = 1 or 1=1 //用户传递 id = 1 or 1=1 会查出全部用户
-->
<select id="getUserLike" resultType="com.yin.pojo.User">
select * from mybatis.user where name like "%"#{value}"%"
</select>
List<User> userLike = mapper.getUserLike("小");
防止sql注入问题的方法
-
在这里写死,让用户能传递的只有一个稳定的值
-
<select id="getUserLike" resultType="com.yin.pojo.User"> select * from mybatis.user where name like #{value} </select>