个人随笔
一、快速搭建MyBatis开发环境(配置版+注解版)
2020-09-11 22:07:55

这一篇博文开始,我们就开始正式学习MyBatis这一个持久层框架啦,虽然之前就一直使用过该框架,但是从来没有系统的学习过,都是不清楚就百度下,然后能用能跑能出结果就行,也就是目的都是实现需求。现在开始好好研究,下面我们搭建一下MyBaits的开发环境,也就是一个用MyBaits框架访问数据库的例子。

1、项目结构如下


这里搭建的是一个maven项目。

2、引入依赖pom.xml

  1. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  2. <modelVersion>4.0.0</modelVersion>
  3. <groupId>com.suibibk</groupId>
  4. <artifactId>mybatis-test01</artifactId>
  5. <version>0.0.1-SNAPSHOT</version>
  6. <dependencies>
  7. <!-- mybatis框架依赖 -->
  8. <dependency>
  9. <groupId>org.mybatis</groupId>
  10. <artifactId>mybatis</artifactId>
  11. <version>3.4.6</version>
  12. </dependency>
  13. <!-- mysql数据库链接依赖 -->
  14. <dependency>
  15. <groupId>mysql</groupId>
  16. <artifactId>mysql-connector-java</artifactId>
  17. <version>5.1.45</version>
  18. </dependency>
  19. <!-- 日志处理依赖 -->
  20. <dependency>
  21. <groupId>log4j</groupId>
  22. <artifactId>log4j</artifactId>
  23. <version>1.2.12</version>
  24. </dependency>
  25. <!-- 单元测试依赖 -->
  26. <dependency>
  27. <groupId>junit</groupId>
  28. <artifactId>junit</artifactId>
  29. <version>4.7</version>
  30. </dependency>
  31. </dependencies>
  32. </project>

这里重点是如下两个依赖

  1. <!-- mybatis框架依赖 -->
  2. <dependency>
  3. <groupId>org.mybatis</groupId>
  4. <artifactId>mybatis</artifactId>
  5. <version>3.4.6</version>
  6. </dependency>
  7. <!-- mysql数据库链接依赖 -->
  8. <dependency>
  9. <groupId>mysql</groupId>
  10. <artifactId>mysql-connector-java</artifactId>
  11. <version>5.1.45</version>
  12. </dependency>

3、编写实体类:User

  1. public class User{
  2. private Long id;//自增的ID
  3. private String username;//用户名
  4. private String userId;//这个用来存放用户的userId,不要用自增键太不安全
  5. private String password;//用户密码
  6. private String nickname;//昵称
  7. private String imgUrl;//用户头像
  8. private String sex;//用户性别0女,1是男
  9. private String age;//用户年龄
  10. private String create_datetime;//用户创建时间
  11. private String update_datetime;//用户修改时间
  12. private String type;//用户类别0是管理员,1是已登录用户,2是游客
  13. private String remark;//用户备注
  14. private String visible;//用户是否有效
  15. private String value;//预留字段
  16. public Long getId() {
  17. return id;
  18. }
  19. public void setId(Long id) {
  20. this.id = id;
  21. }
  22. public String getUserId() {
  23. return userId;
  24. }
  25. public void setUserId(String userId) {
  26. this.userId = userId;
  27. }
  28. public String getUsername() {
  29. return username;
  30. }
  31. public void setUsername(String username) {
  32. this.username = username;
  33. }
  34. public String getPassword() {
  35. return password;
  36. }
  37. public void setPassword(String password) {
  38. this.password = password;
  39. }
  40. public String getNickname() {
  41. return nickname;
  42. }
  43. public void setNickname(String nickname) {
  44. this.nickname = nickname;
  45. }
  46. public String getImgUrl() {
  47. return imgUrl;
  48. }
  49. public void setImgUrl(String imgUrl) {
  50. this.imgUrl = imgUrl;
  51. }
  52. public String getSex() {
  53. return sex;
  54. }
  55. public void setSex(String sex) {
  56. this.sex = sex;
  57. }
  58. public String getAge() {
  59. return age;
  60. }
  61. public void setAge(String age) {
  62. this.age = age;
  63. }
  64. public String getCreate_datetime() {
  65. return create_datetime;
  66. }
  67. public void setCreate_datetime(String createDatetime) {
  68. create_datetime = createDatetime;
  69. }
  70. public String getUpdate_datetime() {
  71. return update_datetime;
  72. }
  73. public void setUpdate_datetime(String updateDatetime) {
  74. update_datetime = updateDatetime;
  75. }
  76. public String getType() {
  77. return type;
  78. }
  79. public void setType(String type) {
  80. this.type = type;
  81. }
  82. public String getRemark() {
  83. return remark;
  84. }
  85. public void setRemark(String remark) {
  86. this.remark = remark;
  87. }
  88. public String getValue() {
  89. return value;
  90. }
  91. public void setValue(String value) {
  92. this.value = value;
  93. }
  94. public String getVisible() {
  95. return visible;
  96. }
  97. public void setVisible(String visible) {
  98. this.visible = visible;
  99. }
  100. @Override
  101. public String toString() {
  102. return "User [id=" + id + ", username=" + username + ", userId="
  103. + userId + ", password=" + password + ", nickname=" + nickname
  104. + ", imgUrl=" + imgUrl + ", sex=" + sex + ", age=" + age
  105. + ", create_datetime=" + create_datetime + ", update_datetime="
  106. + update_datetime + ", type=" + type + ", remark=" + remark
  107. + ", visible=" + visible + ", value=" + value + "]";
  108. }
  109. }

