什么是 MyBatis?
MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解来配置和映射原生类型、接口和 Java 的 POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。
回答得这么官方一看就是官网(https://mybatis.org/mybatis-3/zh/index.html)拷贝过来的啦。
根据官网的描述来看,Mybatis是基于持久层(DAO)的一个框架,然后就是mybatis对传统JDBC操作进行了封装和简化(划重点)。
MyBatis有什么用?
既然是对jdbc的简化封装,当然是为了更方便地对数据库进行操作啦。
MyBatis如何使用?
重点来了看下面↓
先看一下官网是怎么说的
大概意思就是,你把jar包丢进去就可以用了。牛*那就来吧!
首先打开工具IDEA
创建一个新的项目
你可以使用其他方式创建项目,为了方便快捷我这里直接用maven创建。
点maven不使用骨架,直接Next下一步创建项目。
然后填写你项目的坐标,也就是项目名。
ArtifactID是指项目的标识,定义了项目属于哪个组,一般由你公司域名倒写如:com.baidu
Artifacted定义了当前maven项目在组中唯一的ID,写项目名就行了
如果子父工程的项目这部分比较重要
我这个是单模块,so~填完点击next下一步
在这里继续填写你的项目名,还有你项目存放的路径。
注意下面折叠起来的信息!
搞定之后finish创建项目项目就出来了
项目创建完了,创建个数据库创建个表
-- 1.创建数据库
CREATE DATABASE mybatis DEFAULT CHARACTER SET utf8;
-- 2.创建用户表
DROP TABLE IF EXISTS USER;CREATE TABLE USER (id INT(11) NOT NULL AUTO_INCREMENT,username VARCHAR(32) NOT NULL COMMENT '用户名称',birthday DATETIME DEFAULT NULL COMMENT '生日',sex CHAR(1) DEFAULT NULL COMMENT '性别',address VARCHAR(256) DEFAULT NULL COMMENT '地址',PRIMARY KEY (id)
) ENGINE=INNODB DEFAULT CHARSET=utf8;INSERT INTO USER(id,username,birthday,sex,address) VALUES
(41,'小三','2019-09-27 17:47:08','女','东莞'),
(42,'小四','2019-09-02 15:09:37','女','东莞'),
(43,'小五','2019-09-04 11:34:34','女','东莞'),
(45,'小六','2019-09-05 12:04:06','男','北京'),
(46,'老王','2019-09-07 17:37:26','男','上海'),
(48,'老李','2019-09-08 11:44:00','男','广州');
项目创建好了,数据也有了,开始写项目了。
先创建一个实体类
mybatis01\src\main\java\com\Mrhu\entity\User.java
然后完善实体类,把数据库的字段跟实体类属性对应好,一张表对应一个实体类,提供get和set方法。在这里不多解释了
import java.util.Date;public class User {private int id;private String username;private Date birthday;private String sex;private String address;public int getId() {return id;}public void setId(int id) {this.id = id;}public String getUsername() {return username;}public void setUsername(String username) {this.username = username;}public Date getBirthday() {return birthday;}public void setBirthday(Date birthday) {this.birthday = birthday;}public String getSex() {return sex;}public void setSex(String sex) {this.sex = sex;}public String getAddress() {return address;}public void setAddress(String address) {this.address = address;}
}
接着添加依赖,就是添加jar包。
在maven的pom.xml进行依赖添加
<dependencies><!--要用mybatis肯定要他的包才能用,下面导入mybatis--><dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId><version>3.4.5</version></dependency><!--mysql数据库驱动包--><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>5.1.30</version></dependency><!--日志包,可以要可以不用--><dependency><groupId>log4j</groupId><artifactId>log4j</artifactId><version>1.2.17</version></dependency><!--junit测试包方便测试运行--><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.10</version></dependency></dependencies>
导入后刷新一下maven,没有报错就没问题了。
导入jar包没问题,第一步安装就已经完成了。接着按照官网提示就是需要进行一些配置。
从官网的描述来看,我们需要一些配置(SqlSessionFactory),这些配置包含了一些核心配置(好绕)!官网给出了两种配置方式:1.使用java代码进行配置;2.使用xml文件进行配置。so,那么来看看有哪些配置吧!
首先我这里使用的是第二种(使用xml文件进行配置),先创建一个xml文件(mybatis01\src\main\resources\SqlMapConfig.xml)空文件,名字叫SqlMapConfig.xml当然名字可以随意取不要花里胡哨就行,要遵循规范要见名知意,比如applicationContext.xml也是有人取。
文件创建好了之后,文件里该填些什么,继续看一下官网。
通过官网的描述,大概分析出,我们需要配置一些属性环境变量等东西。比较显眼的环境变量、数据源,也就是说连接数据库的东西在这配置。具体可以自己详看官网文档(有中文很友好)。
大概知道我们需要配置啥了,开始操作。
第一步是copy代码(能copy就不要敲,新手勿模仿)
先把文件头copy进来,这部分最好copy别自己手写没意义。
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configurationPUBLIC "-//mybatis.org//DTD Config 3.0//EN""http://mybatis.org/dtd/mybatis-3-config.dtd">
这段代码是添加约束,输入里面那个网址http://mybatis.org/dtd/mybatis-3-config.dtd就会下载出一个.dtd的文件,添加了约束之后你这个xml文件就要按照这个文件的规定来写,详细自己去摆渡了解。
添加依赖后继续完成下面的代码,就是属性的配置。
约束可以看出根节点为configuration
然后看看有哪些重要的属性,既然是基于JDBC的框架,那么肯定先得连接数据库吧,数据库都没连上说那么多都没意义。那就找找连接数据库的配置8.
找到这个环境配置就是配置数据源的,那就看看8.
可以看到这就是配置数据源的玩意,官网提供了两种方式,一种是基于java代码的配置,另一种是xml的设置,我这用的是xml方式那就按xml的来,做啥都要统一嘛。那就直接copy一下咯!
继续分析一下都是啥玩意
首先
environments default=“development”:他的描述是默认使用的环境 ID,其实就是下面的environment(后面没有s的看清楚)可以配置多个,id是指定使用其中一个。示范
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configurationPUBLIC "-//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"><property name="..." value="..."/></transactionManager><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><environment id="development1"><transactionManager type="JDBC"><property name="..." value="..."/></transactionManager><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><environment id="development2"><transactionManager type="JDBC"><property name="..." value="..."/></transactionManager><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>
</configuration>
就是说可以配置多个数据库的连接配置,然后**environments default=“development”**的作用是指定某一个配置
environment id=“development”:每个 environment 元素定义的环境 ID,上面已经解释的很清楚了,注意这个id最好用数据库的名字来命名如
<configuration><environments default="Oracle"><environment id="mysql"><transactionManager type="JDBC"><property name="..." value="..."/></transactionManager><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><environment id="Oracle"><transactionManager type="JDBC"><property name="..." value="..."/></transactionManager><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><environment id="MongoDB"><transactionManager type="JDBC"><property name="..." value="..."/></transactionManager><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>
</configuration>
transactionManager type=“JDBC”:事务管理器的配置(比如:type=“JDBC”)这个我就直接复制官网的话了,已经说的通俗易懂。
在 MyBatis 中有两种类型的事务管理器(也就是 type=”[JDBC|MANAGED]”):
JDBC – 这个配置就是直接使用了 JDBC 的提交和回滚设置,它依赖于从数据源得到的连接来管理事务作用域。
MANAGED – 这个配置几乎没做什么。它从来不提交或回滚一个连接,而是让容器来管理事务的整个生命周期(比如 JEE 应用服务器的上下文)。 默认情况下它会关闭连接,然而一些容器并不希望这样,因此需要将 closeConnection 属性设置为 false 来阻止它默认的关闭行为。例如
<transactionManager type="MANAGED"><property name="closeConnection" value="false"/>
</transactionManager>
所以用JDBC就行了。(文章不对事务进行分析详细自行摆渡)
继续
dataSource type=“POOLED”:官方话太多我就不复制了,dataSource数据源的意思,tpye=POOLED(连接池),推测一下这应该就是连接池的配置8。
官网推荐了三种:[UNPOOLED|POOLED|JNDI]
我这就用推荐的POOLED具体有什么区别自行摆渡。
driver – 这是 JDBC 驱动的 Java 类的完全限定名(并不是 JDBC 驱动中可能包含的数据源类)。
url – 这是数据库的 JDBC URL 地址。
username – 登录数据库的用户名。
password – 登录数据库的密码。
到这里全都搞定了
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configurationPUBLIC "-//mybatis.org//DTD Config 3.0//EN""http://mybatis.org/dtd/mybatis-3-config.dtd"><configuration><!--default 表示默认使用哪一个运行环境配置--><environments default="mysql"><!--id="mysql" 表示mysql的运行环境配置--><environment id="mysql"><!--事务管理器配置:基于JDBC的事务控制--><transactionManager type="JDBC"></transactionManager><!--连接池配置(UNPOOLED/POOLED/JNDI)--><dataSource type="pooled"><property name="driver" value="com.mysql.jdbc.Driver"></property><property name="url" value="jdbc:mysql:///mybatis?characterEncoding=utf8"></property><property name="username" value="root"></property><property name="password" value="root"></property></dataSource></environment></environments>
</configuration>
基本的配置完,下面为了快速上手简化操作,我将脱离官网的描述与步骤。
目前我们的目录
继续创建一个接口
mybatis01\src\main\java\com\Mrhu\dao\UserDao.java
然后添加个查询方法。
import com.Mrhu.entity.User;import java.util.List;public interface UserDao {List<User> findAll();}
注意是interface(接口)不是class(类)!
注意导包!
使用mybatis将不需要写接口的实现
继续创建关于这个接口的mapper,在这里定义SQL 映射语句。也就是sql在这里写。
那么创建这个文件先
mybatis01\src\main\resources\com\Mrhu\dao\UserDao.xml
继续编写这个文件
老样子添加约束
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd"><mapper></mapper>
mapper是根节点里面包含了许多标签
例如最常使用的增删改查,那就先写句简单的sql吧。
注意属性值,这段代码不要完全复制粘贴!
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd"><mapper namespace="com.Mrhu.dao.UserDao"><select id="findAll" resultType="com.Mrhu.entity.User">select * from user</select>
</mapper>
namespace 名称空间,表示当前的xml是哪一个接口的映射
select id 对应的是IUserDao接口的方法名称
select resultType 方法的返回值类型,如果方法返回的是集合,只要指定集合中元素的类型
select标签里面则是sql语句标签,我这里直接用sql语句暂且没用sql语句标签。
接口映射文件写完了
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!--namespace 名称空间,表示当前的xml是哪一个接口的映射-->
<mapper namespace="com.Mrhu.dao.UserDao"><!--id 对应的是IUserDao接口的方法名称--><!--resultType 方法的返回值类型,如果方法返回的是集合,只要指定集合中元素的类型--><!--如何封装数据?mybatis会自动封装数据,要求:查询列名称要与对象的属性名称一致。--><select id="findAll" resultType="com.Mrhu.entity.User">select * from user</select>
</mapper>
接着要加载这个配置文件,那就需要在之前的主配置文件中加上一段。
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configurationPUBLIC "-//mybatis.org//DTD Config 3.0//EN""http://mybatis.org/dtd/mybatis-3-config.dtd"><configuration><!--default 表示默认使用哪一个运行环境配置--><environments default="mysql"><!--id="mysql" 表示mysql的运行环境配置--><environment id="mysql"><!--事务管理器配置:基于JDBC的事务控制--><transactionManager type="JDBC"></transactionManager><!--连接池配置(UNPOOLED/POOLED/JNDI)--><dataSource type="pooled"><property name="driver" value="com.mysql.jdbc.Driver"></property><property name="url" value="jdbc:mysql:///mybatis?characterEncoding=utf8"></property><property name="username" value="root"></property><property name="password" value="root"></property></dataSource></environment></environments><!--加载接口的映射文件--><mappers><!--必须放到类路径下--><mapper resource="com/Mrhu/dao/UserDao.xml"></mapper></mappers>
</configuration>
写完了就可以测试了,接着写个测试类测试一下吧。
mybatis01\src\test\java\com\Mrhu\dao\UserDaoTest.java
接着写测试类
import com.Mrhu.entity.User;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Test;import java.io.IOException;
import java.io.InputStream;
import java.util.List;public class UserDaoTest {@Testpublic void findAll() throws IOException {// 1. 获取文件流InputStream in = Resources.getResourceAsStream("SqlMapConfig.xml");// 2. 创建工厂的构建器SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();// 3. 创建SqlSession的工厂SqlSessionFactory factory = builder.build(in);// 3. 创建SqlSessionSqlSession session = factory.openSession();// 4. 创建接口的代理对象UserDao userDao = session.getMapper(UserDao.class);// 查看是否是代理对象?class com.sun.proxy.$Proxy2System.out.println(userDao.getClass());// 5. 调用方法List<User> list = userDao.findAll();System.out.println(list);// 6. 关闭,释放资源session.close();in.close();}
}
写完直接运行方法看是否查出数据,如果有就代表成功了。
如果报错了
1.确定你的运行环境正常
2.确定你数据源所指定的地址,数据库的账号密码是否一致。
3.确定你的数据库是能连接上的,如mysql服务没打开
4.确定你代码里文件路径是对的
5.如果能运行但是报了这样的错了
你是导了log4j没有配置
那么创建一个log4j的配置文件
mybatis01\src\main\resources\log4j.properties
文件内容直接copy这里,需要详细了解里面内容请自行摆渡log4j
# Set root category priority to INFO and its only appender to CONSOLE.
#log4j.rootCategory=INFO, CONSOLE debug info warn error fatal
log4j.rootCategory=debug, CONSOLE, LOGFILE# Set the enterprise logger category to FATAL and its only appender to CONSOLE.
log4j.logger.org.apache.axis.enterprise=FATAL, CONSOLE# CONSOLE is set to be a ConsoleAppender using a PatternLayout.
log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender
log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout
log4j.appender.CONSOLE.layout.ConversionPattern=%d{ISO8601} %-6r [%15.15t] %-5p %30.30c %x - %m\n# LOGFILE is set to be a File appender using a PatternLayout.
log4j.appender.LOGFILE=org.apache.log4j.FileAppender
log4j.appender.LOGFILE.File=d:\axis.log
log4j.appender.LOGFILE.Append=true
log4j.appender.LOGFILE.layout=org.apache.log4j.PatternLayout
log4j.appender.LOGFILE.layout.ConversionPattern=%d{ISO8601} %-6r [%15.15t] %-5p %30.30c %x - %m\n
继续运行,控制台打印的内容将更详细
如有错误的地方请指出,本文将持续更新修改。
完结