13-Mybatis 注解开发
一、mybatis 的常用注解说明
二、使用 Mybatis 注解实现基本 CRUD
1.编写实体类
@Data
public class User implements Serializable {private Integer userId;private String userName;private Date userBirthday;private String userSex;private String userAddress;
}
2.使用注解方式开发持久层接口
package cn.oesoft.mybatisannotation.dao;import cn.oesoft.mybatisannotation.domain.User;
import org.apache.ibatis.annotations.*;import java.util.List;/*** @ClassName: IUserDao* @Author: linxin* @Date: 2021/6/16 11:37* @Company: http://www.oesoft.cn* @Description: TODO*/
public interface IUserDao {/*** 查询所有用户** @return*/@Select("select * from user")@Results(id = "userMap",value = {@Result(id = true, column = "id", property = "userId"),@Result(column = "username", property = "userName"),@Result(column = "sex", property = "userSex"),@Result(column = "address", property = "userAddress"),@Result(column = "birthday", property = "userBirthday")})List<User> findAll();/*** 根据 id 查询一个用户** @param userId* @return*/@Select("select * from user where id = #{uid} ")@ResultMap("userMap")User findById(Integer userId);/*** 保存操作** @param user* @return*/@Insert("insert into user(username, sex, birthday, address) values(#{userName},#{userSex},#{userBirthday},#{userAddress})")@SelectKey(keyColumn = "id", keyProperty = "userId", resultType = Integer.class, before =false, statement = {"select last_insert_id()"})int saveUser(User user);/*** 更新操作* @param user* @return*/@Update("update user set username=#{userName}, address =#{userAddress}, sex =#{userSex}, birthday =#{userBirthday} " +"where id=#{userId}")int updateUser(User user);/*** 删除用户** @param userId* @return*/@Delete("delete from user where id = #{userId} ")int deleteUser(Integer userId);/*** 查询使用聚合函数** @return*/@Select("select count(*) from user ")int findTotal();/*** 模糊查询** @param name* @return*/@Select("select * from user where username like #{username} ")@ResultMap("userMap")List<User> findByName(String name);
}
3.编写 SqlMapConfig 配置文件
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configurationPUBLIC "-//mybatis.org//DTD Config 3.0//EN""http://mybatis.org/dtd/mybatis-3-config.dtd">
<!-- mybatis的主配置文件 -->
<configuration><!-- 配置 properties 文件的位置 --><properties resource="jdbcConfig.properties"></properties><!-- 配置别名的注册 --><typeAliases><package name="cn.oesoft.mybatisannotation.domain"/></typeAliases><!-- 配置环境 --><environments default="mysql"><!-- 配置 mysql 的环境 --><environment id="mysql"><!-- 配置事务的类型是 JDBC --><transactionManager type="JDBC"></transactionManager><!-- 配置数据源 --><dataSource type="POOLED"><property name="driver" value="${jdbc.driver}"/><property name="url" value="${jdbc.url}"/><property name="username" value="${jdbc.username}"/><property name="password" value="${jdbc.password}"/></dataSource></environment></environments><!-- 配置映射信息 --><mappers><!-- 配置 dao 接口的位置,它有两种方式第一种:使用 mapper 标签配置 class 属性第二种:使用 package 标签,直接指定 dao 接口所在的包--><package name="cn.oesoft.mybatisannotation.dao"/></mappers>
</configuration>
4.编写测试方法
import cn.oesoft.mybatisannotation.dao.IUserDao;
import cn.oesoft.mybatisannotation.domain.User;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;import java.io.InputStream;
import java.sql.Date;
import java.util.List;/*** @ClassName: MybatisAnnotationCRUDTest* @Author: linxin* @Date: 2021/6/16 14:25* @Company: http://www.oesoft.cn* @Description: TODO*/
public class MybatisAnnotationCRUDTest {/*** 测试查询所有*/@Testpublic void testFindAll() {List<User> users = userDao.findAll();for (User user : users) {System.out.println(user);}}/*** 测试查询一个*/@Testpublic void testFindById() {User user = userDao.findById(41);System.out.println(user);}/*** 测试保存*/@Testpublic void testSave() {User user = new User();user.setUserName("mybatis annotation");user.setUserSex("男");user.setUserAddress("北京市顺义区");user.setUserBirthday(new Date(System.currentTimeMillis()));int res = userDao.saveUser(user);System.out.println("影响数据库记录的行数:" + res);System.out.println("插入的主键值:" + user.getUserId());}/*** 测试更新*/@Testpublic void testUpdate() {User user = userDao.findById(63);user.setUserBirthday(new Date(System.currentTimeMillis()));user.setUserSex("女");int res = userDao.updateUser(user);System.out.println(res);}/*** 测试删除*/@Testpublic void testDelete() {int res = userDao.deleteUser(63);System.out.println(res);}/*** 测试查询使用聚合函数*/@Testpublic void testFindTotal() {int res = userDao.findTotal();System.out.println(res);}/*** 测试模糊查询*/@Testpublic void testFindByName() {List<User> users = userDao.findByName("%m%");for (User user : users) {System.out.println(user);}}private InputStream in;private SqlSessionFactory factory;private SqlSession session;private IUserDao userDao;@Before//junit 的注解public void init() throws Exception {//1.读取配置文件in = Resources.getResourceAsStream("SqlMapConfig.xml");//2.创建工厂SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();factory = builder.build(in);//3.创建 sessionsession = factory.openSession();//4.创建代理对象userDao = session.getMapper(IUserDao.class);}@After//junit 的注解public void destroy() throws Exception {//提交事务session.commit();//释放资源session.close();//关闭流in.close();}
}
三、使用注解实现复杂关系映射开发
1.复杂关系映射的注解说明
2.使用注解实现一对一复杂关系映射及延迟加载
a.添加 Account 实体类
@Data
public class Account implements Serializable {private Integer id;private Integer uid;private Double money;//多对一关系映射:从表方应该包含一个主表方的对象引用private User user;
}
b.添加账户的持久层接口并使用注解配置
public interface IAccountDao {/*** 查询所有账户,采用延迟加载的方式查询账户的所属用户* @return*/@Select("select * from account")@Results(id="accountMap",value= {@Result(id=true,column="id",property="id"),@Result(column="uid",property="uid"),@Result(column="money",property="money"),@Result(column="uid",property="user",one=@One(select="cn.oesoft.mybatisannotation.dao.IUserDao.findById",fetchType= FetchType.LAZY) )})List<Account> findAll();
}
c.添加用户的持久层接口并使用注解配置
public interface IUserDao {/*** 查询所有用户** @return*/@Select("select * from user")@Results(id = "userMap",value = {@Result(id = true, column = "id", property = "userId"),@Result(column = "username", property = "userName"),@Result(column = "sex", property = "userSex"),@Result(column = "address", property = "userAddress"),@Result(column = "birthday", property = "userBirthday")})List<User> findAll();/*** 根据 id 查询一个用户** @param userId* @return*/@Select("select * from user where id = #{uid} ")@ResultMap("userMap")User findById(Integer userId);
}
d.测试一对一关联及延迟加载
public class AccountTest {private InputStream in;private SqlSessionFactory factory;private SqlSession session;private IAccountDao accountDao;@Before//junit 的注解public void init() throws Exception {//1.读取配置文件in = Resources.getResourceAsStream("SqlMapConfig.xml");//2.创建工厂SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();factory = builder.build(in);//3.创建 sessionsession = factory.openSession();//4.创建代理对象accountDao = session.getMapper(IAccountDao.class);}@After//junit 的注解public void destroy() throws Exception {//提交事务session.commit();//释放资源session.close();//关闭流in.close();}@Testpublic void testFindAll() {List<Account> accounts = accountDao.findAll();for(Account account : accounts) {System.out.println(account.getMoney());//System.out.println(account.getUser());}}
}
3.使用注解实现一对多复杂关系映射
a.User 实体类加入 List<Account>
//一对多关系映射:主表方应该包含一个从表方的集合引用private List<Account> accounts;
b.编写用户的持久层接口并使用注解配置
/*** 查询所有用户* @return*/@Select("select * from user")@Results(id="userMap",value= {@Result(id=true,column="id",property="userId"),@Result(column="username",property="userName"),@Result(column="sex",property="userSex"),@Result(column="address",property="userAddress"),@Result(column="birthday",property="userBirthday"),@Result(column="id",property="accounts",many=@Many(select="cn.oesoft.mybatisannotation.dao.IAccountDao.findByUid",fetchType= FetchType.LAZY) )})List<User> findAll();
c.编写账户的持久层接口并使用注解配置
/*** 根据用户 id 查询用户下的所有账户* @param userId* @return*/ @Select("select * from account where uid = #{uid} ")List<Account> findByUid(Integer userId);
d.添加测试方法
/*** 测试查询所有*/@Testpublic void testFindAll() {List<User> users = userDao.findAll();for(User user : users) {System.out.println("-----每个用户的内容-----");System.out.println(user.getUserName());// System.out.println(user.getAccounts());}}
四、mybatis 基于注解的二级缓存
1.在 SqlMapConfig 中开启二级缓存支持
<!-- 配置二级缓存 --><settings><!-- 开启二级缓存的支持 --><setting name="cacheEnabled" value="true"/></settings>
2.在持久层接口中使用注解配置二级缓存
@CacheNamespace(blocking=true)//mybatis 基于注解方式实现配置二级缓存
public interface IUserDao {
3.添加测试方法
/*** 测试二级缓存*/@Testpublic void testSecondLevelCache(){SqlSession sqlSession1 = factory.openSession();IUserDao dao1 = sqlSession1.getMapper(IUserDao.class);User user1 = dao1.findById(41);System.out.println(user1);sqlSession1.close();//一级缓存消失SqlSession sqlSession2 = factory.openSession();IUserDao dao2 = sqlSession2.getMapper(IUserDao.class);User user2 = dao2.findById(41);System.out.println(user2);sqlSession2.close();System.out.println(user1 == user2);}
13-Mybatis 注解开发相关推荐
- Mybatis注解开发笔记
Mybatis注解开发(笔记) 欢迎来到菜鸟研究所 创建新的Maven项目 配置文件 prom.xml log4j.properties jdbcConfig.properties SqlMapCom ...
- Mybatis注解开发(一对一)
其他代码访问:Mybatis注解开发基础操作 1.添加OrderMapper接口 public interface OrderMapper {// @Select("select *,o.i ...
- MyBatis-学习笔记12【12.Mybatis注解开发】
Java后端 学习路线 笔记汇总表[黑马程序员] MyBatis-学习笔记01[01.Mybatis课程介绍及环境搭建][day01] MyBatis-学习笔记02[02.Mybatis入门案例] M ...
- java day56【 Mybatis 延迟加载策略 、 Mybatis 缓存、Mybatis 注解开发 】
第1章 Mybatis 延迟加载策略 1.1 何为延迟加载? 1.2 实现需求 1.3 使用 assocation 实现延迟加载 1.3.1 账户的持久层 DAO 接口 1.3.2 账户的持久层映射文 ...
- Mybatis注解开发指北
Mybatis注解开发指北 目录 文章目录 Mybatis注解开发指北 @[toc] 0. Mybatis注解开发步骤 1. 导入相关配置文件 2. 配置数据库连接 3. 创建数据库对应的实体类(en ...
- Mybatis注解开发出现Type interface Mapper.StudentMapper is not known to the MapperRegistry异常解决办法
Mybatis注解开发出现Type interface Mapper.StudentMapper is not known to the MapperRegistry异常解决办法 在核心配置文件中,配 ...
- mybatis注解开发动态sql
mybatis注解开发动态sql 本篇来讲一下如何使用mybatis注解模式中的动态sql 先来讲一下什么是动态sql 在我们实际开发的时候可能会出现很多方法需要一条很相似的sql语句来进行增删改查, ...
- Mybatis注解开发(超详细)
Mybatis注解开发 mybatis的常用注解 使用 Mybatis 注解实现基本 CRUD 项目目录结构 编写实体类 使用注解方式开发持久层接口 编写 SqlMapConfig.xml 配置文件 ...
- Mybatis 注解开发 + 动态SQL
Hello 大家好我是橙子同学,今天分享注解Mybatis注解开发+动态sql 目录 每文一铺垫(今天有小插曲哦) 注解开发 添加 @Insert 删除 @Delete 查询 @Select 修改 @ ...
- Java神鬼莫测之MyBatis注解开发之动态SQL语句(六)
1.Mybatis注解开发之动态SQL语句 背景:使用mybatis的注解开发动态Sql会比较麻烦, 很不方便, 所以不太推荐使用,该文章以查询作为案例,演示动态sql语句. 注意:Mybatis的动 ...
最新文章
- 论文其实也没有那么难!
- SAP RETAIL初阶MM41创建商品主数据BASIC DATA里的Valuation Class
- WebBrowser响应页面中的blank开新窗口及window.close关闭本窗体
- C# 设置Word文档中图片的大小
- AcWing 1047. 糖果
- 【数据库】SQL查询强化篇
- 技术分享丨华为鲲鹏架构Redis知识二三事
- 12.混淆——采样低频信号,采样高频信号_3
- Spring学习总结(16)——Spring AOP实现执行数据库操作前根据业务来动态切换数据源
- MySQL-数据库基础
- 员工档案管理系统的功能都有哪些?
- 如何用开源软件办一场技术大会?
- 如何利用matlab做BP神经网络分析(利用matlab神经网络工具箱)
- 让横向纵向分辨率都一致
- springboot 结合 ice(飞冰) 实现上传功能
- 何为功能平价?特斯拉「抛弃」多传感融合,背后有哪些门道
- 【笑小枫的SpringBoot系列】【十七】SpringBoot文件上传下载
- 核电站问题 动态规划
- 24 Three.js的环境光源THREE.AmbientLight
- random.uniform()和random.random()区别
热门文章
- 将图片嵌入程序文件的测试
- Linux下小型web服务器boa的使用
- oracle job 每月前十天运行_Tensorflow源码解析7 -- TensorFlow分布式运行时
- 【Flink on k8s】JConsole 远程监控 TaskManager
- 【Flink】FLink 通讯组件 Akka与Actor 模型
- 【SpringCloud】Spring Cloud Config 配置中心
- 【ES】es 查询超时listener timeout after waiting for [60000] ms
- 【java】java 如何抛出 sleep interrupted
- 【registry】Reader schema missing default value for field: age
- 【SPI】java基础之SPI框架实现