这里字段需要跟数据库的字段一模一样,否则需要在配置文件或者加上注解一一对应,这个后续再说,这里先用最简单的方式:一模一样。

4、编写持久层接口:UserMapper

  1. public interface UserMapper {
  2. public List<User> findAllUser();
  3. }

这里习惯性后缀用Mapper,也习惯性在mapper包下面

5、编写持久层接口映射文件:UserMapper.xml

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!DOCTYPE mapper
  3. PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
  4. "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
  5. <mapper namespace="com.suibibk.mybatis.mapper.UserMapper">
  6. <!--配置查询所有-->
  7. <select id="findAllUser" resultType="com.suibibk.mybatis.domain.User">
  8. select * from user
  9. </select>
  10. </mapper>

select标签上的id对应的是接口中的方法,返回类型对应的就是接口中返回的类型(不用到List,指定domain即可),然后标签内容就是要执行的语句。mapper标签中的namespace对应的就是接口类。这里不需要强制要求UserMapper.java和UserMapper.xml的路径和命名一样

6、编写SqlMapConfig.xml配置文件

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!DOCTYPE configuration
  3. PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
  4. "http://mybatis.org/dtd/mybatis-3-config.dtd">
  5. <!-- mybatis的主配置文件 -->
  6. <configuration>
  7. <!-- 配置环境 -->
  8. <environments default="mysql">
  9. <!-- 配置mysql的环境-->
  10. <environment id="mysql">
  11. <!-- 配置事务的类型-->
  12. <transactionManager type="JDBC"></transactionManager>
  13. <!-- 配置数据源(连接池) -->
  14. <dataSource type="POOLED">
  15. <!-- 配置连接数据库的4个基本信息 -->
  16. <property name="driver" value="com.mysql.jdbc.Driver"/>
  17. <property name="url" value="jdbc:mysql://localhost:3306/weixinser"/>
  18. <property name="username" value="root"/>
  19. <property name="password" value="forever"/>
  20. </dataSource>
  21. </environment>
  22. </environments>
  23. <mappers>
  24. <!-- 不一定非得叫UserMapper.xml -->
  25. <mapper resource="mapper/UserMapper.xml"/>
  26. </mappers
  27. </configuration>

这个是MyBatis的配置文件,主要是配置了环境和mappers,环境上就是指定事务类型,数据库连接信息,当然上面的default可以定义为别的名字。不过环境那里的id要和defalut相同。mapper中的现在我们的例子是配置版,也就是指定配置文件的路径即可。
其实到这里我们就应该猜到流程了。程序启动的时候肯定先加载SqlMapConfig.xml配置文件,然后创建数据库连接池。接下来根据mapper标签找到UserMapper.xml配置文件,然后解析UserMapper.xml配置文件可以找到要执行的语句以及对应的接口和返回类型,这样子就全部都起啦。

7、测试类Test

  1. public class Test {
  2. @org.junit.Test
  3. public void test1() throws Exception {
  4. //1、读取配置文件
  5. InputStream in = Resources.getResourceAsStream("SqlMapConfig.xml");
  6. //2、创建SqlSessionFactory工厂
  7. SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
  8. SqlSessionFactory factory = builder.build(in);
  9. //3、使用工厂生产SqlSession对象
  10. SqlSession sqlSession = factory.openSession();
  11. //4、使用SqlSession创建Dao接口的代理对象
  12. UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
  13. //5、使用代理对象执行方法
  14. List<User> user = userMapper.findAllUser();
  15. System.out.println("user:"+user.toString());
  16. //6、释放资源
  17. sqlSession.close();
  18. in.close();
  19. }
  20. }

上面步骤应该很清晰啦,执行后输出如下结果

哈图片有点小,因为我的服务器带宽太小了,反正也不是很重要的结果。

8、使用注解版

其实使用注解版就更简单啦,但是我觉得没有配置版灵活,注解版也就是没有UserMapper.xml文件,但是要在UserMapper.java的方法加上注解,如下:

  1. public interface UserMapper {
  2. @Select("select * from user")
  3. public List<User> findAllUser();
  4. }

然后修改下MyBatis的配置文件SqlMapConfig.xml中的mapper指向,现在没有接口映射配置文件了就直接指向接口

  1. <mappers>
  2. <mapper class="com.suibibk.mybatis.mapper.UserMapper"/>
  3. </mappers>

然后运行程序结果一模一样,至此环境搭建成功。

总结

通过上面快速搭建MyBatis开发环境的例子我们知道,相对于原始的jdbc操作,便利了许多,我们想要操作一个表只需要编写对应的实体类和Mapper接口以及Mapper映射配置文件就可以啦。当我们使用了注解的方式后就更加简单,只需要简单的加一个Mapper接口即可。如果我们不需要实体类,那么直接返回Map也是可以的。
但是呢,我们这个标签的目的并不是单单的学会MyBatis的使用,毕竟任何框架的使用其实都是很简单的,只需要看下官网例子或者百度一下即可,我们应该要研究MyBatis的实现原理,学会它的设计方法。从中提升我们的软件架构以及设计模式。:bowtie:

 1
有疑问发邮件到 : suibibk@qq.com 侵权立删
Copyright : 个人随笔   备案号 : 粤ICP备18099399号-2