当前位置: 代码迷 >> 综合 >> 从头学mybatis框架(四)-CRUD
  详细解决方案

从头学mybatis框架(四)-CRUD

热度:97   发布时间:2023-12-16 04:10:46.0

文章目录

  • 查询
  • 更新
  • 删除
  • 插入
  • 封装实体类作为参数

  • 接下来介绍使用mybatis进行数据库的增删改查操作。我们使用的是基于xml的方式。
  • 主要改动为IUserDao接口(定义函数名、参数以及返回值类型)和IUserDao.xml文件(定义SQL语句)。
  • 并在MybatisTest中进行测试

查询

IUserDao接口:

  //查找所有用户List<User> findAll();//根据id查找用户User findUser(int id);//模糊查询List<User> findByName(String s);

IUserDao.xml:

 <!--查找所有用户--><select id="findAll" resultType="com.cjx.domain.User">select * from user</select><!--根据id查询用户,parameterType表示参数类型,#{
    0}中的0只是一个占位符--><select id="findUser" parameterType="int" resultType="com.cjx.domain.User">select * from user WHERE id=#{
    0}</select><!--模糊查询--><select id="findByName" parameterType="String"resultType="com.cjx.domain.User">select * from user where username like #{
    username}</select>

MybatisTest:

public class MybatisTest  {
    InputStream in;SqlSession sqlSession;IUserDao iUserDao;@Before//使用注解方式,表示该方法在测试方法(@Test)之前执行public void init() throws Exception{
    //1、解析xmlin= Resources.getResourceAsStream("SqlMapConfig.xml");//2、构建SqlSessionFactory工厂SqlSessionFactory sqlSessionFactory=new SqlSessionFactoryBuilder().build(in);//3、利用工厂创建SqlSession对象sqlSession=sqlSessionFactory.openSession();//4、使用sqlSession创建代理对象iUserDao= sqlSession.getMapper(IUserDao.class);}@After//该方法在测试方法之后执行public void destory()throws Exception {
    sqlSession.commit();//提交事务,否则增删改不会成功in.close();sqlSession.close();}//查找所有用户public void findAll(){
    List<User> list=iUserDao.findAll();for(User user:list)System.out.println(user);}@Test//根据id查找用户public void findUserById(){
    User user=iUserDao.findUserById(1);System.out.println(user);}
}@Test//模糊查询public void findByName(){
    List<User>list=iUserDao.findByName("%a");for(User user:list)System.out.println(user);}

测试结果:
findAll():
在这里插入图片描述
findUserById():
在这里插入图片描述
findByName():
在这里插入图片描述

更新

IUserDao接口:

    //根据id更新name,用map保存id和namevoid updateName(Map<String ,String> map);

IUserDao.xml:

    <!--根据id更新用户name,#{
    name}代表key为name的value值,同理于#{
    id}--><update id="updateName" parameterType="map" >UPDATE user set username=#{
    name}WHERE id=#{
    id};</update>

测试类:

  @Test//更新用户public void updateUsernameById(){
    Map<String,String> map=new HashMap<String, String>();map.put("name","aa");map.put("id","1");iUserDao.updateName(map);}

执行结果:
在这里插入图片描述

删除

IUserDao接口:

 //删除用户void deleteUser(int id);

IUserDao.xml:

 <!--删除用户--><delete id="deleteUser" parameterType="int">delete from user where id=#{
    id};</delete>

测试类:

  @Test//删除用户public void deleteUser(){
    iUserDao.deleteUser( 2);}

执行结果:
在这里插入图片描述

插入

IUserDao接口:

    //保存新用户void saveUser(User user);

IUserDao.xml:

    <!--保存用户,User类自动生成get和set方法,#{
    xxx}中可以直接用属性名--><insert id="saveUser" parameterType="com.cjx.domain.User"><!--返回插入数据的id,order="AFTER",表示插入数据后执行--><selectKey keyProperty="id" keyColumn="id" resultType="int" order="AFTER">select last_insert_id()</selectKey>INSERT into user (username,birthday,sex,address)VALUES (#{
    username},#{
    birthday},#{
    sex},#{
    address})</insert>

测试类:

    @Test//保存新用户public void saveUser(){
    User user=new User(10,"b",null,"g","bbbb");iUserDao.saveUser(user);}

执行结果:
在这里插入图片描述

封装实体类作为参数

IUserDao接口:

//将实体类包装起来,并将其属性作为查询条件List<User> findUserByVo(QueryVo vo);

QueryVo 类,封装User类:

package com.cjx.domain;public class QueryVo {
    private User user;public User getUser() {
    return user;}public void setUser(User user) {
    this.user = user;}
}

IUserDao.xml

    <!--使用类对象作为parameterType参数进行模糊查询,#{
    user.username}其中user是QueryVo的成员变量,而username是User的成员变量--><select id="findUserByVo" parameterType="com.cjx.domain.QueryVo" resultType="com.cjx.domain.User">select * from user where username like #{
    user.username}</select>

测试类:

   @Test//QueryVo作为参数进行查询public void findUserByVo(){
    QueryVo vo=new QueryVo();User user=new User();user.setUsername("%a");vo.setUser(user);List<User>users=iUserDao.findUserByVo(vo);for(User u:users)System.out.println(u);}

执行结果:
在这里插入图片描述

  相关解决方案