# MybatisExample_annotations **Repository Path**: xiyg/mybatis-example_annotations ## Basic Information - **Project Name**: MybatisExample_annotations - **Description**: Mybatis 初期使用比较麻烦,需要各种配置文件、实体类、Dao 层映射关联、还有一大推其它配置。当然 Mybatis 也发现了这种弊端,初期开发了generator可以根据表结果自动生产实体类、配置文件和 Dao 层代码,可以减轻一部分开发量;后期也进行了大量的优化可以使用注解了,自动管理 Dao 层和配置文件等,发展到最顶端就是今天要讲的这种模式了,mybatis-spring-boot-s - **Primary Language**: Java - **License**: AFL-3.0 - **Default Branch**: master - **Homepage**: https://gitee.com/xiyg - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2023-06-06 - **Last Updated**: 2023-06-06 ## Categories & Tags **Categories**: Uncategorized **Tags**: Java, MyBatis, SpringBoot, Oracle ## README # MybatisExample_annotations ## 全注解方式 #### 介绍 Mybatis 初期使用比较麻烦,需要各种配置文件、实体类、Dao 层映射关联、还有一大推其它配置。当然 Mybatis 也发现了这种弊端,初期开发了generator可以根据表结果自动生产实体类、配置文件和 Dao 层代码,可以减轻一部分开发量;后期也进行了大量的优化可以使用注解了,自动管理 Dao 层和配置文件等,发展到最顶端就是今天要讲的这种模式了,mybatis-spring-boot-starter 就是 Spring Boot+ Mybatis 可以完全注解不用配置文件,也可以简单配置轻松上手。 现在想想 Spring Boot 就是牛逼呀,任何东西只要关联到 Spring Boot 都是化繁为简。 mybatis-spring-boot-starter 官方说明:MyBatis Spring-Boot-Starter will help you use MyBatis with Spring Boot 其实就是 Mybatis 看 Spring Boot 这么火热也开发出一套解决方案来凑凑热闹,但这一凑确实解决了很多问题,使用起来确实顺畅了许多。mybatis-spring-boot-starter主要有两种解决方案,一种是使用注解解决一切问题,一种是简化后的老传统。 当然任何模式都需要首先引入mybatis-spring-boot-starter的 Pom 文件,现在最新版本是 2.0.0 #### 依赖 当然任何模式都需要首先引入mybatis-spring-boot-starter的 Pom 文件,现在最新版本是 2.0.0 ``` org.mybatis.spring.boot mybatis-spring-boot-starter 2.0.0 ``` #### 安装教程 好了下来分别介绍两种开发模式 无配置文件注解版 就是一切使用注解搞定。 1 添加相关 Maven 文件 ``` org.springframework.boot spring-boot-starter-web org.mybatis.spring.boot mybatis-spring-boot-starter 2.0.0 mysql mysql-connector-java ``` 2、application.properties 添加相关配置 ``` mybatis.type-aliases-package=com.neo.model spring.datasource.url=jdbc:mysql://localhost:3306/test?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8&useSSL=true spring.datasource.username=root spring.datasource.password=root spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver ``` 3.Spring Boot 会自动加载 spring.datasource.* 相关配置,数据源就会自动注入到 sqlSessionFactory 中,sqlSessionFactory 会自动注入到 Mapper 中,对了,你一切都不用管了,直接拿起来使用就行了。 在启动类中添加对 mapper 包扫描@MapperScan ``` @SpringBootApplication @MapperScan("com.neo.mapper") public class MybatisAnnotationApplication { public static void main(String[] args) { SpringApplication.run(MybatisAnnotationApplication.class, args); } } ``` 或者直接在 Mapper 类上面添加注解@Mapper,建议使用上面那种,不然每个 mapper 加个注解也挺麻烦的 3、开发 Mapper 第三步是最关键的一块, Sql 生产都在这里 ``` public interface UserMapper { @Select("SELECT * FROM users") @Results({ @Result(property = "userSex", column = "user_sex", javaType = UserSexEnum.class), @Result(property = "nickName", column = "nick_name") }) List getAll(); @Select("SELECT * FROM users WHERE id = #{id}") @Results({ @Result(property = "userSex", column = "user_sex", javaType = UserSexEnum.class), @Result(property = "nickName", column = "nick_name") }) UserEntity getOne(Long id); @Insert("INSERT INTO users(userName,passWord,user_sex) VALUES(#{userName}, #{passWord}, #{userSex})") void insert(UserEntity user); @Update("UPDATE users SET userName=#{userName},nick_name=#{nickName} WHERE id =#{id}") void update(UserEntity user); @Delete("DELETE FROM users WHERE id =#{id}") void delete(Long id); } ``` 为了更接近生产我特地将 user_sex、nick_name 两个属性在数据库加了下划线和实体类属性名不一致,另外 user_sex 使用了枚举 @Select 是查询类的注解,所有的查询均使用这个 @Result 修饰返回的结果集,关联实体类属性和数据库字段一一对应,如果实体类属性和数据库属性名保持一致,就不需要这个属性来修饰。 @Insert 插入数据库使用,直接传入实体类会自动解析属性到对应的值 @Update 负责修改,也可以直接传入对象 @delete 负责删除 了解更多属性参考这里 注意,使用#符号和$符号的不同: ``` // This example creates a prepared statement, something like select * from teacher where name = ?; @Select("Select * from teacher where name = #{name}") Teacher selectTeachForGivenName(@Param("name") String name); // This example creates n inlined statement, something like select * from teacher where name = 'someName'; @Select("Select * from teacher where name = '${name}'") Teacher selectTeachForGivenName(@Param("name") String name); ``` 4、使用 上面三步就基本完成了相关 Mapper 层开发,使用的时候当作普通的类注入进入就可以了 ``` @RunWith(SpringRunner.class) @SpringBootTest public class UserMapperTest { @Autowired private UserMapper userMapper; @Test public void testInsert() throws Exception { userMapper.insert(new User("aa1", "a123456", UserSexEnum.MAN)); userMapper.insert(new User("bb1", "b123456", UserSexEnum.WOMAN)); userMapper.insert(new User("cc1", "b123456", UserSexEnum.WOMAN)); Assert.assertEquals(3, userMapper.getAll().size()); } @Test public void testQuery() throws Exception { List users = userMapper.getAll(); System.out.println(users.toString()); } @Test public void testUpdate() throws Exception { User user = userMapper.getOne(30l); System.out.println(user.toString()); user.setNickName("neo"); userMapper.update(user) ``` ## XML方式 [极简 xml 版本保持映射文件的老传统,接口层只需要定义空方法,系统会自动根据方法名在映射文件中找对应的 Sql .](https://gitee.com/xiyg/mybatis-example-xml.git) #### 配置 pom 文件和上个版本一样,只是application.properties新增以下配置 ``` mybatis.config-location=classpath:mybatis/mybatis-config.xml mybatis.mapper-locations=classpath:mybatis/mapper/*.xml ``` 指定了 Mybatis 基础配置文件和实体类映射文件的地址 mybatis-config.xml 配置 ``` ``` 这里也可以添加一些 Mybatis 基础的配置 #### 添加 User 的映射文件 ``` id, userName, passWord, user_sex, nick_name INSERT INTO users (userName,passWord,user_sex) VALUES (#{userName}, #{passWord}, #{userSex}) UPDATE users SET userName = #{userName}, passWord = #{passWord}, nick_name = #{nickName} WHERE id = #{id} DELETE FROM users WHERE id =#{id} ``` 其实就是把上个版本中 Mapper 的 Sql 搬到了这里的 xml 中了 #### 编写 Mapper 层的代码 ``` public interface UserMapper { List getAll(); UserEntity getOne(Long id); void insert(UserEntity user); void update(UserEntity user); void delete(Long id); } ``` 对比上一步,这里只需要定义接口方法 #### 使用 使用和上个版本没有任何区别,大家就看文章对应的示例代码吧