SSM框架之_Mybatis入门笔记,详解快速上手(二):增删改查篇

CRUD

增删改操作,执行完sql后,需要提交事务,否则不生效。

查询不需要提交事务。

通过SqlSession对象提交事务。


参数格式

sql语句中填写参数的格式:#{}

在sql语句中填写参数时,如果接口中的参数是类,那么可以直接写类中的属性,如果不是类,接口中的方法参数是什么,就写什么。


select

  • id:对应namespace中的方法名
  • resulteType:sqlj返回值结果的数据类型
  • parameterType:sql参数类型

步骤:

  1. 在接口中定义方法。
  2. 在mapper.xml中定义sql语句。

接口中的方法:

List<User> getUserList();

sql语句

<select id="getUserList" resultType="top.jarvaniv.pojo.User">
	select * from test.temp
</select>

执行:

//    查询所有用户
@Test
public void getUserListTest(){
   
     

	SqlSession sqlSession = MyBatisUtils.getSqlSession();
    UserMapper userDao = sqlSession.getMapper(UserMapper.class);
    List<User> userList = userDao.getUserList();

    for (User user : userList) {
   
     
    	System.out.println(user);
    }

    sqlSession.close();	// 一定要关闭资源
}

insert

接口中的方法:

// 插入数据,User类型,返回值是插入了多少数据
int insertUser(User user);

sql语句

<insert id="insertUser" parameterType="top.jarvaniv.pojo.User">
--填参数时,可以直接使用user对象中的属性名进行调用
    insert into test.temp (id,name) values (#{id},#{name})
</insert>

执行

//    插入用户
    @Test
    public void insertUserTest(){
   
      
//        在工具类中获取SqlSession对象
        SqlSession sqlSession = MyBatisUtils.getSqlSession();
//        加载mapper类型,获取UserMapper接口类型的对象
        UserMapper userMapper = sqlSession.getMapper(UserMapper.class);

        userMapper.insertUser(new User(101,"张三"));

        sqlSession.commit();    // 增删改 要提交事务

        sqlSession.close(); //最后一定记得要关闭资源
    }

update

接口中的方法:

// 修改数据,根据id值,将数据库中对应id值的数据改成参数user中的数据,返回值是修改了多少条数据
int updataUser(User user);

sql语句

<update id="updataUser" parameterType="top.jarvaniv.pojo.User">
-- 根据参数user,修改数据表中的数据
    update test.temp set name=#{
   
       name} where id=#{
   
       id}
</update>

执行

//    修改用户名字
    @Test
    public void updataUserTest(){
   
       
        SqlSession sqlSession = MyBatisUtils.getSqlSession();
        UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
        int result = userMapper.updataUser(new User(100, "李四"));

        sqlSession.commit();
        if (result > 0 ){
   
       
            System.out.println("修改成功");
        }

        sqlSession.close();
    }

delete

接口中的方法:

// 删除数据,根据User的id值删除,返回值是删除了多少条数据
int deleteUser(int id );

sql语句

<delete id="deleteUser" parameterType="int">
-- 根据用户id值删除
-- 直接将方法中的参数传入进来
    delete from test.temp where id=#{
   
        id}
</delete>

执行

//    根据id删除用户
    @Test
    public void deleteUserTest(){
   
        
        SqlSession sqlSession = MyBatisUtils.getSqlSession();
        UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
        int result = userMapper.deleteUser(24);
        sqlSession.commit();
        if (result > 0){
   
        
            System.out.println("删除成功");
        }
        sqlSession.close();
    }

万能map

如果实体类或者数据库表字段太多,那么在插入、修改等操作时,即使仅仅需要修改一个字段,那么也需要写很多不需要的字段,很麻烦,因此,可以用map集合,把需要使用的字段存入到map集合中,在执行sql语句时,通过取map集合中的数据,来向sql语句中插入数据。

由多个参数不好操作时,可以用map。


接口中方法:

//    使用map集合修改temp表数据
    int updataOfMapTemp(Map map);

sql语句:

<update id="updataOfMapTemp" parameterType="map">
    --可以直接调用map集合中的键
    update test.temp set name=#{name} where id=#{id}
</update>

执行:

//    通过map修改temp表数据
    @Test
    public void updataOfMapTempTest() {
   
          
        SqlSession sqlSession = MyBatisUtils.getSqlSession();
        UserMapper userMapper = sqlSession.getMapper(UserMapper.class);

        Map<String,String> map = new HashMap<>();
        map.put("id","23");
        map.put("name","王五");

        userMapper.updataOfMapTemp(map);

        sqlSession.commit();

        sqlSession.close();
    }

模糊查询问题

模糊查询时,模糊的部分(字符)在sql语句中写死(类似于预编译),防止sql的依赖注入。




实体类属性名与数据库字段名不匹配的问题


问题:

将数据库中查询结果存放的数据库中时,如果类中的属性名和数据库字段名不一致(例如:pws与password),那么,读取出来的password就是null。


解决方式:

方法一:

在SQL查询语句中,将数据库字段起别名为实体类的属性名。

将数据库字段pwd,设置别名password,与实体类的属性名一致。

<select id="selectUserById" resultType="User">
  select id , name , pwd as password from user where id = #{id}
</select>

这种方式不建议使用。不方便。


方法二:结果集映射(resultMap)

映射实体类与数据库表字段之间的关系

<!-- 要将查询的结果映射成一个User对象-->
<resultMap id="UserMap" type="User">
   <!-- id为主键 -->
   <id column="id" property="id"/>
   <!-- column是数据库表的列名 , property是对应实体类的属性名 -->
   <result column="name" property="name"/>
   <result column="pwd" property="password"/>
</resultMap>

<!-- resultMap设置使用哪个resultMap映射 -->
<select id="selectUserById" resultMap="UserMap">
  select id , name , pwd from user where id = #{id}
</select>

对于字段名与属性名相同的字段,可以不用在映射中写,只需要写字段名与属性名不一致的部分。例如:上个例子中的idname,字段名与属性名是一样的,就可以在resultMap省略不写,只映射不同的pwd与password。














發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章