原生的API&注解方式

1.MyBatis原生的API调用

1.1原生API快速入门

需求:在前面的项目基础上,使用MyBatis原生的API完成,即直接通过SqlSession接口的方法来完成操作

1.2代码实现

MyBatisNativeTest.java,演示原生的API操作

其实底层还是使用的映射的xml文件的sql语句

package com.li.mapper;

import com.li.entity.Monster;
import com.li.util.MybatisUtils;
import org.apache.ibatis.session.SqlSession;
import org.junit.Before;
import org.junit.Test; import java.util.Date;
import java.util.List; /**
* @author 李
* @version 1.0
* 演示使用 Mybatis原生API操作
*/
public class MyBatisNativeTest {
private SqlSession sqlSession; //初始化方法
@Before
public void init() {
sqlSession = MybatisUtils.getSqlSession();
//sqlSession的运行类型是DefaultSqlSession
System.out.println("sqlSession运行类型--" + sqlSession.getClass());
} //使用sqlSession原生的API调用编写的方法
//其实还是去找映射的Mapper.xml文件的sql语句
@Test
public void myBatisNativeCrud() {
//添加
/*
* @Override
* public int insert(String statement, Object parameter) {
* return update(statement, parameter);
* }
* statement-接口方法的完整路径
* parameter-接口方法的入参
*/
Monster monster = new Monster();
monster.setAge(100);
monster.setBirthday(new Date());
monster.setEmail("kate2@qq.com");
monster.setGender(0);
monster.setName("猫精-999");
monster.setSalary(1000);
int insert =
sqlSession.insert("com.li.mapper.MonsterMapper.addMonster", monster);
System.out.println("insert--" + insert); //删除
int delete =
sqlSession.delete("com.li.mapper.MonsterMapper.delMonster", 6);
System.out.println("delete--" + delete); //修改
Monster monster2 = new Monster();
monster2.setAge(22);
monster2.setBirthday(new Date());
monster2.setEmail("king789@qq.com");
monster2.setGender(0);
monster2.setName("牛魔王");
monster2.setSalary(8888);
monster2.setId(3);//要带上id,如果没有就不知道修改哪个对象了
int update =
sqlSession.update("com.li.mapper.MonsterMapper.updateMonster", monster2);
System.out.println("update--" + update); //查询--除了查询,其他的都要使用事务提交
List<Monster> monsters =
sqlSession.selectList("com.li.mapper.MonsterMapper.findAllMonster");
for (Monster monster3 : monsters) {
System.out.println("monster--" + monster3);
} if (sqlSession != null) {
sqlSession.commit();
sqlSession.close();
}
System.out.println("操作成功!");
}
}

2.MyBatis注解方式操作

2.1注解方式快速入门

之前我们是使用xml文件的方式来实现接口声明的方法,现在使用注解方式来完成增删改查

(1)创建接口 MonsterAnnotation.java,添加注解

package com.li.mapper;

import com.li.entity.Monster;
import org.apache.ibatis.annotations.Delete;
import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Select;
import org.apache.ibatis.annotations.Update; import java.util.List; /**
* @author 李
* @version 1.0
* MonsterAnnotation:使用注解的方式来配置我们的接口方法
*/
public interface MonsterAnnotation {
//添加 monster
/**
* xml文件的配置方式:
* <insert id="addMonster" parameterType="Monster"
* useGeneratedKeys="true" keyProperty="id">
* INSERT INTO `monster`
* (`age`,`birthday`,`email`,`gender`,`name`,`salary`)
* VALUES (#{age},#{birthday},#{email},#{gender},#{name},#{salary})
* </insert>
*/
@Insert(value = "INSERT INTO `monster` " +
"(`age`,`birthday`,`email`,`gender`,`name`,`salary`) " +
"VALUES (#{age},#{birthday},#{email},#{gender},#{name},#{salary})")
public void addMonster(Monster monster); //根据id删除一个Monster
@Delete(value = "DELETE FROM `monster` WHERE `id`=#{id}")
public void delMonster(Integer id); //修改Monster
//注解配置时value可以省略
@Update("UPDATE `monster` " +
"SET `age`=#{age},`birthday`=#{birthday},`email`=#{email}," +
"gender`=#{gender},`name`=#{name},`salary`=#{salary} " +
"WHERE `id`=#{id};")
public void updateMonster(Monster monster); //查询-根据id
@Select("SELECT * FROM `monster` WHERE id=#{id}")
public Monster getMonsterById(Integer id); //查询所有的Monster
@Select("SELECT * FROM `monster`")
public List<Monster> findAllMonster();
}

