概述
Mybatis是一款优秀的、基于SQL的持久层框架,封装JDBC代码,实现将参数映射到SQL语句并执行,最后将执行结果映射到JAVA对象并返回的功能,支持自定义SQL、存储过程和高级映射。
本系列文章是基于Mybatis 3.4.6 版本。
创建项目
我们使用maven来构建和管理项目,使用的IDEA开发工具来学习,这些都是目前很优秀的并且使用广泛的工具,流畅的开发体验便于提高开发效率,按如下步骤进行:
- 在IDEA中点击【file】-->【New】-->【Project...】,打开New Project窗口向导,如下图:
- 选择Maven并勾选Create from archetype,最后选择maven-archetype-quickstart,点击【Next】,如下图:
- GroupId、ActifactId和Version是项目的maven坐标,作用就是便于在maven仓库中查找项目以供其他项目使用。命名无要求,但应该有意义。点击【Next】,如下图:
- 以上界面是对新建项目的描述信息,点击【Next】,如下图:
- 注意此界面的Project Name,此处默认是上个界面定义的去掉'-'的ActifactId,此处可以加上'-',最终如下图:
点击【Finish】,最终的项目结构如下:
打开pom文件,添加相关依赖,代码如下:
<!-- mybatis依赖 -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.6</version>
</dependency>
<!-- mysql驱动 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.38</version>
</dependency>
<!-- junit依赖 -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
<!-- log4j2依赖 -->
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-api</artifactId>
<version>2.11.0</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>2.11.0</version>
</dependency>
至此,项目已经创建完成,下一步开始编码。
编码实现
在开始编码之前,需要先创建测试使用的表,mybatis本身是ORM框架,所以数据库肯定少不了,我们使用的是mysql数据库,可以使用一个已有数据库或者新建一个新库,在此基础上新建表,如下:
CREATE TABLE `sys_user` (
`id` bigint(11) NOT NULL AUTO_INCREMENT COMMENT '主键',
`username` varchar(50) DEFAULT NULL COMMENT '用户名',
`password` varchar(50) DEFAULT NULL COMMENT '用户密码',
`phone` varchar(20) DEFAULT NULL COMMENT '手机号',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='用户表';
创建完数据库表后,我们插入一些测试数据,如下:
insert into sys_user(username,password,phone)
values ('zhangsan','123456','13901234567'),
('lishi','123456','13901234567'),
('wangwu','123456','13901234567');
准备好数据库表和测试数据后,开始编写代码。
- 创建实体和映射文件
Mybatis是ORM映射框架,所以我们需要对应创建java类,与数据库表进行映射。
在src/main/java下创建包:com.github.dalianghe.model,并在该包下创建数据库sys_user表的映射类SysUser,代码如下:
package com.github.daliang.model;
public class SysUser{
private Long id;
private String username;
private String password;
private String phone;
// get/set
// 重写toString
@Override
public String toString() {
return "User["+
"id="+this.getId()+"," +
"username="+this.getUsername()+
",password="+this.getPassword()+
",phone="+this.getPhone()
+"]";
}
}
在src/mainresources下创建mappers目录,并在其下创建SysUserMapper.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 namespace="com.github.dalianghe.mapper.SysUserMapper">
<select id="selectAll" resultType="SysUser">
select id,username,password,phone from sys_user
</select>
</mapper>
说明:
< mapper>:XML根元素,属性namespace定义了当前XML命名空间
< select>标签:定义select查询sql,id属性定义当前select查询的唯一ID,resultType定义查询返回类型或集合元素类型(此处使用了配置别名,详细见Mybatis配置文件,如果不使用别名,此处应该制定类的全限定名即:com.github.dalianghe.model.SysUser)。标签内容为要执行的sql语句。
- Mybatis配置文件
配置Mybatis有多种方法,本例使用XML方式进行配置,在classpass(src/main/resource)下创建mybatis-config.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>
<settings>
<!-- logImpl属性配置指定使用LOG4J输出日志 -->
<setting name="logImpl" value="LOG4J2" />
</settings>
<!-- 别名配置,如果未配置在Mapper文件中使用是,需要使用类的全限类名 -->
<typeAliases>
<package name="com.github.dalianghe.model"/>
</typeAliases>
<!-- 配置环境,主要配置了数据库连接 -->
<environments default="development">
<environment id="development">
<transactionManager type="JDBC">
<property name="" value=""/>
</transactionManager>
<dataSource type="UNPOOLED">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/mybatis"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
</dataSource>
</environment>
</environments>
<!-- 配置Mapper -->
<mappers>
<mapper resource="mappers/SysUserMapper.xml"/>
</mappers>
</configuration>
- 配置日志
本例使用log4j2框架进行日志输出(所依赖的jar包已经在pom文件中进行了配置),便于我们观察Mybatis行为,在classpath下新建log4j2.xml文件,并进行配置,代码如下:
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN">
<Appenders>
<Console name="Console" target="SYSTEM_OUT">
<PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
</Console>
</Appenders>
<Loggers>
<Root level="trace">
<AppenderRef ref="Console"/>
</Root>
</Loggers>
</Configuration>
- 编写测试
以上代码编写完成,现在使用Juint编写测试用例,代码如下:
public class SysUserMapperTest {
private static SqlSessionFactory sqlSessionFactory ;
@BeforeClass
public static void init(){
try{
//通过Resources工具类将mybatis配置文件读入Reader
Reader reader = Resources.getResourceAsReader("mybatis-config.xml");
//通过SqlSessionFactoryBuilder构造类使用reader创建SqlSessionFactory对象
//在创建SqlSessionFactory对象过程中,首先解析mybatis-config.xml配置文件,并读取mappers标签配置的Mapper.xml进行解析。
//解析之后,SqlSessionFactory包括了所有属性和要执行的SQL
sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);
reader.close();
}catch (IOException e){
e.printStackTrace();
}
}
@Test
public void testSelectAll(){
//获取SqlSession
SqlSession sqlSession = sqlSessionFactory.openSession();
try{
//通过sqlSession的selectList方法查找到id为selectAll的方法执行sql
//执行完后,mybatis将结果集映射为returnType类型并返回
List<SysUser> userList = sqlSession.selectList("selectAll");
printUserList(userList);
}finally {
//关闭资源
sqlSession.close();
}
}
private void printUserList(List<SysUser> users){
for(SysUser user : users){
System.out.println(user.toString());
}
}
}
运行测试方法testSelectAll,如无问题将打印如下内容:
... ...
11:11:47.042 [main] DEBUG com.github.dalianghe.mapper.SysUserMapper.selectAll - ==> Preparing: select id,username,password,phone from sys_user
11:11:47.109 [main] DEBUG com.github.dalianghe.mapper.SysUserMapper.selectAll - ==> Parameters:
11:11:47.130 [main] TRACE com.github.dalianghe.mapper.SysUserMapper.selectAll - <== Columns: id, username, password, phone
11:11:47.130 [main] TRACE com.github.dalianghe.mapper.SysUserMapper.selectAll - <== Row: 1, zhangsan, 123456, 13901234567
11:11:47.133 [main] TRACE com.github.dalianghe.mapper.SysUserMapper.selectAll - <== Row: 2, lishi, 123456, 13901234567
11:11:47.133 [main] TRACE com.github.dalianghe.mapper.SysUserMapper.selectAll - <== Row: 3, wangwu, 123456, 13901234567
11:11:47.133 [main] DEBUG com.github.dalianghe.mapper.SysUserMapper.selectAll - <== Total: 3
User[id=1,username=zhangsan,password=123456,phone=13901234567]
User[id=2,username=lishi,password=123456,phone=13901234567]
User[id=3,username=wangwu,password=123456,phone=13901234567]
... ...
总结
本节是第一篇关于mybatis的学习,我们体验了下mybatis的查询功能,后续继续学习更多更强大的功能,自己努力、大家努力。
最后创建了qq群方便大家交流,可扫描加入,同时也可加我qq:276420284,共同学习、共同进步,谢谢!
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。