MyBatis 学习之路其一:使用mybatis 创建一个简单的程序

一、我们会用到的工具和网站
  • mybatis 的 jar 包,我们可以从 mybatis 的官网下载,或者直接利用 maven 引用(推荐);
  • mybatis-config.xml 即 mybatis 的配置文件,完全手写太过麻烦且容易出错,我们可以使用官网的模板:http://www.mybatis.org/mybatis-3/getting-started.html;
  • 其他 xml 文件的相关模板:http://www.mybatis.org/mybatis-3/configuration.html。

二、一步步从搭建环境到第一个 mybatis 程序

mybatis 是一个数据持久化框架,那么在使用 mybatis 时就必须在一个能够连接数据库的环境之下,目前采用的是虚拟机安装 mysql 的方式。虚拟机的软件是 VM,系统为 CentOS。接下来,我们一步步来,我会重点记录在程序运行过程中出现的错误以及解决方案。

首先我们可以创建任意一个 java 项目(目前还不需要专门建一个 java web 项目),然后我们建一个 mybatisTest 的包。在该包的里面在建两个包,分别是 Mapper 和 Model。

第二步,我们再 model 包里创建一个叫做 Role 的类

 

 1 package mybatisTest.model;
 2 
 3 public class Role {
 4 
 5     private Long id;
 6     private String roleName;
 7     private int age;
 8     public Long getId() {
 9         return id;
10     }
11     public void setId(Long id) {
12         this.id = id;
13     }
14     public String getRoleName() {
15         return roleName;
16     }
17     public void setRoleName(String roleName) {
18         this.roleName = roleName;
19     }
20     public int getAge() {
21         return age;
22     }
23     public void setAge(int age) {
24         this.age = age;
25     }
26     
27 }

 

 

然后,我们再 mapper 包下新建一个 RoleMapper 的接口:

1 package mybatisTest.mapper;
2 
3 import mybatisTest.model.Role;
4 
5 public interface RoleMapper {
6     public Role getRole(int id);
7 }

 

以上只是简单的建立两个测试用的类,所以不做说明。

接下来,我们需要在 虚拟机的 mysql 里 创建一个 Role 的表以便我们去调用,为了方便,mysql 全部使用 root 进行操作。

mysql -h localhost -u root - p

 

输入密码后,以 root 用户登录 mysql 之后,先不要去建表,我们先查看下 root 是否能远程登录:

use mysql
select host,user from user;
+----------------+------------------+
| host           | user             |
+----------------+------------------+
| %              | holmes           |
| %              | root             |
| 192.168.52.128 | holmes           |
| localhost      | mysql.infoschema |
| localhost      | mysql.session    |
| localhost      | mysql.sys        |
+----------------+------------------+

% 表示用户可以在任意的 host 下登录,因为我们需要远程连接,如果 root 用户对应的 host 不是 %,则用 update 语句更新:

update user set host = '%' where user = 'root';

然后,我们退出 mysql

quit

查看虚拟机的 ip 地址:

ip add

会显示多个 ip 地址,我们再本地 使用 ipconfig 查看 ip 地址,找到两边能够对应上的 ip (同一个关口下的 ip),我这边是 本地:192.168.52.1;虚拟机:192.168.52.128。

然后,我们使用该 ip 进行登录

mysql -h 192.168.52.128 -u root -p

注意:如果之前查看的 user 表,root 用户对应的 host 不是 % 这里是无法登录成功的。

然后,创建一个用于我们本次测试用的数据库,javatest:

create database javatest;

切换到该数据库下:

create database javatest;

 

创建 Role 表

create table Role(
   id INT NOT NULL,
   name VARCHAR(100) ,
   age INT NOT NULL,
   PRIMARY KEY (id )
);

 

然后插入几条数据:

insert into Role(id,name,age) values(1,'zhangsan',23);
insert into Role(id,name,age) values(2,'lisi',21);
insert into Role(id,name,age) values(3,'wuwu',29);

 

数据准备好之后,我们退出 mysql。

为了保证主机能够连接上虚拟机的 mysql,我们需要确保虚拟机上的 mysql 接口在防火墙能够打开,我们先查看防火墙里,哪些端口是打开的:

firewall-cmd --list-ports

显示:

3306/tcp 80/tcp

我这边 3306 是打开的,如果没有打开,可以使用下面的命令打开:

firewall-cmd --zone=public --add-port=3306/tcp --permanent
firewall-cmd --reload

完成上述的准备工作,我们就可以用 mybatis 来进行数据持久化操作了。

使用 mybatis 的首要任务是使用配置或者代码去生产 SqlSessionFactory,在我们这次的示例中,我们通过代码去读取配置的 XML 文件来生产 SqlSessionFactory。关于这个 XML,一般命名为 mybatis-config.xml 我们可以去 mybatis 的官网复制它的模板,然后改动我们需要的部分,以下是官网提供的模板:

