MyBatis添加,修改,删除操作

上2篇博客写了如何带参查询和动态sql查询。下面说一说怎么进行添加,修改,删除操作。

添加:

步骤还是一样,现在Mapper中定义好相应接口。

void add(brand brand);

然后按着option,在按俩次回车,就可以在Mapper.xml文件中生成对应的方法:

<insert id="add">
        insert into sql_store.customers (city,points,first_name,last_name,address,state)
        value (#{city},#{points},#{firstName},#{lastName},#{address},#{state})
    </insert>

然后就是对应的 测试方法:

@Test
    public void add() throws IOException {
        //接收参数
        String city="a";
        int points=12;
        String firstName="B";
        String lastName="S";
        String address="A";
        String state="C";

        //手动处理参数
        //city="%"+city+"%";
        //firstName="%"+firstName+"%";



        //封装对象
        brand brand=new brand();
        // brand.setId(id);
        brand.setCity(city);
        brand.setPoints(points);
        brand.setFirstName(firstName);
        brand.setLastName(lastName);
        brand.setAddress(address);
        brand.setState(state);

        //1.获取SqlSessionFactory。
        String resource = "mybatis-config.xml";
        InputStream inputStream = Resources.getResourceAsStream(resource);
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);

        //2.获取sqlSession对象
        SqlSession sqlSession = sqlSessionFactory.openSession();
        //传入参数true,改为自动提交事务
        //SqlSession sqlSession = sqlSessionFactory.openSession(true);

        //3.获取Mapper接口的代理对象
        brandMapper brandMapper = sqlSession.getMapper(brandMapper.class);

        //4.执行方法
        brandMapper.add(brand);
        Integer id1 = brand.getId();
        System.out.println(id1);

        //提交事务
        sqlSession.commit();

        //5.释放资源
        sqlSession.close();
    }

在idea执行add操作,要添加提交事务的步骤:sqlSession.commit  否则就算在idea显示执行成功,在数据库表中也不会显示任何变化。提交事务有2种方式:  一种就是sqlSession.commit;   另一种是SqlSession sqlSession = sqlSessionFactory.openSession(true);传入true参数表示自动提交事务。

  另外如果我们想执行添加操作的同时返回生成的主键id,目前的代码是无法实现该功能的,因为在写sql语句时,我们没有写关于主键id的任何语句。

我们只需要稍微改一下

<insert id="add" useGeneratedKeys="true" keyProperty="id">
        insert into sql_store.customers (city,points,first_name,last_name,address,state)
        value (#{city},#{points},#{firstName},#{lastName},#{address},#{state})
    </insert>

useGeneratedKeys="true" keyProperty="id" 用于设置主键返回 keyProperty后的id为brand中的实体属性,不是数据库中的字段 。

这样我们就可以返回添加新数据的对应主键id了。

修改操作:

  修改全部:接口方法

int update(brand brand);

接口方法返回值可以为void,也可以是int,我设置成int 是想返回修改的行数。

sql语句

   1、修改全部,如果修改过程中若未声明该字段的值,则默认修改为null。

<update id="update">
        update sql_store.customers
        set city =#{city},
            points=#{points},
            first_name=#{firstName},
            last_name=#{lastName},
            address=#{address},
            state=#{state}
        where customer_id=#{id}
    </update>

   2、动态修改,只需要其中的部分条件,未声明要修改的不变。

 <update id="update">
        update sql_store.customers
        <!--set-->
        <set>
            <if test="city!=null and city!=''">
                city =#{city},
            </if>
            <if test="points!=null">
                points=#{points},
            </if>
            <if test="firstName!=null and firstName!=''">
                first_name=#{firstName},
            </if>
            <if test="lastName!=null and lastName!=''">
                last_name=#{lastName},
            </if>
            <if test="address!=null and address!=''">
                address=#{address},
            </if>
            <if test="state!=null and state!=''">
                state=#{state}
            </if>
        </set>
        where customer_id=#{id}
    </update>

不用<set>标签,用set,这样写有俩个问题,问题一:逗号问题,如果最后一个if不存在,那么sql语句最后会多一个逗号,导致报错
问题二:如果set中的所有if都不存在,那么set也就没存在的必要了
解决办法 用<set>标签代替set。

测试方法

@Test
    public void update() throws IOException {
        //接收参数
        int id=16;
        String city="a";
        int points=32;
        String firstName="Q";
        String lastName="S";
        String address="E";
        String state="C";

        //手动处理参数
        //city="%"+city+"%";
        //firstName="%"+firstName+"%";
        
        //封装对象
        brand brand=new brand();
        brand.setCity(city);
        brand.setPoints(points);
        brand.setFirstName(firstName);
        brand.setLastName(lastName);
        brand.setAddress(address);
        brand.setState(state);
        brand.setId(id);

        //1.获取SqlSessionFactory。
        String resource = "mybatis-config.xml";
        InputStream inputStream = Resources.getResourceAsStream(resource);
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);

        //2.获取sqlSession对象
        SqlSession sqlSession = sqlSessionFactory.openSession();
        //传入参数true,改为自动提交事务
        //SqlSession sqlSession = sqlSessionFactory.openSession(true);

        //3.获取Mapper接口的代理对象
        brandMapper brandMapper = sqlSession.getMapper(brandMapper.class);

        //4.执行方法
        int count = brandMapper.update(brand);
        System.out.println(count);

        //提交事务
        sqlSession.commit();

        //5.释放资源
        sqlSession.close();
    }