(2)修改mybatis-config.xml,对MonsterAnnotation 进行注册

<mappers>
<!--<mapper resource="com/li/mapper/MonsterMapper.xml"/>-->
<!--如果是通过注解的方式,可不再使用MonsterMapper.xml
但是需要在mybatis-config.xml中注册/引入含注解的类-->
<mapper class="com.li.mapper.MonsterAnnotation"/>
</mappers>

(3)测试

package com.li.mapper;

import com.li.entity.Monster;
import com.li.util.MybatisUtils;
import org.apache.ibatis.session.SqlSession;
import org.junit.Before;
import org.junit.Test; import java.util.Date;
import java.util.List; /**
* @author 李
* @version 1.0
*/
public class MonsterAnnotationTest {
private SqlSession sqlSession;
private MonsterAnnotation monsterAnnotation; @Before
public void init() {
sqlSession = MybatisUtils.getSqlSession();
monsterAnnotation = sqlSession.getMapper(MonsterAnnotation.class);
//class com.sun.proxy.$Proxy11
System.out.println("monsterAnnotation的运行类型=" + monsterAnnotation.getClass());
} @Test
public void addMonster() {
Monster monster = new Monster();
monster.setAge(99);
monster.setBirthday(new Date());
monster.setEmail("queen@qq.com");
monster.setGender(0);
monster.setName("狐狸精");
monster.setSalary(3000);
//使用在接口方法配置注解的方式完成对DB的操作
monsterAnnotation.addMonster(monster);
//如果是增删改,需要提交事务
if (sqlSession != null) {
sqlSession.commit();
sqlSession.close();
}
} @Test
public void findAllMonster() {
//使用接口方法配置注解的方式完成操作
List<Monster> allMonster = monsterAnnotation.findAllMonster();
for (Monster monster : allMonster) {
System.out.println("monster=" + monster);
}
if (sqlSession != null) {
sqlSession.close();
}
}
}

2.2注意事项和使用细节

  1. 如果是通过注解的方式,就不再使用MonsterMapper.xml文件,但是需要在mybatis的配置文件中引入含注解的类/接口

  2. 添加时,如果要返回自增长的id值,可以使用@Option注解,组合使用

    /**
    * 1.useGeneratedKeys = true 返回自增的值
    * 2.keyProperty = "id" 自增对应的对象属性
    * 3.keyColumn = "id" 自增的表字段
    * 4.如果 keyProperty 和 keyColumn 的值相同,可以省略 keyColumn
    */
    @Insert(value = "INSERT INTO `monster` " +
    "(`age`,`birthday`,`email`,`gender`,`name`,`salary`) " +
    "VALUES (#{age},#{birthday},#{email},#{gender},#{name},#{salary})")
    @Options(useGeneratedKeys = true,keyProperty = "id",keyColumn = "id")
    public void addMonster(Monster monster);