<?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>
  <environments default="development">
    <environment id="development">
      <transactionManager type="JDBC"/>
      <dataSource type="POOLED">
        <property name="driver" value="${driver}"/>
        <property name="url" value="${url}"/>
        <property name="username" value="${username}"/>
        <property name="password" value="${password}"/>
      </dataSource>
    </environment>
  </environments>
  <mappers>
    <mapper resource="org/mybatis/example/BlogMapper.xml"/>
  </mappers>
</configuration>

 我们主要是对 dataSource 部分进行改动,根据我们的虚拟机地址和mysql的用户、密码、数据库信息改变如下

 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 <configuration>
 6 <!-- environment 描述的数据库 -->
 7   <environments default="development">
 8     <environment id="development">
 9     <!-- 表示事务管理器采用的事 mybatis 的 jdbc 管理器方式 -->
10       <transactionManager type="JDBC"/>
11       <dataSource type="POOLED">
12         <property name="driver" value="com.mysql.cj.jdbc.Driver"/>
13         <property name="url" value="jdbc:mysql://192.168.52.128:3306/javatest?serverTimezone=UTC"/>
14         <property name="username" value="root"/>
15         <property name="password" value="Root123#"/>
16       </dataSource>
17     </environment>
18   </environments>
19   <mappers>
20     <mapper resource="mybatisTest/mapper/RoleMapper.xml"/>
21   </mappers>
22 </configuration>

 

需要注意的事,在 mappers 下,我将原来的示例的 BlogMapper.xml 改成了我后面会用到的 RoleMapper.xml。

在13行的 url 里,除了一般数据库连接字符串的必要部分,我还加了 useSSL,和 serverTimezone 的设置,如果不加可能会报错,具体原因我会在以后 mysql 相关内容叙述。

serverTimezone 是时区的设置,如果不加,mysql 和 程序时区可能会不一致。并且会抛出错误:

The server time zone value 'PDT' is unrecognized or represents more than one time zone. 
You must configure either the server or JDBC driver (via the serverTimezone configuration property) 
to use a more specifc time zone value if you want to utilize time zone support.

既然说到了 RoleMapper.xml,我们就来创建它,并且把它放在 mapper 包下面:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
  PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
  "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="mybatisTest.mapper.RoleMapper">
  <select id="getRole" resultType="mybatisTest.model.Role">
    select age from Role where id = #{id}
  </select>
</mapper>

 

在 java 知识点动态代理里,我们提到过拦截器,而 mybatis 正式利用拦截器,把对 RoleMapper 这个接口和 它根据这个 xml 生产的对象绑定在了一起,并且,在使用 接口方法时,进行拦截,然后执行自己生成对象里的 对应的方法。

在这个 xml 文件里,是通过 namespace 属性来确定他想拦截的接口的(全限定名)。

然后<select></select> 这部分内容,是 mybatis 生产 sql 语句所用的标签,我们以后再详细说。

现在有个问题,这个文件是如何被加载的呢?答案是,在 mybatis-config.xml 里被加载的,在我们读取 mybatis-config.xml 来生成 sqlSessionFactory 时也会把 <mapper></mapper>里的 xml 文件加载进来,并且和对应的接口绑定。

接下里,我们新建一个测试程序,用来做主程序,在这个主程序里,我们需要 生产一个 sqlSessionFactory,然后再用这个 Factory 去生产一个 sqlSession,通过 sqlSession 去提交 sql 并且获取结果。该文件放在 mybatisTest 包下即可

 1 package mybatisTest;
 2 
 3 import java.io.IOException;
 4 import java.io.InputStream;
 5 
 6 import org.apache.ibatis.io.Resources;
 7 import org.apache.ibatis.session.SqlSession;
 8 import org.apache.ibatis.session.SqlSessionFactory;
 9 import org.apache.ibatis.session.SqlSessionFactoryBuilder;
10 
11 import mybatisTest.model.Role;
12 
13 public class SqlSessionTest {
14 
15     public static void main(String[] args) {
16         SqlSessionFactory sqlSessionFactory = null;
17         String resource = "mybatis-config.xml";
18         InputStream inputStream;
19         try {
20             inputStream = Resources.getResourceAsStream(resource);
21             sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
22         }catch(IOException e) {
23             e.printStackTrace();
24         }
25         SqlSession sqlSession = sqlSessionFactory.openSession();
26         Role role = (Role)sqlSession.selectOne("mybatisTest.mapper.RoleMapper.getRole",1);
27         System.out.println(role.getAge());
28     }
29 
30 }

 

运行程序,输出结果。

在这里,我们加载 mybatis-config 的方式是通过,Resources.getResourceAsStream,其实一层层追溯,它是使用 java.lang 里的 Class.getResourceAsStream(String path) 和 Class.getClassLoader.getResourceAsStream(String path);我们先不去深究,只是需要知道,它加载的初始路径是根路径 src 目录,或者是包路径。当出现找不到文件时,可以根据这两种默认路径去重新设置相对路径。

 

 

posted @ 2018-09-29 12:56  crazy_runcheng  阅读(556)  评论(0编辑  收藏  举报