一、开发环境
Idea + maven + mybtis3.4.1
二、简单示例
此示例没有使用spring集成,后续会有spring集成的Demo。mybatis官方文档中,quit start部分非常详细,按照介绍即可快速上手mybatis。
-
首先,看一下项目结构。本示例是再idea下编写,使用默认的maven模板创建。
图片.png
talk is cheap, show me code. OK,下面是此demo的代码部分。
- 第一步:再pom文件中,引入需要的依赖。
没有很特殊的地方,主要引入了mybatis、mysql的驱动,以及用于测试的JUnit。
<dependencies>
<!-- 用到的mybatis依赖 -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.1</version>
</dependency>
<!-- 用户测试使用的依赖 -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-api</artifactId>
<version>RELEASE</version>
</dependency>
<!-- mysql 驱动 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.38</version>
</dependency>
</dependencies>
- 第二步:编写mybatis-config.xml 全局配置文件。
mybatis应用中,有两类关键的配置文件,一个是本部分要介绍的全局配置文件:mybatis-config.xml,一个是sql mapper 映射文件。这个全局文件中包含了mybatis运行时的一些核心设置项,比如事务管理器、数据源配置等等。
<?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 default="mysql">
<environment id="mysql">
<!-- 此处的JDBC、POOL等都是被框架设置别名的 -->
<!-- 之后会交给spring framework管理 -->
<transactionManager type="JDBC"></transactionManager>
<!-- 之后会交给spring framework管理 -->
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"></property>
<property name="url" value="jdbc:mysql://127.0.0.1:3306/test"></property>
<property name="username" value="root"></property>
<property name="password" value="123456"></property>
</dataSource>
</environment>
</environments>
<mappers>
<mapper class="com.hly.dao.EmployeeMapper"></mapper>
</mappers>
</configuration>
- 第三步:定义一个简单的POJO,并在mysql中创建对应的table。
package com.hly.entity;
public class Employee {
private int id;
private String name;
private String gender;
private String email;
// 省略setter、getter、toString等方法
}
在mariadb中创建一张对应此实体的表:tbl_employee.
CREATE TABLE `tbl_employee` (
`id` int(10) NOT NULL AUTO_INCREMENT,
`name` varchar(32) NOT NULL,
`gender` varchar(1) NOT NULL,
`email` varchar(100) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=latin1
- 第四步:编写接口及sql mapper配置文件。
这一步的接口和配置文件是一一对应的。应用层面向接口编程,由框架根据接口和配置文件的对应关系生成代理对象,完成sql封装和执行过程。
package com.hly.dao;
import com.hly.entity.Employee;
public interface EmployeeMapper {
public Employee getEmpById(int id);
}
对应的sql mapper如下:
<?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.hly.dao.EmployeeMapper">
<select id="getEmpById" resultType="com.hly.entity.Employee">
select * from tbl_employee where id = #{id}
</select>
</mapper>
这里只演示了一个查询方法。注意一下几点:
1、xml中,mapper标签的namespace属性,要指定成对应java接口的全限定名称,以此完成绑定。
2、xml中,增删改查操作,均有对应的标签,标签的id对应java接口中的方法名。
3、resultTpye虽然可以指定别名,但建议还是使用类的全限定名称,这样可以提升可读性,使阅读代码的人可以快速知晓返回类型,也可以在ide中快速追踪到此类的内容。
- 第五步: 这一步中,主要展示业务逻辑层面如何使用mybatis。
前几步中已经把mybatis的使用步骤进行了简单的展示,在应用逻辑层使用的时候,只需要根据全局配置文件(mybatis-config)的内容创建SqlSessionFactory,从SqlSessionFactory中拿到SqlSession,再指定要使用的SqlMapper类,即可进行数据库操作。
package com.hly;
import com.hly.dao.EmployeeMapper;
import com.hly.entity.Employee;
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.jupiter.api.Test;
import java.io.IOException;
import java.io.InputStream;
public class MainTest {
public SqlSession getSession() throws IOException {
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
return sqlSessionFactory.openSession();
}
@Test
public void testQuery(){
SqlSession sqlSession = null;
try {
sqlSession = getSession();
EmployeeMapper employeeMapper = sqlSession.getMapper(EmployeeMapper.class);
Employee e = employeeMapper.getEmpById(1);
System.out.println(e);
}catch(Exception e){
e.printStackTrace();
}finally{
sqlSession.close();
}
}
}
代码逻辑较为简单,基本流程就是:加载全局配置文件(mybatis-config)-->创建SQLSessionFactory-->拿到SqlSessionn-->拿到接口实现-->执行数据库操作。
三、结果验证
在数据库中插入一条记录:
图片.png
执行test方法,console打印如下内容,执行成功。
图片.png
四、问题留根
别看是是个小Demo,在编写执行过程中,还是遇到了几个小问题,下面记录一下。
- java接口类和sql mapper XML绑定不成功的问题。
在本例中,EmployeeMapper.java和EmployeeMapp.xml同放在com.hly.dao中,理论上,在全局配置文件中加入
<mappers>
<mapper class="com.hly.dao.EmployeeMapper"></mapper>
</mappers>
应该可以执行成功。但是作者执行测试方法后,抛出了一个方法绑定异常,百度之后发现这时Idea一个特性导致:Idea在进行编译打包时,src下的xml文件不会被编译到类路径中(Eclipse不存在此问题)。解决方式是在pom中增加以下代码段:
<build>
<resources>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.xml</include>
</includes>
</resource>
</resources>
</build>
- MySQL远程访问密码问题。
平时都是直接用已经部署好的mysql环境,mysql -h -P -u -p等等,作者在阿里云的centos7上安装了mariadb后,发现不用用户名和密码就可以登录。百度后发现,需要在mysql库中的user表中,将user=''的用户删掉,并且设置root的密码,即可在本地要求使用用户名密码登录,此时,注意仅仅是在本地成功。
执行本例的代码时,提示登录被远程服务器拒绝,阿里云的端口策略是开放了的,此时又百度,发现需要给mysql库user表中的root用户的host字段设置空值(此步骤可能会报错,可忽略),之后刷一下权限表flush privileges,这样,远程即可登录访问。
网友评论