day04-原生的API&注解方式的更多相关文章

  1. springdata 查询思路:基本的单表查询方法(id,sort) ---->较复杂的单表查询(注解方式,原生sql)--->实现继承类---->复杂的多表联合查询 onetomany

    springdata 查询思路:基本的单表查询方法(id,sort) ---->较复杂的单表查询(注解方式,原生sql)--->实现继承类---->复杂的多表联合查询 onetoma ...

  2. Spring学习笔记之 Spring IOC容器(二) 之注入参数值,自动组件扫描方式,控制Bean实例化方式,使用注解方式

     本节主要内容:    1. 给MessageBean注入参数值    2. 测试Spring自动组件扫描方式    3. 如何控制ExampleBean实例化方式    4. 使用注解方式重构Jdb ...

  3. SpringMVC的controller方法中注解方式传List参数使用@RequestBody

    在SpringMVC控制器方法中使用注解方式传List类型的参数时,要使用@RequestBody注解而不是@RequestParam注解: //创建文件夹 @RequestMapping(value ...

  4. 注解方式传LIST@RequestBody

    在SpringMVC中使用注解方式传List类型的参数时,要使用@RequestBody注解而不是@RequestParam注解 //创建文件夹 @RequestMapping(value=" ...

  5. mybatis源码学习--spring+mybatis注解方式为什么mybatis的dao接口不需要实现类

    相信大家在刚开始学习mybatis注解方式,或者spring+mybatis注解方式的时候,一定会有一个疑问,为什么mybatis的dao接口只需要一个接口,不需要实现类,就可以正常使用,笔者最开始的 ...

  6. spring 纯注解方式 与AOP

    spring注解方式 以前我也使用过纯注解方式.现在在这里做个记录 我们先认识几个我们都耳熟能详的注解 @configuration :从spring3.0这个注解就可以用于定义配置类,可以替换xml ...

  7. SpringBoot入门教程(四)MyBatis generator 注解方式和xml方式

    MyBatis 是一款优秀的持久层框架,它支持定制化 SQL.存储过程以及高级映射.MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集.MyBatis 可以使用简单的 XML ...

  8. spring jwt springboot RESTful API认证方式

    RESTful API认证方式 一般来讲,对于RESTful API都会有认证(Authentication)和授权(Authorization)过程,保证API的安全性. Authenticatio ...

  9. Hibernate 注解方式配置

    在Hibernate3之后就可以使用注解的方式去配置.而且在工作中我们使用的更多的也是注解方式去配置项目,所以还有一部分使用配置文件去配置的一些关系就不在此去一一举例,需要了解的朋友可以去查看Hibe ...

  10. Spring第七弹—依赖注入之注解方式注入及编码解析@Resource原理

        注入依赖对象可以采用手工装配或自动装配,在实际应用中建议使用手工装配,因为自动装配会产生未知情况,开发人员无法预见最终的装配结果. 手工装配依赖对象  手工装配依赖对象,在这种方式中又有两种编 ...

随机推荐

  1. XXE注入详解

    XML介绍 XML全称可扩展标记语言(EXtensible Markup Language),XML跟HTML格式类似,但是作用不同,XML侧重于数据传输,HTML注重于标记语言,也就是说XML其实是 ...

  2. 基于 Gurobi 的纸浆运载船顺序装卸决策建模求解|Gurobi优化应用

    Pulp-Carrier-Loading-Optimization-with-Gurobi 基于 Gurobi 的纸浆运载船顺序装卸决策建模求解.中山大学智能工程学院<运筹学>课程期末建模 ...

  3. Oracle 19c RAC 自动应用RU补丁简明版

    环境:Oracle RAC(GI 19.3 + DB 19.3) 本文应用补丁信息, 19.16 RU: p34130714_190000_Linux-x86-64.zip 本文主要演示使用opatc ...

  4. Linux--如何查看磁盘的IO(top、iostat)

    问题背景: 在性能测试时,虽然测试出了结果,但是我们并不知道瓶颈是源端,还是目标端.例如我做上传和下载性能验证,从Linux服务器上向OSS集群上传和下载文件,虽然测试出了速率,但是并不知道上传是否存 ...

  5. NC50493 石子合并

    题目链接 题目 题目描述 将n堆石子绕圆形操场排放,现要将石子有序地合并成一堆.规定每次只能选相邻的两堆合并成新的一堆,并将新的一堆的石子数记做该次合并的得分. 请编写一个程序,读入堆数n及每堆的石子 ...

  6. pip指定镜像安装

    清华大学开源软件镜像站

  7. DS1302与STC12的连接电路和驱动实现

    简介 DS1302是低功耗带RAM的实时时钟电路, 常见的SOP8封装体积很小, 它可以对年月日周时分秒进行计时, 具有闰年补偿功能, 工作电压为2.0V-5.5V, 采用三线接口与CPU进行同步通信 ...

  8. ELK Stack 分布式日志系统 大纲

    1. Elastic Stack 官网: https://www.elastic.co/cn/what-is/elk-stack 2. 硬件配置 2.1 推算依据 ES JVM heap 最大可以设置 ...

  9. 利用LiveReload插件实现vscode和谷歌浏览器实时刷新

    说明 最近在研究CSS希望可以提升一个层次.在写DEMO练习的时候老是需要去谷歌浏览器手动刷新页面才能看到更改后的效果次数多了 我也受不了,这不我又请来了个帮手: LiveReload,名如其人,这家 ...

  10. Oracle 中LONG RAW BLOB CLOB类型介绍

    说明: RAW: 未加工类型,可存储二进制数据或字节符 LONG: 可变长的字符串数据,最长2G,LONG具有VARCHAR2列的特性,可以存储长文本一个表中最多一个LONG列[不建议使用] LONG ...