创建java项目
目录结构如下:
- 需要新建
- config(资源目录):存放配置文件
- lib:项目需要用到的jar包
- test(测试目录):存放测试文件
导入jar包
需要用到mybatis以及数据库驱动的jar包
导入log4j.properties文件,mybatis默认使用log4j作为输出日志信息。
导入之后要添加到项目的依赖中
编写配置文件
首先是数据库的配置文件,包含数据库驱动、链接地址以及账号密码等信息。
数据库配置文件:db.properties
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/demo?characterEncoding=utf-8
jdbc.username=root
jdbc.password=root
mybatis核心配置文件,包括数据源以及事务管理。目前事务是交给JDBC进行管理。
mybatis配置文件: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>
<!-- 引入数据库配置信息 -->
<properties resource="db.properties" />
<!-- 环境 -->
<environments default="demo">
<environment id="demo">
<!-- 事务交给JDBC管理 -->
<transactionManager type="JDBC" />
<!-- 数据库连接池 -->
<dataSource type="POOLED">
<property name="driver" value="${jdbc.driver}" />
<property name="url" value="${jdbc.url}" />
<property name="username" value="${jdbc.username}" />
<property name="password" value="${jdbc.password}" />
</dataSource>
</environment>
</environments>
<mappers>
<!-- 扫描包下的所有映射 xml -->
<package name="com.xia.dao"/>
</mappers>
</configuration>
创建实体对象
创建Account实体对象,设置get/set方法、重写toString方法。实体对象的属性名要和数据中的字段名一致。
创建dao层
创建dao层,写了一个接口类AccountDao,用来操作数据库的增删改查。
SQL映射文件
使用xml的方式,在dao层的文件夹下创建sql映射文件:AccountDao.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.xia.dao.AccountDao">
<!-- id:要与接口中的方法名一致 resultType: 结果类型 单条结果 全路径 -->
<select id="findAll" resultType="com.xia.entity.Account">
select * from account
</select>
</mapper>
parameterType和resultType
- parameterType:指定输入参数类型,mybatis通过ognl表达式从输入对象中获取参数值拼接在sql中。
- resultType:指定输出结果类型,mybatis将sql查询结果的一行记录数据映射为resultType指定类型的对象。
selectOne和selectList
-
selectOne查询一条记录,如果使用selectOne查询多条记录则抛出异常:
org.apache.ibatis.exceptions.TooManyResultsException: Expected one result (or null) to be returned by selectOne(), but found: 3 at
-
selectList可以查询一条或多条记录。
注意:
- sql映射文件名需要和接口类的文件名一直,并且在同一目录下。这是为了使用动态代理。
Mapper动态代理方式开发Dao
开发规范
Mapper动态代理方式开发方法只需要程序员编写Mapper接口(相当于Dao接口),由Mybatis框架根据接口定义创建接口的动态代理对象,代理对象的方法体同上边Dao接口实现类方法。
Mapper接口开发需要遵循以下规范:
1、Mapper.xml文件中的namespace与mapper接口的路径相同。
2、Mapper接口方法名和Mapper.xml中定义的每个statement的id相同
3、Mapper接口方法的输入参数类型和mapper.xml中定义的每个sql 的parameterType的类型相同
4、Mapper接口方法的输出参数类型和mapper.xml中定义的每个sql的resultType的类型相同
注册指定包下的所有mapper接口,这样可以免去要一个个的加载mapper文件的繁琐。
编写测试代码
测试代码:MybatisTest
package test;
import com.xia.dao.AccountDao;
import com.xia.entity.Account;
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.Before;
import org.junit.Test;
import java.io.IOException;
import java.io.Reader;
import java.util.List;
public class MybatisTest {
private SqlSessionFactory factory = null;
@Before
public void createFactory() {
try {
// 加载mybatis 核心配置文件
Reader reader = Resources.getResourceAsReader("sqlMapConfig.xml");
// 创建一个SessionFactory
factory = new SqlSessionFactoryBuilder().build(reader);
} catch (IOException e) {
e.printStackTrace();
}
}
@Test
public void findAll() {
SqlSession session = factory.openSession();
// 获取接口代理的对象
AccountDao dao = session.getMapper(AccountDao.class);
List<Account> all = dao.findAll();
System.out.println(all);
}
}
运行测试程序,控制台打印输出查询到的所有Account信息。
到此,一个简单的mybatis测试使用就完成了。