如何一文快速了解 Mybatis 的注解开发
2020-04-21 20:22
344 查看
文章目录
- 1、mybatis 的常用注解说明
- 2、使用 Mybatis 注解实现基本 CRUD
- 2.1、编写实体类
- 2.2、使用注解方式开发持久层接口
- 2.3、编写 SqlMapConfig 配置文件
- 2.4、编写测试类
3、使用注解实现复杂关系映射开发
1、mybatis 的常用注解说明
- @Insert:实现新增
- @Update:实现更新
- @Delete:实现删除
- @Select:实现查询
- @Result:实现结果集封装
- @Results:可以与@Result 一起使用,封装多个结果集
- @ResultMap:实现引用@Results 定义的封装
- @One:实现一对一结果集封装
- @Many:实现一对多结果集封装
- @SelectProvider: 实现动态 SQL 映射
- @CacheNamespace:实现注解二级缓存的使用
2、使用 Mybatis 注解实现基本 CRUD
2.1、编写实体类
/** * * <p>Title: User</p> * <p>Description: 用户的实体类</p> */ public class User implements Serializable { private Integer userId; private String userName; private Date userBirthday; private String userSex; private String userAddress; public Integer getUserId() { return userId; } public void setUserId(Integer userId) { this.userId = userId; } public String getUserName() { return userName; } public void setUserName(String userName) { this.userName = userName; } public Date getUserBirthday() { return userBirthday; } public void setUserBirthday(Date userBirthday) { this.userBirthday = userBirthday; } public String getUserSex() { return userSex; } public void setUserSex(String userSex) { this.userSex = userSex; } public String getUserAddress() { return userAddress; } public void setUserAddress(String userAddress) { this.userAddress = userAddress; } @Override public String toString() { return "User [userId=" + userId + ", userName=" + userName + ", userBirthday=" + userBirthday + ", userSex=" + userSex + ", userAddress=" + userAddress + "]"; } }
注意:
此处实体类的属性名和数据库表的列名并不一致。
2.2、使用注解方式开发持久层接口
/** * * <p>Title: IUserDao</p> * <p>Description: 用户的持久层接口</p> */ 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); /** * 保存操作,并返回当次添加的记录的id * @param user * @return */ @Insert("insert into user(username,sex,birthday,address)values(#{username},#{sex},#{birthday},#{address} )") @SelectKey(keyColumn="id",keyProperty="id",resultType=Integer.class,before = false, statement = { "select last_insert_id()" }) int saveUser(User user); /** * 更新操作 * @param user * @return */ @Update("update user set username=#{username},address=#{address},sex=#{sex},birthday=#{birthday} where id =#{id} ") int updateUser(User user); /** * 删除用户 * @param userId * @return */ @Delete("delete from user where id = #{uid} ") int deleteUser(Integer userId); /** * 查询使用聚合函数 * @return */ @Select("select count(*) from user ") int findTotal(); /** * 模糊查询 * @param name * @return */ @Select("select * from user where username like #{username} ") List<User> findByName(String name); }
通过以上的注解方式,我们就不需要再去编写 UserDao.xml 映射文件了。
2.3、编写 SqlMapConfig 配置文件
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd"> <configuration> <!-- 配置 properties 文件的位置 --> <properties resource="jdbcConfig.properties"></properties> <!-- 配置别名的注册 --> <typeAliases> <package name="per.cjh.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="per.cjh.dao"/> </mappers> </configuration>
2.4、编写测试类
/** * * <p>Title: MybatisAnnotationCRUDTest</p> * <p>Description: mybatis 的注解 crud 测试</p> */ public class MybatisAnnotationCRUDTest { /** * 测试查询所有 */ @Test public void testFindAll() { List<User> users = userDao.findAll(); for(User user : users) { System.out.println(user); } } /** * 测试查询一个 */ @Test public void testFindById() { User user = userDao.findById(41); System.out.println(user); } /** * 测试保存 */ @Test public void testSave() { User user = new User(); user.setUserName("mybatis annotation"); user.setUserSex("男"); user.setUserAddress("北京市顺义区"); user.setUserBirthday(new Date()); int res = userDao.saveUser(user); System.out.println("影响数据库记录的行数:"+res); System.out.println("插入的主键值:"+user.getUserId()); } /** * 测试更新 */ @Test public void testUpdate() { User user = userDao.findById(63); user.setUserBirthday(new Date()); user.setUserSex("女"); int res = userDao.updateUser(user); System.out.println(res); } /** * 测试删除 */ @Test public void testDelete() { int res = userDao.deleteUser(63); System.out.println(res); } /** * 测试查询使用聚合函数 */ @Test public void testFindTotal() { int res = userDao.findTotal(); System.out.println(res); } /** * 测试模糊查询 */ @Test public 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.创建 session session = factory.openSession(); //4.创建代理对象 userDao = session.getMapper(IUserDao.class); } @After//junit 的注解 public void destroy()throws Exception { //提交事务 session.commit(); //释放资源 session.close(); //关闭流 in.close(); } }
3、使用注解实现复杂关系映射开发
实现复杂关系映射之前我们可以在映射文件中通过配置< resultMap >来实现,在使用注解开发时我们需要借助@Results 注解,@Result 注解,@One 注解,@Many 注解。
3.1、复杂关系映射的注解说 明
1、@Results 注解
代替的是标签
该注解中可以使用单个@Result 注解,也可以使用@Result 集合
@Results({@Result(),@Result()})或@Results(@Result())
2、@Resutl 注解
代替了 < id > 标签和< result > 标签
@Result 中 属性介绍:
- id 是否是主键字段
- column 数据库的列名
- property 需要装配的属性名
- one 需要使用的@One 注解(@Result(one=@One)()))
- many 需要使用的@Many 注解(@Result(many=@many)()))
3、@One 注解(一对一)
代替了 标签,是多表查询的关键,在注解中用来指定子查询返回单一对象。
@One 注解属性介绍:
- select 指定用的 来多表查询的 sqlmapper
- fetchType 会覆盖全局的配置参数 lazyLoadingEnabled。
使用格式:@Result(column=" “,property=”",one=@One(select=""))
4、@Many 注解(多对一)
代替了 标签, 是是多表查询的关键,在注解中用来指定子查询返回对象集合。
注意:聚集元素用来处理“一对多”的关系。需要指定映射的 Java 实体类的属性,属性的 javaType
(一般为 ArrayList)但是注解中可以不定义;
使用格式:@Result(property="",column="",many=@Many(select=""))
- 点赞 1
- 收藏
- 分享
- 文章举报
相关文章推荐
- 如何使用AndroidStudio进行快速注解开发
- Mybatis 开发注解快速入门
- 让你快速了解并掌握如何进行iOS开发技能
- 一文带你快速了解,python是如何解析XML文件
- 一文带你快速了解,python是如何解析XML文件
- 如何在mybatis注解开发中使用动态SQL
- MyBatis快速入门(十三):MyBatis注解开发
- 如何快速的开发一个完整的iOS直播app(播放篇)
- B\S架构快速开发平台如何用代码实现登陆
- 如何快速的开发一个完整的iOS直播app(原理篇)
- 做开发如何快速提升自己
- 如何在Mac OS X上安装 Ruby运行环境 对于新入门的开发者,如何安装 Ruby和Ruby Gems 的运行环境可能会是个问题,本页主要介绍如何用一条靠谱的路子快速安装 Ruby 开发环境。
- mybatis 注解快速上手
- 智能运维(AIOps)时代开启,一文帮你快速了解其定义与发展现状
- 05_MyBatis基于注解的开发
- 如何快速开发SPA应用
- Android端的短视频开发,我们该如何快速实现移动端短视频功能?
- .Net语言 APP开发平台——Smobiler学习日志:如何快速实现Timer计时功能
- Biztalk 开发之 如何快速创建架构
- 【如何快速的开发一个完整的iOS直播app】(原理篇)