![](https://i-blog.csdnimg.cn/blog_migrate/83214030269bd9fba0b95695bfde633f.png)
MyBatis架构图的解释(关于下面的解释,可能有的地方现在看起来不是很明白,但是不用担心,在后面有代码解释,对照代码理解这些东西就容易多了):(1).MyBatis全局配置文件SqlMapConfig.xml
MyBatis在使用时需要配置全局配置文件SqlMapConfig.xml,该文件中配置 MyBatis的环境信息(如JDBC事务管理、数据库连接池等信息,但是我们在实际开发中,当MyBatis和Spring框架进行整合后,这些环境信息一般由Spring来统一管理)、引入 MyBatis映射文件等信息。(2).会话工厂SqlSessionFactory会话工厂用来创建会话SqlSession。
(3).会话SqlSessionSqlSession是面向我们程序员的接口,也就是说,我们是通过Sqlsession来操作数据库的(增删改查)。
(4).执行器Executor
上面说到了我们程序员是通过SqlSession会话来操作数据库的,但是其实在SqlSession的内部,是通过执行器Executor来操作数据库的。
(5).MappedStatement
一个MappedStatement对应MyBatis映射文件(如:UserMapper.xml)中的一个select/insert/update/delete节点,主要描述的是一条SQL语句。或者说一个MapperedStatement就是映射文件中的一个select/insert/update/delete标签。
(6).输入映射(输入参数)、输出映射(返回结果)
每个MappedStatement(理解为select/insert/update/delete标签)会通过parameterType(输入参数类型)、resultType/resultMap(返回结果类型)标签属性,指定SQL执行的输入参数类型和返回结果集的类型。
三、MyBatis工程架构
按照下面的步骤搭建一个MyBatis项目:
1、新建web项目
2、下载jar包、导入jar包(放到lib文件夹下)
MyBatis需导入的基本jar包可以分为3类:核心包、依赖包、数据库驱动包(MySql或Oracle)。下载完MyBatis jar文件后解压打开如下图所示,其中mybatis-3.2.7.jar为核心包,lib下存放的全部为依赖包,复制mybatis-3.2.7.jar以及lib下的所有jar包,粘贴到eclipse项目lib目录下。另外,因为MyBatis是持久层框架,用来操作数据库,所以我们还需要MySql的数据库驱动包。
MyBatis jar官方下载地址: https://github.com/mybatis/mybatis-3/releases。关于上面提到的MyBatis所需的所有基本jar包,我已全部整理打包到一起,读者可直接去我的资源库免积分下载:3、创建log4j.properties文件在Java Resources目录下新建Source Folder,命名为config,我们可以再config里面新建log4j.properties文件。log4j.properties文件配置如下:4、创建db.properties文件# Global logging configuration log4j.rootLogger=DEBUG, stdout # MyBatis logging configuration... log4j.logger.org.mybatis.example.BlogMapper=TRACE # Console output... log4j.appender.stdout=org.apache.log4j.ConsoleAppender log4j.appender.stdout.layout=org.apache.log4j.PatternLayout log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n
为了方便管理和修改数据库连接信息,我们将数据库连接信息集中编写在db.properties文件中。在前面新建的config下创建db.properties文件,db.properties配置如下(我的MySql端口是3333,读者根据自己实际情况进行端口等信息的配置):5、创建MyBatis全局配置文件SqlMapConfig.xml文件db.driver=com.mysql.jdbc.Driver db.url=jdbc:mysql://localhost:3333/mybatis?useUnicode=true&characterEncoding=UTF-8 db.username=yuanlong_mybatis db.password=yuanlong
在config下创建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> <!-- 加载连接池配置文件(此处将之前创建的db.properties数据库连接文件引入) --> <properties resource="db.properties" /> <!-- 配置MyBatis的环境信息(注意:MyBatis和Spring整合后,该环境信息将由Spring来管理,也就是将不再需要配置下面这段话) --> <environments default="development"> <environment id="development"> <!-- 配置JDBC事务管理 --> <transactionManager type="JDBC"></transactionManager> <!-- 配置数据源(数据库连接池) --> <dataSource type="POOLED"> <property name="driver" value="${db.driver}" /> <property name="url" value="${db.url}" /> <property name="username" value="${db.username}" /> <property name="password" value="${db.password}" /> </dataSource> </environment> </environments> <!-- 注意:此处引入的是MyBatis映射文件,映射文件的创建在下面介绍 --> <mappers> <mapper resource="sqlmap/User.xml" /> <mapper resource="sqlmap/UserMapper.xml" /> </mappers> </configuration>
四、入门程序
(1).MyBatis是操作数据库的持久层框架,为了学习MyBatis我们应该首先创建表(当然关于MySql数据库的安装什么的,还没安装的同学自己百度哦),此处学习我们新建User表如下:![]()
为了方便说明,截图本人工程目录层结构(说明:这只是本人习惯的目录层设置方式,不是必须的)。
(2).在bean包下新建与User表对应的bean类User.java(MyBatis提供逆向工程机制,关于逆向工程在后续文章中讲解,此处先手动新建类)。User.java:(4).在config目录下新建sqlmap包,在sqlmap中新建User类对应的映射文件,命名为UserMapper.xml(Mybatis映射文件的习惯命名方式)。package com.yuanlong.mybatis.bean; import java.util.Date; public class User { private Integer id; private String username; private Date birthday; private String sex; private String address; 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 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; } @Override public String toString() { return "User [id=" + id + ", username=" + username + ", birthday=" + birthday + ", sex=" + sex + ", address=" + address + "]"; } }
UserMapper.xml:(5).自定义测试类 MyBatisFirst.java<?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="user"> <select id="findUserById" parameterType="java.lang.Integer" resultType="com.yuanlong.mybatis.bean.User"> SELECT * FROM USER WHERE id = #{id} </select> <select id="findUserByName" parameterType="java.lang.String" resultType="com.yuanlong.mybatis.bean.User"> SELECT * FROM USER WHERE username LIKE '%${value}%' </select> <insert id="insertUser" parameterType="com.yuanlong.mybatis.bean.User"> INSERT INTO user(username,birthday,sex,address) VALUE(#{username},#{birthday},#{sex},#{address}) </insert> <delete id="deleteUser" parameterType="java.lang.Integer"> DELETE FROM USER WHERE id=#{id} </delete> <update id="updateUser" parameterType="com.yuanlong.mybatis.bean.User"> UPDATE USER SET username=#{username}, birthday=#{birthday}, sex=#{sex}, address=#{address} WHERE id=#{id} </update> </mapper>
package com.yuanlong.mybatis.mapper; import java.io.IOException; import java.io.InputStream; import java.text.DateFormat; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; import java.util.List; import org.apache.ibatis.io.Resources; import org.apache.ibatis.scripting.xmltags.SetSqlNode; import org.apache.ibatis.session.SqlSession; import org.apache.ibatis.session.SqlSessionFactory; import org.apache.ibatis.session.SqlSessionFactoryBuilder; import org.junit.Test; import com.yuanlong.mybatis.bean.User; /** * 原始Dao开发方法 * */ public class MyBatisFirst { public void findUserById() throws IOException{ InputStream inputStream = null; SqlSessionFactory sqlSessionFactory = null; SqlSession sqlSession = null; try { //MyBatis配置文件 String resources = "SqlMapConfig.xml"; //构造输入流 inputStream = Resources.getResourceAsStream(resources); //构建sqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); //获取SqlSession sqlSession = sqlSessionFactory.openSession(); //SqlSession是面向我们程序员的接口 //selectOne方法的第一个参数是XML文件中的namespace.id,第二个参数是传入的参数值(parameterType) User user = (User)sqlSession.selectOne("user.findUserById",1); //打印 if(user!=null){ System.out.println(user); } } catch (Exception e) { e.printStackTrace(); } finally { //释放sqlSession sqlSession.close(); } } public void findUserByName() throws IOException{ InputStream inputStream = null;//输入流 SqlSessionFactory sqlSessionFactory = null;//会话工厂 SqlSession sqlSession = null;//会话 try { //MyBatis配置文件 String resource = "SqlMapConfig.xml"; inputStream = Resources.getResourceAsStream(resource); //构造输入流 sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);//会话工厂 sqlSession = sqlSessionFactory.openSession();//会话 List<User> list = sqlSession.selectList("user.findUserByName","源"); for(User user:list){ System.out.println(user.getSex()); } } catch (Exception e) { e.printStackTrace(); } finally { sqlSession.close(); } } @Test public void insertUser() throws IOException, ParseException{ InputStream inputStream = null; SqlSessionFactory sqlSessionFactory = null; SqlSession sqlSession = null; try { //MyBatis配置文件 String resource = "SqlMapConfig.xml"; //输入流 inputStream = Resources.getResourceAsStream(resource); //会话工厂 sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); //会话 sqlSession = sqlSessionFactory.openSession(); User user = new User(); user.setUsername("原晖"); DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd"); Date date = dateFormat.parse("1997-05-29"); user.setBirthday(date); user.setSex("男"); user.setAddress("甘肃省天水市甘谷县磐安"); //sqlSession是面向程序员的接口 sqlSession.insert("user.insertUser1", user); sqlSession.commit(); //获取新增记录自动生成的主键 System.out.println("insert操作执行之后,获取到insert时自动生成的主键id值为:"+user.getId()); } catch (Exception e) { e.printStackTrace(); } finally { sqlSession.close(); } } public void deleteUser() throws IOException{ InputStream inputStream = null; SqlSessionFactory sqlSessionFactory = null; SqlSession sqlSession = null; try { //MyBatis配置文件 String resource = "SqlMapConfig.xml"; //输入流 inputStream = Resources.getResourceAsStream(resource); //会话工厂 sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); //会话 sqlSession = sqlSessionFactory.openSession(); //sqlSession是面向我们程序员的接口 sqlSession.delete("user.deleteUser",7); //提交事务 sqlSession.commit(); } catch (Exception e) { e.printStackTrace(); } finally { sqlSession.close(); } } public void updateUser() throws IOException{ InputStream inputStream = null; SqlSessionFactory sqlSessionFactory = null; SqlSession sqlSession = null; try { //MyBatis配置文件 String resource = "SqlMapConfig.xml"; //输入流 inputStream = Resources.getResourceAsStream(resource); //会话工厂 sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); //会话 sqlSession = sqlSessionFactory.openSession(); User user = new User(); user.setId(1); user.setUsername("原龙"); user.setSex("男"); user.setBirthday(new Date());//当前日期 user.setAddress("兰州理工大学"); //sqlSession是面向我们程序员的接口 sqlSession.update("user.updateUser", user); //提交事务 sqlSession.commit(); } catch (Exception e) { e.printStackTrace(); } finally { sqlSession.close(); } } }
(6).junit单元测试
要想使用junit单元测试,首先要导入jar包,下载地址:http://download.csdn.net/detail/yuanlong122716/9775380
在方法头上添加注解@Test进行增删改查操作的测试。
五、总结
1、UserMapper.xml文件中的每一对select/insert/delete/update标签,其实就是一个MappedStatement,对照MyBatis架构图现在就能理解了架构图上所说的MapperedStatement。
2、仔细观察自定义测试类MyBatisFirst.java,不难发现在执行数据库操作之前,执行几步走:
a、定义MyBatis的全局配置文件SqlMapConfig.xml的全路径。
b、构建输入流
c、构建会话工厂
d、构建会话
e、操作数据库
将以上几步骤结合上面我们画的MyBatis架构图,就很容易理解了。
另外在架构图中还有输入映射、输出映射,其实对应UserMapper.xml文件中每个MappedStatement标签的parameterType、resultType(或者resultMap)属性。
感兴趣的小伙伴可以关注一下博主的公众号,1W+技术人的选择,致力于原创技术干货,包含Redis、RabbitMQ、Kafka、SpringBoot、SpringCloud、ELK等热门技术的学习&资料。