代码改变世界

Maven 项目使用mybatis的环境搭建-基于xml形式实现查询所有的功能

2019-08-15 18:05  全me村的希望  阅读(647)  评论(0编辑  收藏  举报

首先了解一下什么是 MyBatis?

MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解来配置和映射原生类型、接口和 Java 的 POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。

本例子将通过一个简单的查询所有的用户信息的动作来简单的解析如何在Maven项目中使用mybatis。

1.本例使用的数据库为mysql,首先在数据库test中创建user表,并添加一些基本的数据。

 1 -- ----------------------------
 2 -- Table structure for user
 3 -- ----------------------------
 4 DROP TABLE IF EXISTS `user`;
 5 CREATE TABLE `user` (
 6   `id` int(11) NOT NULL AUTO_INCREMENT,
 7   `username` varchar(255) NOT NULL,
 8   `password` varchar(255) NOT NULL,
 9   `nick_name` varchar(255) DEFAULT NULL,
10   `sex` int(1) DEFAULT NULL,
11   `register_date` datetime NOT NULL,
12   PRIMARY KEY (`id`)
13 ) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8;
14 
15 -- ----------------------------
16 -- Records of user
17 -- ----------------------------
18 INSERT INTO `user` VALUES ('1', '89921218@qq.com', '1ee04e0b1cb5af7367c80c22e42efd8b', '土豆', '1', '2017-06-23 14:24:23');
19 INSERT INTO `user` VALUES ('2', '2@qq.com', '1ee04e0b1cb5af7367c80c22e42efd8b', '土豆-2', '1', '2017-06-23 14:24:23');
20 INSERT INTO `user` VALUES ('3', '3@qq.com', '1ee04e0b1cb5af7367c80c22e42efd8b', '土豆-3', '1', '2017-06-23 14:24:23');
21 INSERT INTO `user` VALUES ('4', '4@qq.com', '1ee04e0b1cb5af7367c80c22e42efd8b', '土豆-4', '1', '2017-06-23 14:24:23');
22 INSERT INTO `user` VALUES ('5', '5@qq.com', '1ee04e0b1cb5af7367c80c22e42efd8b', '土豆-5', '1', '2017-06-23 14:24:23');
23 INSERT INTO `user` VALUES ('6', '6@qq.com', '1ee04e0b1cb5af7367c80c22e42efd8b', '土豆-6', '1', '2017-06-23 14:24:23');
24 INSERT INTO `user` VALUES ('7', '7@qq.com', '1ee04e0b1cb5af7367c80c22e42efd8b', '土豆-7', '1', '2017-06-23 14:24:23');
25 INSERT INTO `user` VALUES ('8', '8@qq.com', '1ee04e0b1cb5af7367c80c22e42efd8b', '土豆-8', '1', '2017-06-23 14:24:23');
26 INSERT INTO `user` VALUES ('9', '9@qq.com', '1ee04e0b1cb5af7367c80c22e42efd8b', '土豆-9', '1', '2017-06-23 14:24:23');
27 INSERT INTO `user` VALUES ('10', '10@qq.com', '1ee04e0b1cb5af7367c80c22e42efd8b', '土豆-10', '1', '2017-06-23 14:24:23');
28 SET FOREIGN_KEY_CHECKS=1;

2.在项目中创建对应的实体类User类

 1 package com.example.domain;
 2 
 3 import java.io.Serializable;
 4 import java.util.Date;
 5 
 6 public class User implements Serializable{
 7     private Integer id;
 8     private String username;
 9     private String password;
10     private String nickName;
11     private Integer sex;
12     private Date registerDate;
13 
14     public Integer getId() {
15         return id;
16     }
17 
18     public void setId(Integer id) {
19         this.id = id;
20     }
21 
22     public String getUsername() {
23         return username;
24     }
25 
26     public void setUsername(String username) {
27         this.username = username;
28     }
29 
30     public String getPassword() {
31         return password;
32     }
33 
34     public void setPassword(String password) {
35         this.password = password;
36     }
37 
38     public String getNickName() {
39         return nickName;
40     }
41 
42     public void setNickName(String nickName) {
43         this.nickName = nickName;
44     }
45 
46     public Integer getSex() {
47         return sex;
48     }
49 
50     public void setSex(Integer sex) {
51         this.sex = sex;
52     }
53 
54     public Date getRegisterDate() {
55         return registerDate;
56     }
57 
58     public void setRegisterDate(Date registerDate) {
59         this.registerDate = registerDate;
60     }
61 
62     @Override
63     public String toString() {
64         return "User{" +
65                 "id=" + id +
66                 ", username='" + username + '\'' +
67                 ", password='" + password + '\'' +
68                 ", nickName='" + nickName + '\'' +
69                 ", sex=" + sex +
70                 ", registerDate=" + registerDate +
71                 '}';
72     }
73 }
View Code

 3.将下面的 dependency 代码置于 pom.xml 文件中,由于本例使用mysql数据库所以需要添加mysql数据库连接驱动,再加入mybatis依赖以及junit测试依赖。

 1      <dependency>
 2             <groupId>mysql</groupId>
 3             <artifactId>mysql-connector-java</artifactId>
 4             <version>5.1.6</version>
 5         </dependency>
 6         <dependency>
 7             <groupId>junit</groupId>
 8             <artifactId>junit</artifactId>
 9             <version>4.8</version>
10         </dependency>
11         <dependency>
12             <groupId>org.mybatis</groupId>
13             <artifactId>mybatis</artifactId>
14             <version>3.4.5</version>
15         </dependency>
View Code

4.创建构建 SqlSessionFactory所需的xml,在resources目录下创建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 <configuration>
 6     <!--在environments配置本次连接的可能所有的所需要的环境,每一个子标签environment都代表一种环境,
 7     尽管可以配置多个环境,但每个 SqlSessionFactory 实例只能选择一种环境,记得必须选择一种环境
 8     default默认使用的环境 ID(比如:default="test")-->
 9     <environments default="test">
10         <!--每个 environment 元素定义的环境 ID,起名mysql只是了方便辨识代表哪种连接,与实际连接的数据库为mysql没有关系(比如:id="mysql")-->
11         <environment id="mysql">
12             <!--事务管理器的配置:
13                 通过type选择事务管理器类型
14                 在 MyBatis 中有两种类型的事务管理器:
15                 JDBC – 这个配置就是直接使用了 JDBC 的提交和回滚设置,它依赖于从数据源得到的连接来管理事务作用域。
16                 MANAGED – 这个配置几乎没做什么。它从来不提交或回滚一个连接,而是让容器来管理事务的整个生命周期(比如 JEE 应用服务器的上下文)
17                  默认情况下它会关闭连接,然而一些容器并不希望这样,因此需要将 closeConnection 属性设置为 false 来阻止它默认的关闭行为。例如:
18                 <transactionManager type="MANAGED">
19                   <property name="closeConnection" value="false"/>
20                 </transactionManager>
21                 提示如果你正在使用 Spring + MyBatis,则没有必要配置事务管理器, 因为 Spring 模块会使用自带的管理器来覆盖前面的配置。
22             -->
23             <transactionManager type="jdbc"></transactionManager>
24             <!--数据源配置:
25                 有三种内建的数据源类型(也就是 type=”[UNPOOLED|POOLED|JNDI]”):
26                 UNPOOLED– 这个数据源的实现只是每次被请求时打开和关闭连接。虽然有点慢,但对于在数据库连接可用性方面没有太高要求的简单应用程序来说,是一个很好的选择。 不同的数据库在性能方面的表现也是不一样的,对于某些数据库来说,使用连接池并不重要,这个配置就很适合这种情形。UNPOOLED 类型的数据源具有以下属性。:
27                 driver – 这是 JDBC 驱动的 Java 类的完全限定名(并不是 JDBC 驱动中可能包含的数据源类)。
28                 url – 这是数据库的 JDBC URL 地址。
29                 username – 登录数据库的用户名。
30                 password – 登录数据库的密码。
31                 defaultTransactionIsolationLevel – 默认的连接事务隔离级别。
32                 defaultNetworkTimeout – The default network timeout value in milliseconds to wait for the database operation to complete. See the API documentation of java.sql.Connection#setNetworkTimeout() for details.
33                 作为可选项,你也可以传递属性给数据库驱动。只需在属性名加上“driver.”前缀即可,例如:
34                 driver.encoding=UTF8
35                 这将通过 DriverManager.getConnection(url,driverProperties) 方法传递值为 UTF8 的 encoding 属性给数据库驱动。
36                 
37                 POOLED– 这种数据源的实现利用“池”的概念将 JDBC 连接对象组织起来,避免了创建新的连接实例时所必需的初始化和认证时间。 这是一种使得并发 Web 应用快速响应请求的流行处理方式。
38                 除了上述提到 UNPOOLED 下的属性外,还有更多属性用来配置 POOLED 的数据源:                
39                 poolMaximumActiveConnections – 在任意时间可以存在的活动(也就是正在使用)连接数量,默认值:10
40                 poolMaximumIdleConnections – 任意时间可能存在的空闲连接数。
41                 poolMaximumCheckoutTime – 在被强制返回之前,池中连接被检出(checked out)时间,默认值:20000 毫秒(即 20 秒)
42                 poolTimeToWait – 这是一个底层设置,如果获取连接花费了相当长的时间,连接池会打印状态日志并重新尝试获取一个连接(避免在误配置的情况下一直安静的失败),默认值:20000 毫秒(即 20 秒)。
43                 poolMaximumLocalBadConnectionTolerance – 这是一个关于坏连接容忍度的底层设置, 作用于每一个尝试从缓存池获取连接的线程。 如果这个线程获取到的是一个坏的连接,那么这个数据源允许这个线程尝试重新获取一个新的连接,但是这个重新尝试的次数不应该超过 poolMaximumIdleConnections 与 poolMaximumLocalBadConnectionTolerance 之和。 默认值:3 (新增于 3.4.5)
44                 poolPingQuery – 发送到数据库的侦测查询,用来检验连接是否正常工作并准备接受请求。默认是“NO PING QUERY SET”,这会导致多数数据库驱动失败时带有一个恰当的错误消息。
45                 poolPingEnabled – 是否启用侦测查询。若开启,需要设置 poolPingQuery 属性为一个可执行的 SQL 语句(最好是一个速度非常快的 SQL 语句),默认值:false。
46                 poolPingConnectionsNotUsedFor – 配置 poolPingQuery 的频率。可以被设置为和数据库连接超时时间一样,来避免不必要的侦测,默认值:0(即所有连接每一时刻都被侦测 — 当然仅当 poolPingEnabled 为 true 时适用)。
47                 
48                 JNDI – 这个数据源的实现是为了能在如 EJB 或应用服务器这类容器中使用,容器可以集中或在外部配置数据源,然后放置一个 JNDI 上下文的引用。这种数据源配置只需要两个属性
49                 initial_context – 这个属性用来在 InitialContext 中寻找上下文(即,initialContext.lookup(initial_context))。这是个可选属性,如果忽略,那么将会直接从 InitialContext 中寻找 data_source 属性。
50                 data_source – 这是引用数据源实例位置的上下文的路径。提供了 initial_context 配置时会在其返回的上下文中进行查找,没有提供时则直接在 InitialContext 中查找。
51                 和其他数据源配置类似,可以通过添加前缀“env.”直接把属性传递给初始上下文。比如:
52                 env.encoding=UTF8
53                 这就会在初始上下文(InitialContext)实例化时往它的构造方法传递值为 UTF8 的 encoding 属性。
54             -->
55             <dataSource type="POOLED">
56                 <property name="driver" value="com.mysql.jdbc.Driver"/>
57                 <property name="url" value="jdbc:mysql://localhost:3306/test"/>
58                 <property name="username" value="root"/>
59                 <property name="password" value="123456"/>
60             </dataSource>
61         </environment>
62         <environment id="test">
63             <!--配置事务-->
64             <transactionManager type="jdbc"></transactionManager>
65             <!--配置连接池-->
66             <dataSource type="POOLED">
67                 <property name="driver" value="com.mysql.jdbc.Driver"/>
68                 <property name="url" value="jdbc:mysql://localhost:3306/test1"/>
69                 <property name="username" value="root"/>
70                 <property name="password" value="123456"/>
71             </dataSource>
72         </environment>
73     </environments>
74     <!--配置映射文件的路径-->
75     <mappers>
76         <mapper resource="com/example/dao/UserDao.xml"/>
77     </mappers>
78 </configuration>
View Code

 

   XML 配置文件中包含了对 MyBatis 系统的核心设置,包含获取数据库连接实例的数据源(DataSource)和决定事务作用域和控制方式的事务管理器(TransactionManager)。要注意 XML 头部的声明,它用来验证 XML 文档正确性。environment 元素体中包含了事务管理和连接池的配置。mappers 元素则是包含一组映射器(mapper),这些映射器的 XML 映射文件包含了 SQL 代码和映射定义信息。

  从此XML中构建SqlSessionFactory非常简单,主要将配置文件转换为输入流,使用SqSessionlFactoryBuilder通过输入流来构建SqlSessionFactory,构建过程如下:

1 String resource = "org/mybatis/example/mybatis-config.xml";
2 InputStream inputStream = Resources.getResourceAsStream(resource);
3 SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
View Code

5.创建dao层接口,在此为UserDao.java

 1 import com.example.domain.User;
 2 
 3 import java.util.List;
 4 
 5 public interface UserDao {
 6     /*
 7     查询所有用户信息
 8      */
 9     List<User> findAll();
10 }
View Code

6.在resources中创建映射文件,在resources目录下创建与dao层相同的目录结构,例如com.example.dao,需要注意的是在resources目录下需要一级一级的进行创建,目录创建完成后,在dao目录下创建与UserDao接口对应的Mapper映射文件UserDao.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所对应的dao接口-->
 6 <mapper namespace="com.example.dao.UserDao">
 7     <!--外部 resultMap 的命名引用。结果集的映射是 MyBatis 非常强大的特性,
 8     可以使用 resultMap 或 resultType,但不能同时使用。因为领域类的命名与数据库中的命名存在差异所以需要做结果集的映射-->
 9     <resultMap id="userResultMap" type="com.example.domain.User">
10         <result property="nickName" column="nick_name"/>
11         <result property="registerDate" column="register_date"/>
12     </resultMap>
13     <!--通过id属性指定dao接口中的方法名称,要执行的sql也在这里绑定,通过命名空间+方法名称就可以绑定唯一的方法 resultMap指定返回结果封装映射-->
14     <select id="findAll" resultMap="userResultMap">
15       select * from user;
16     </select>
17 </mapper>
View Code

7.编写测试类进行测试:

 1  @Test
 2     public void findAll(){
 3         try {
 4             //1.读取配置文件,生成字节输入流
 5             InputStream in = Resources.getResourceAsStream("SqlMapConfig.xml");
 6             //2.获取SqlSessionFactory
 7             SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(in);
 8             //3.获取SqlSession对象
 9             SqlSession session = factory.openSession();
10             //4.获取dao的代理对象
11             UserDao mapper = session.getMapper(UserDao.class);
12             //5.执行查询所有的方法
13             List<User> list = mapper.findAll();
14             for (User user:list){
15                 System.out.println(user);
16             }
17             session.close();
18         }catch (Exception e){
19             e.printStackTrace();
20         }
21 
22     }
View Code

测试结果:

 参考网址:mybatis的中文官网http://www.mybatis.org/mybatis-3/zh/sqlmap-xml.html