day04-原生的API&注解方式
原生的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注意事项和使用细节
如果是通过注解的方式,就不再使用MonsterMapper.xml文件,但是需要在mybatis的配置文件中引入含注解的类/接口
添加时,如果要返回自增长的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&注解方式的更多相关文章
- springdata 查询思路:基本的单表查询方法(id,sort) ---->较复杂的单表查询(注解方式,原生sql)--->实现继承类---->复杂的多表联合查询 onetomany
springdata 查询思路:基本的单表查询方法(id,sort) ---->较复杂的单表查询(注解方式,原生sql)--->实现继承类---->复杂的多表联合查询 onetoma ...
- Spring学习笔记之 Spring IOC容器(二) 之注入参数值,自动组件扫描方式,控制Bean实例化方式,使用注解方式
本节主要内容: 1. 给MessageBean注入参数值 2. 测试Spring自动组件扫描方式 3. 如何控制ExampleBean实例化方式 4. 使用注解方式重构Jdb ...
- SpringMVC的controller方法中注解方式传List参数使用@RequestBody
在SpringMVC控制器方法中使用注解方式传List类型的参数时,要使用@RequestBody注解而不是@RequestParam注解: //创建文件夹 @RequestMapping(value ...
- 注解方式传LIST@RequestBody
在SpringMVC中使用注解方式传List类型的参数时,要使用@RequestBody注解而不是@RequestParam注解 //创建文件夹 @RequestMapping(value=" ...
- mybatis源码学习--spring+mybatis注解方式为什么mybatis的dao接口不需要实现类
相信大家在刚开始学习mybatis注解方式,或者spring+mybatis注解方式的时候,一定会有一个疑问,为什么mybatis的dao接口只需要一个接口,不需要实现类,就可以正常使用,笔者最开始的 ...
- spring 纯注解方式 与AOP
spring注解方式 以前我也使用过纯注解方式.现在在这里做个记录 我们先认识几个我们都耳熟能详的注解 @configuration :从spring3.0这个注解就可以用于定义配置类,可以替换xml ...
- SpringBoot入门教程(四)MyBatis generator 注解方式和xml方式
MyBatis 是一款优秀的持久层框架,它支持定制化 SQL.存储过程以及高级映射.MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集.MyBatis 可以使用简单的 XML ...
- spring jwt springboot RESTful API认证方式
RESTful API认证方式 一般来讲,对于RESTful API都会有认证(Authentication)和授权(Authorization)过程,保证API的安全性. Authenticatio ...
- Hibernate 注解方式配置
在Hibernate3之后就可以使用注解的方式去配置.而且在工作中我们使用的更多的也是注解方式去配置项目,所以还有一部分使用配置文件去配置的一些关系就不在此去一一举例,需要了解的朋友可以去查看Hibe ...
- Spring第七弹—依赖注入之注解方式注入及编码解析@Resource原理
注入依赖对象可以采用手工装配或自动装配,在实际应用中建议使用手工装配,因为自动装配会产生未知情况,开发人员无法预见最终的装配结果. 手工装配依赖对象 手工装配依赖对象,在这种方式中又有两种编 ...
随机推荐
- webrtc终极版(题外话)辛苦写文章分享,竟然遇到喷子狂喷,写篇文章回怼下,顺便发表下面对喷子的处理方式
webrtc终极版(题外话)辛苦写文章分享,竟然遇到喷子狂喷,写篇文章回怼下,顺便发表下面对喷子的处理方式 第一篇文章发过后,出人意料的是,收到了博客园某一位用户的狂喷[注:本系列文章会同步发布到cs ...
- 2.3 实验:用linxerUnpack进行通用脱壳--《恶意代码分析实战》
Lab01-03.exe 实验内容: 1.将文件上传到http://www.VirusTotal.com 进行分析并查看报告.文件匹配到了已有的反病毒软件特征吗? 2.是否有这个文件被 ...
- Spring Boot 跨域的问题
- .NET 云原生架构师训练营(模块二 基础巩固 路由与终结点)--学习笔记
2.3.3 Web API -- 路由与终结点 路由模板 约定路由 特性路由 路由冲突 终结点 ASP.NET Core 中的路由:https://docs.microsoft.com/zh-cn/a ...
- unrar命令
解压提取RAR压缩文件 语法格式:unrar 参数 压缩包 常用参数 e 将文件解压缩到当前目录 o - 不要覆盖现有文件 l 显示文件列表 p 设置压缩包密码 p 将文件显示到标准输出 r 递归处理 ...
- 矩池云教程|体验 OpenAI 最近推出的 3D 生成模型 Shap-E!
Shap-E 是由 OpenAI 最近推出的3D生成模型,使用者可以通过简单的文字或图像进行三维模型的生成,OpenAI 认为相比于点云的生成模型Point-E,Shap-E的收敛更快.本文将展示如何 ...
- 【Azure 应用服务】使用命令行创建 webapp 应用出现命令语法不正确错误
问题描述 根据Azure App Service 入门文档 "快速入门:在 Linux 上的 Azure 应用服务中创建 Python 应用" 在创建App Service应用时候 ...
- Nebula Graph 在众安保险的图实践
本文首发于 Nebula Graph Community 公众号 互联网金融的借贷同传统信贷业务有所区别,相较于传统信贷业务,互联网金融具有响应快.数据规模大.风险高等特点.众安保险主要业务是做信用保 ...
- C++之指针变量的定义和使用
从b站上黑马程序员的c++课里学到的C++之指针变量的定义和使用 指针变量的定义和使用 简单理解指针就是地址. 内存编号是从0开始记录的,一般用16进制数字表示 1 #include <iost ...
- 二十一: Mysql 锁机制
Mysql 锁机制 事务的 隔离性 由这章讲述的 锁 来实现. 1. 概述 锁是计算机协调多个进程或线程并发访问某一资源的机制.在程序开发中会存在多线程同步的问题,当多个线程并发访问某个数据的时候,尤 ...