Maven 项目使用mybatis的环境搭建-基于xml形式实现查询所有的功能
首先了解一下什么是 MyBatis?
MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解来配置和映射原生类型、接口和 Java 的 POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。
本例子将通过一个简单的查询所有的用户信息的动作来简单的解析如何在Maven项目中使用mybatis。
1.本例使用的数据库为mysql,首先在数据库test中创建user表,并添加一些基本的数据。
-- ----------------------------
-- Table structure for user
-- ----------------------------
DROP TABLE IF EXISTS `user`;
CREATE TABLE `user` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`username` varchar(255) NOT NULL,
`password` varchar(255) NOT NULL,
`nick_name` varchar(255) DEFAULT NULL,
`sex` int(1) DEFAULT NULL,
`register_date` datetime NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8; -- ----------------------------
-- Records of user
-- ----------------------------
INSERT INTO `user` VALUES ('', '89921218@qq.com', '1ee04e0b1cb5af7367c80c22e42efd8b', '土豆', '', '2017-06-23 14:24:23');
INSERT INTO `user` VALUES ('', '2@qq.com', '1ee04e0b1cb5af7367c80c22e42efd8b', '土豆-2', '', '2017-06-23 14:24:23');
INSERT INTO `user` VALUES ('', '3@qq.com', '1ee04e0b1cb5af7367c80c22e42efd8b', '土豆-3', '', '2017-06-23 14:24:23');
INSERT INTO `user` VALUES ('', '4@qq.com', '1ee04e0b1cb5af7367c80c22e42efd8b', '土豆-4', '', '2017-06-23 14:24:23');
INSERT INTO `user` VALUES ('', '5@qq.com', '1ee04e0b1cb5af7367c80c22e42efd8b', '土豆-5', '', '2017-06-23 14:24:23');
INSERT INTO `user` VALUES ('', '6@qq.com', '1ee04e0b1cb5af7367c80c22e42efd8b', '土豆-6', '', '2017-06-23 14:24:23');
INSERT INTO `user` VALUES ('', '7@qq.com', '1ee04e0b1cb5af7367c80c22e42efd8b', '土豆-7', '', '2017-06-23 14:24:23');
INSERT INTO `user` VALUES ('', '8@qq.com', '1ee04e0b1cb5af7367c80c22e42efd8b', '土豆-8', '', '2017-06-23 14:24:23');
INSERT INTO `user` VALUES ('', '9@qq.com', '1ee04e0b1cb5af7367c80c22e42efd8b', '土豆-9', '', '2017-06-23 14:24:23');
INSERT INTO `user` VALUES ('', '10@qq.com', '1ee04e0b1cb5af7367c80c22e42efd8b', '土豆-10', '', '2017-06-23 14:24:23');
SET FOREIGN_KEY_CHECKS=1;
2.在项目中创建对应的实体类User类
package com.example.domain; import java.io.Serializable;
import java.util.Date; public class User implements Serializable{
private Integer id;
private String username;
private String password;
private String nickName;
private Integer sex;
private Date registerDate; public Integer getId() {
return id;
} public void setId(Integer id) {
this.id = id;
} public String getUsername() {
return username;
} public void setUsername(String username) {
this.username = username;
} public String getPassword() {
return password;
} public void setPassword(String password) {
this.password = password;
} public String getNickName() {
return nickName;
} public void setNickName(String nickName) {
this.nickName = nickName;
} public Integer getSex() {
return sex;
} public void setSex(Integer sex) {
this.sex = sex;
} public Date getRegisterDate() {
return registerDate;
} public void setRegisterDate(Date registerDate) {
this.registerDate = registerDate;
} @Override
public String toString() {
return "User{" +
"id=" + id +
", username='" + username + '\'' +
", password='" + password + '\'' +
", nickName='" + nickName + '\'' +
", sex=" + sex +
", registerDate=" + registerDate +
'}';
}
}
3.将下面的 dependency 代码置于 pom.xml 文件中,由于本例使用mysql数据库所以需要添加mysql数据库连接驱动,再加入mybatis依赖以及junit测试依赖。
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.6</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.8</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.5</version>
</dependency>
4.创建构建 SqlSessionFactory所需的xml,在resources目录下创建SqlMapConfig.xml,为方便大家理解,将配置文件的每一项的解释都添加在了配置文件中,内容如下:
<?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配置本次连接的可能所有的所需要的环境,每一个子标签environment都代表一种环境,
尽管可以配置多个环境,但每个 SqlSessionFactory 实例只能选择一种环境,记得必须选择一种环境
default默认使用的环境 ID(比如:default="test")-->
<environments default="test">
<!--每个 environment 元素定义的环境 ID,起名mysql只是了方便辨识代表哪种连接,与实际连接的数据库为mysql没有关系(比如:id="mysql")-->
<environment id="mysql">
<!--事务管理器的配置:
通过type选择事务管理器类型
在 MyBatis 中有两种类型的事务管理器:
JDBC – 这个配置就是直接使用了 JDBC 的提交和回滚设置,它依赖于从数据源得到的连接来管理事务作用域。
MANAGED – 这个配置几乎没做什么。它从来不提交或回滚一个连接,而是让容器来管理事务的整个生命周期(比如 JEE 应用服务器的上下文)
默认情况下它会关闭连接,然而一些容器并不希望这样,因此需要将 closeConnection 属性设置为 false 来阻止它默认的关闭行为。例如:
<transactionManager type="MANAGED">
<property name="closeConnection" value="false"/>
</transactionManager>
提示如果你正在使用 Spring + MyBatis,则没有必要配置事务管理器, 因为 Spring 模块会使用自带的管理器来覆盖前面的配置。
-->
<transactionManager type="jdbc"></transactionManager>
<!--数据源配置:
有三种内建的数据源类型(也就是 type=”[UNPOOLED|POOLED|JNDI]”):
UNPOOLED– 这个数据源的实现只是每次被请求时打开和关闭连接。虽然有点慢,但对于在数据库连接可用性方面没有太高要求的简单应用程序来说,是一个很好的选择。 不同的数据库在性能方面的表现也是不一样的,对于某些数据库来说,使用连接池并不重要,这个配置就很适合这种情形。UNPOOLED 类型的数据源具有以下属性。:
driver – 这是 JDBC 驱动的 Java 类的完全限定名(并不是 JDBC 驱动中可能包含的数据源类)。
url – 这是数据库的 JDBC URL 地址。
username – 登录数据库的用户名。
password – 登录数据库的密码。
defaultTransactionIsolationLevel – 默认的连接事务隔离级别。
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.
作为可选项,你也可以传递属性给数据库驱动。只需在属性名加上“driver.”前缀即可,例如:
driver.encoding=UTF8
这将通过 DriverManager.getConnection(url,driverProperties) 方法传递值为 UTF8 的 encoding 属性给数据库驱动。 POOLED– 这种数据源的实现利用“池”的概念将 JDBC 连接对象组织起来,避免了创建新的连接实例时所必需的初始化和认证时间。 这是一种使得并发 Web 应用快速响应请求的流行处理方式。
除了上述提到 UNPOOLED 下的属性外,还有更多属性用来配置 POOLED 的数据源:
poolMaximumActiveConnections – 在任意时间可以存在的活动(也就是正在使用)连接数量,默认值:10
poolMaximumIdleConnections – 任意时间可能存在的空闲连接数。
poolMaximumCheckoutTime – 在被强制返回之前,池中连接被检出(checked out)时间,默认值:20000 毫秒(即 20 秒)
poolTimeToWait – 这是一个底层设置,如果获取连接花费了相当长的时间,连接池会打印状态日志并重新尝试获取一个连接(避免在误配置的情况下一直安静的失败),默认值:20000 毫秒(即 20 秒)。
poolMaximumLocalBadConnectionTolerance – 这是一个关于坏连接容忍度的底层设置, 作用于每一个尝试从缓存池获取连接的线程。 如果这个线程获取到的是一个坏的连接,那么这个数据源允许这个线程尝试重新获取一个新的连接,但是这个重新尝试的次数不应该超过 poolMaximumIdleConnections 与 poolMaximumLocalBadConnectionTolerance 之和。 默认值:3 (新增于 3.4.5)
poolPingQuery – 发送到数据库的侦测查询,用来检验连接是否正常工作并准备接受请求。默认是“NO PING QUERY SET”,这会导致多数数据库驱动失败时带有一个恰当的错误消息。
poolPingEnabled – 是否启用侦测查询。若开启,需要设置 poolPingQuery 属性为一个可执行的 SQL 语句(最好是一个速度非常快的 SQL 语句),默认值:false。
poolPingConnectionsNotUsedFor – 配置 poolPingQuery 的频率。可以被设置为和数据库连接超时时间一样,来避免不必要的侦测,默认值:0(即所有连接每一时刻都被侦测 — 当然仅当 poolPingEnabled 为 true 时适用)。 JNDI – 这个数据源的实现是为了能在如 EJB 或应用服务器这类容器中使用,容器可以集中或在外部配置数据源,然后放置一个 JNDI 上下文的引用。这种数据源配置只需要两个属性
initial_context – 这个属性用来在 InitialContext 中寻找上下文(即,initialContext.lookup(initial_context))。这是个可选属性,如果忽略,那么将会直接从 InitialContext 中寻找 data_source 属性。
data_source – 这是引用数据源实例位置的上下文的路径。提供了 initial_context 配置时会在其返回的上下文中进行查找,没有提供时则直接在 InitialContext 中查找。
和其他数据源配置类似,可以通过添加前缀“env.”直接把属性传递给初始上下文。比如:
env.encoding=UTF8
这就会在初始上下文(InitialContext)实例化时往它的构造方法传递值为 UTF8 的 encoding 属性。
-->
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/test"/>
<property name="username" value="root"/>
<property name="password" value="123456"/>
</dataSource>
</environment>
<environment id="test">
<!--配置事务-->
<transactionManager type="jdbc"></transactionManager>
<!--配置连接池-->
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/test1"/>
<property name="username" value="root"/>
<property name="password" value="123456"/>
</dataSource>
</environment>
</environments>
<!--配置映射文件的路径-->
<mappers>
<mapper resource="com/example/dao/UserDao.xml"/>
</mappers>
</configuration>
XML 配置文件中包含了对 MyBatis 系统的核心设置,包含获取数据库连接实例的数据源(DataSource)和决定事务作用域和控制方式的事务管理器(TransactionManager)。要注意 XML 头部的声明,它用来验证 XML 文档正确性。environment 元素体中包含了事务管理和连接池的配置。mappers 元素则是包含一组映射器(mapper),这些映射器的 XML 映射文件包含了 SQL 代码和映射定义信息。
从此XML中构建SqlSessionFactory非常简单,主要将配置文件转换为输入流,使用SqSessionlFactoryBuilder通过输入流来构建SqlSessionFactory,构建过程如下:
String resource = "org/mybatis/example/mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
5.创建dao层接口,在此为UserDao.java
import com.example.domain.User;
import java.util.List;
public interface UserDao {
/*
查询所有用户信息
*/
List<User> findAll();
}
6.在resources中创建映射文件,在resources目录下创建与dao层相同的目录结构,例如com.example.dao,需要注意的是在resources目录下需要一级一级的进行创建,目录创建完成后,在dao目录下创建与UserDao接口对应的Mapper映射文件UserDao.xml
<?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所对应的dao接口-->
<mapper namespace="com.example.dao.UserDao">
<!--外部 resultMap 的命名引用。结果集的映射是 MyBatis 非常强大的特性,
可以使用 resultMap 或 resultType,但不能同时使用。因为领域类的命名与数据库中的命名存在差异所以需要做结果集的映射-->
<resultMap id="userResultMap" type="com.example.domain.User">
<result property="nickName" column="nick_name"/>
<result property="registerDate" column="register_date"/>
</resultMap>
<!--通过id属性指定dao接口中的方法名称,要执行的sql也在这里绑定,通过命名空间+方法名称就可以绑定唯一的方法 resultMap指定返回结果封装映射-->
<select id="findAll" resultMap="userResultMap">
select * from user;
</select>
</mapper>
7.编写测试类进行测试:
@Test
public void findAll(){
try {
//1.读取配置文件,生成字节输入流
InputStream in = Resources.getResourceAsStream("SqlMapConfig.xml");
//2.获取SqlSessionFactory
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(in);
//3.获取SqlSession对象
SqlSession session = factory.openSession();
//4.获取dao的代理对象
UserDao mapper = session.getMapper(UserDao.class);
//5.执行查询所有的方法
List<User> list = mapper.findAll();
for (User user:list){
System.out.println(user);
}
session.close();
}catch (Exception e){
e.printStackTrace();
} }
测试结果:
参考网址:mybatis的中文官网http://www.mybatis.org/mybatis-3/zh/sqlmap-xml.html
Maven 项目使用mybatis的环境搭建-基于xml形式实现查询所有的功能的更多相关文章
- 基于Maven的Spring + Spring MVC + Mybatis的环境搭建
基于Maven的Spring + Spring MVC + Mybatis的环境搭建项目开发,先将环境先搭建起来.上次做了一个Spring + Spring MVC + Mybatis + Log4J ...
- SSM(Spring+SpringMVC+Mybatis)框架环境搭建(整合步骤)(一)
1. 前言 最近在写毕设过程中,重新梳理了一遍SSM框架,特此记录一下. 附上源码:https://gitee.com/niceyoo/jeenotes-ssm 2. 概述 在写代码之前我们先了解一下 ...
- mybatis学习:mybatis的环境搭建与入门
一.mybatis的概述: mybatis是一个持久层框架,用java编写 它封装了jdbc操作的很多细节,使开发者只需要关注sql语句本身,而无需关注注册驱动,创建连接登繁杂过程 它使用了ORM思想 ...
- IDEA+Java:Selenium+Maven+TestNG基本WebUI自动化测试环境搭建
IDEA+java:Selenium+Maven+TestNG 本文介绍的测试环境,应该是最基本的测试环境了,也是很多文章都有写,这里做一个完整的图文配置整理,方便阅读理解! 使用maven的好处,由 ...
- Maven项目使用mybatis报错 org.apache.ibatis.binding.BindingException: Invalid bound statement (not found):
maven项目使用mybatis时,找不到mapper文件(.xml) 错误信息提示: 项目可以正常运行,但是在有请求到达服务器时(有访问数据库的请求),会出现报错!! 错误原因: mybatis没有 ...
- java selenium (三) 环境搭建 基于Maven
现在Java的大部分项目都是基于Maven, 在Maven项目中使用Selenium2. 非常简单. 首先你需要配置好Maven的环境 可以参考本博客的Maven教程系列,Maven入门教程(一) ...
- 项目SpringMVC+Spring+Mybatis 整合环境搭建(2)-> 测试Spring+Mybatis 环境
测试前期准备 第一步:创建easybuy数据库,设置utf-8格式 第二步:创建表test_tb CREATE TABLE `test_tb` ( `id` int(11) NOT NULL AUTO ...
- 基于maven来Spring MVC的环境搭建遇到“坑”
1.注解配置路径问题: 在web.xml中配置spring mvc 路径时, 应该配置如下:classpath:classpath:spring-* 2.jdk版本和Spring MVC版本不一致问题 ...
- 开源项目学习之------AG-Admin环境搭建
原文地址: https://blog.csdn.net/u011781521/article/details/79056974 一.框架简介 AG-Admin是基于Spring Cloud微服务化开发 ...
随机推荐
- 实现socket的服务和客户端通信
对学习过程中自己敲的一些关于socket有关的代码做了个简单总结,在这分享一下,给有需要的同学借鉴一下. 什么是socket? 网络上的两个程序通过一个双向的通信连接实现数据的交换,这个连接的一端称为 ...
- c++学习书籍推荐《C++ GUI Qt 4编程(第2版)》下载
下载地址:点我 百度云及其他网盘下载地址:点我 编辑推荐 <C++ GUI Qt 4编程(第2版)>讲授的大量Qt4编程原理和实践,都可以轻易将其应用于Qt4.4.Qt4.5及后续版本的Q ...
- vue组件间通信六种方式(完整版)
本文总结了vue组件间通信的几种方式,如props. $emit/ $on.vuex. $parent / $children. $attrs/ $listeners和provide/inject,以 ...
- Nginx+vsftpd
一.安装Nginx 关闭selinux和firewalld setenforce sed -i 's/^SELINUX=enforcing$/SELINUX=disabled/' /etc/selin ...
- mvc区分页面内请求判断是否是Html.action或Html.RenderAction请求
ControllerContext.IsChildAction 来判断,如果用Html.Action或Html.RenderAction方法,这个属性返回true,否则返回false
- Java并发-CopyOnWriteArrayList
前言 今天我们一起学习下java.util.concurrent并发包里的CopyOnWriteArrayList工具类.当有多个线程可能同时遍历.修改某个公共数组时候,如果不希望因使用synchro ...
- c语言进阶2-变量的作用域与无参函数
一. 什么是函数 函数是具有特定功能的模块.可以说一个完整的程序其实是由多个函数共同完成的.C语言的全部工作都是由程式各样的函数完成的,所以也把C语言称为函数式语言.使用模块化设计可能 使 ...
- fjnu2016-2017 低程 PROBLEM B 捧杯
#include <iostream>#include <cmath>using namespace std; int _gcd(int x,int y){ return y= ...
- 并发,并行,线程,进程,GIL锁
1.并发和并行 并发: 同时做某些事,但是强调同一时段做多件事 如:同一路口,发生了车辆要同时通过路面的时间. 并行: 互不干扰的在同一时刻做多件事 如:同一时刻,同时有多辆车在多条车道上跑,即同时发 ...
- 解决Oracle.DataAccess.Client.OracleConnection”的类型初始值设定项引发异常。
解决Oracle.DataAccess.Client.OracleConnection”的类型初始值设定项引发异常. 这个问题他们说是oracle的版本问题 但是好像不是...(我感觉VS版本问题,我 ...