删除操作

  单个删除

    接口方法

void deleteById(int id);

   sql语句

 <delete id="deleteById">
        delete from sql_store.customers
        where customer_id=#{id}
    </delete>

测试方法

@Test
    public void deleteById() throws IOException {
        //接收参数
        int id=16;

        //1.获取SqlSessionFactory。
        String resource = "mybatis-config.xml";
        InputStream inputStream = Resources.getResourceAsStream(resource);
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);

        //2.获取sqlSession对象
        SqlSession sqlSession = sqlSessionFactory.openSession();
        //传入参数true,改为自动提交事务
        //SqlSession sqlSession = sqlSessionFactory.openSession(true);

        //3.获取Mapper接口的代理对象
        brandMapper brandMapper = sqlSession.getMapper(brandMapper.class);

        //4.执行方法

        brandMapper.deleteById(id);
        //提交事务
        sqlSession.commit();

        //5.释放资源
        sqlSession.close();
    }

  批量删除,这时候接口方法中不能只传一个id了,需要传入一个id的数组

   接口方法

void deleteByIds(int[] ids);

  sql语句

<delete id="deleteByIds">
        delete from sql_store.customers
        where customer_id
        in
        <foreach collection="array" item="id" separator="," open="(" close=")">
            #{id}
        </foreach>
    </delete>

       foreach标签:collection为数组名,item为元素,separator为多个元素之间的分隔符。
             separator不可省略,当数组中存在多个元素时,元素之间需要用逗号分隔,sql语句才不会报错。open 为foreach开头以什么开头  close 为foreach结尾以什么结尾。                                                     mybatis会将数组参数封装成一个Map,map是键值对的集合。
                        默认:array=数组   array为key
                        如果collection不想用array,使用@Param注解将接口方法参数改为void deleteByIds(@Param("ids") int[] ids);这时collection就可以用自己定义的方法了。

测试方法

@Test
    public void deleteByIds() throws IOException {
        //接收参数
        int[] ids={18,19};

        //1.获取SqlSessionFactory。
        String resource = "mybatis-config.xml";
        InputStream inputStream = Resources.getResourceAsStream(resource);
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);

        //2.获取sqlSession对象
        SqlSession sqlSession = sqlSessionFactory.openSession();
        //传入参数true,改为自动提交事务
        //SqlSession sqlSession = sqlSessionFactory.openSession(true);

        //3.获取Mapper接口的代理对象
        brandMapper brandMapper = sqlSession.getMapper(brandMapper.class);

        //4.执行方法

        brandMapper.deleteByIds(ids);
        //提交事务
        sqlSession.commit();

        //5.释放资源
        sqlSession.close();
    }

上面讲的都是怎么写xml配置文件来执行sql语句,其实还有一个更加简单的方法来执行sql语句,那就是用注解。使用注解就不需要写xml配置文件了:

查询@Select(“”),添加@Insert(“”),修改@Update(“”),删除@Delete(“”)。
sql语句写在括号中。

@Select("select * from sql_store.customers where customer_id=#{customer_id}")
  brand selectByIdBrand(int id);

然后直接写测试方法

@Test
    public void selectByIdBrand() throws IOException {
        //接收参数

        //1.获取SqlSessionFactory。
        String resource = "mybatis-config.xml";
        InputStream inputStream = Resources.getResourceAsStream(resource);
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);

        //2.获取sqlSession对象
        SqlSession sqlSession = sqlSessionFactory.openSession();
        //传入参数true,改为自动提交事务
        //SqlSession sqlSession = sqlSessionFactory.openSession(true);

        //3.获取Mapper接口的代理对象
        brandMapper brandMapper = sqlSession.getMapper(brandMapper.class);

        //4.执行方法
        brand brand = brandMapper.selectByIdBrand(1);
        System.out.println(brand);


        //5.释放资源
        sqlSession.close();
    }

我们可以发现测试方法并没发生什么变化。

