3、CRUD

文章目录

增删改查实现

所有的操作只跟接口和配置文件有关,

实体类和工具类不需要变

只需要修改接口、配置文件、测试类

1、namespace

namespace中的包名要和 Dao/mapper接口的包名一致!

2、select

选择,查询语句

  • id:对应的namespace中的方法名
  • resultType:Sql语句执行的返回值!
    • 返回值:类/基本数据类型,以类为准
  • parameterType:参数的类型

步骤:

  1. 编写接口

    1. //根据ID查询用户
      User getUserById(int id);
      
  2. 编写对应的mapper中的sql语句

    1. <select id="getUserById" parameterType="int" resultType="com.yin.pojo.User">
        select * from user where id = #{id}
      </select>
      
  3. 测试(增删改需要提交事务)

    1. @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,没有注册到资源
    • 不能这样定义
    • 3、CRUD
  • 输出xml文件存在中文乱码问题!
  • maven资源没有导出问题

读错方式

从下往上读,如:
3、CRUD

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>
    
上一篇:这么简单的问题面试时都答不出,还以为你多牛逼呢...


下一篇:mysql插入数据库时间和实际时间不一致---(还没试)