但是注解只适合来完成简单的功能,配置文件完成复杂的功能。

  • 20
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: MyBatis 是一个流行的 Java 持久化框架,可以用于操作多种数据库。要使用 MyBatis 操作 Oracle TimesTen 数据库,需要进行一些配置和设置。下面是一些基本步骤: 1. 添加 TimesTen 的 JDBC 驱动程序。可以从 TimesTen 官方网站下载,并将其放置在项目的 classpath 中。 2. 配置 MyBatis 的数据源,指定 TimesTen 的 JDBC 驱动程序、连接 URL、用户名和密码等信息。可以在 MyBatis 的配置文件中进行配置。 例如: ``` <dataSource type="POOLED"> <property name="driver" value="com.timesten.jdbc.Driver"/> <property name="url" value="jdbc:timesten:direct:dsn=sampledb_1122;uid=appuser;pwd=apppassword"/> </dataSource> ``` 3. 配置 MyBatis 的 SQL 映射文件,定义需要执行的 SQL 语句和参数映射等信息。可以使用 MyBatis 提供的语法或者自定义 SQL 语句。 例如: ``` <select id="getUserById" parameterType="java.lang.Long" resultType="User"> SELECT * FROM users WHERE id = #{id} </select> ``` 4. 在 Java 代码中使用 MyBatis 的 SqlSession 来执行 SQL 语句。 例如: ``` SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(configuration); SqlSession session = sessionFactory.openSession(); User user = session.selectOne("getUserById", 1L); session.close(); ``` 以上是一些基本的步骤,可以根据具体情况进行调整和修改。注意,TimesTen 和 Oracle 数据库之间有些许的差异,需要注意一些细节和配置。 ### 回答2: MyBatis是一款流行的Java持久化框架,它支持许多不同类型的数据库,包括Oracle TimesTen。使用MyBatis进行Oracle TimesTen的操作需要一些配置和步骤。 首先,我们需要在MyBatis的配置文件中设置数据源。可以使用TimesTen提供的JDBC驱动程序来配置数据源,类似于配置其他类型的数据库连接。 接下来,我们需要定义我们想要操作的表和实体类的映射关系。在MyBatis中,我们可以使用XML或注解来定义映射。我们需要指定实体类的属性与表的列之间的对应关系,并定义相应的SQL语句。 在进行具体的数据库操作之前,我们可以创建一个会话工厂对象。会话工厂是MyBatis的核心对象之一,它负责创建会话对象。会话是真正执行数据库操作的地方。 通过会话对象,我们可以执行SQL语句,例如插入、更新、删除或查询数据。我们可以使用定义好的映射关系和SQL语句来操作数据库,并通过会话对象获取操作结果或数据。 在使用MyBatis操作Oracle TimesTen时,我们可以利用MyBatis提供的许多高级特性,例如动态SQL、缓存和批处理等,来提高性能和灵活性。 总结而言,使用MyBatis操作Oracle TimesTen需要配置数据源,定义映射关系和SQL语句,创建会话工厂对象,并通过会话对象执行数据库操作。借助MyBatis的强大功能,我们可以轻松地进行数据库操作,并实现高效、灵活的数据访问。 ### 回答3: MyBatis是一种开源的Java持久层框架,用于简化数据库访问的过程。它可以方便地配置和执行SQL语句,提供了灵活的映射机制,支持主流的关系型数据库。 Oracle TimesTen是一种内存数据库,具有高速的访问和响应能力,适用于对数据访问速度要求较高的场景。在使用MyBatis操作Oracle TimesTen时,我们需要配置相关的数据源和映射文件,以便实现与数据库的连接和数据的CRUD操作。 首先,我们需要在MyBatis的配置文件中配置与Oracle TimesTen的数据源连接信息。可以指定数据库的URL、用户名和密码等信息。同时,还需在配置文件中配置相关的数据源和事务管理器。 然后,我们需要编写SQL映射文件,其中定义了与Oracle TimesTen相关的SQL语句和相关的参数映射。通过配置文件中的映射关系,MyBatis可以将数据库查询结果映射为Java对象,并将Java对象转换为SQL语句的参数。 接下来,我们可以通过MyBatis的API来执行SQL语句和操作数据库。通过使用MyBatis的SQL Session对象,我们可以根据映射文件中的SQL语句进行查询、插入、更新和删除操作MyBatis还提供了多种方式来处理事务,以保证数据的一致性和完整性。 在操作Oracle TimesTen时,我们可以利用MyBatis的强大功能来简化开发流程,提高开发效率。通过合理配置数据源和映射文件,并使用MyBatis提供的API进行数据库操作,可以实现高效、灵活和可维护的数据库访问。同时,MyBatis还支持动态SQL语句的生成,能够根据不同的查询条件生成不同的SQL语句,提供了更强大的灵活性。 总之,MyBatis可以很好地支持操作Oracle TimesTen,通过合理配置和使用,能够更方便地与数据库进行交互,并提供了强大的查询和事务管理能力。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值