MyBatis的基本使用
使用步骤:
-
第一步,添加所需jar包,mybatis-3.5.7.jar
-
第二步,配置文件,(具体配置后面说明) XML 配置文件包含对 MyBatis 系统的核心设置,包含获取数据库连接实例的数据源和决定事务范围和控制的事务管理器。
-
第三步,映射文件(具体配置后面说明)
CRUD操作,配置了每一个sql,以及sql的封装规则等。
-
第四步,调用过程
1、从xml配置文件中构建SqlSessionFactory
InputStream stream = Resources.getResourceAsStream("mybatis-config.xml");
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(stream);
2、从 SqlSessionFactory 中获取 SqlSession
SqlSession session = sqlSessionFactory.openSession();
session.selectOne("namespace.id",param);
session.close();
现在有更方便的方法,执行SQL语句
InterfaceDao dao = session.getMapper(InterfaceDao.class);
dao.method();
配置文件:
<?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文件中的值-->
<properties resource="jdbc.properties"></properties>
<!-- 开启驼峰命名法-->
<settings>
<setting name="mapUnderscoreToCamelCase" value="true"/>
</settings>
<!-- 给类名起别名-->
<typeAliases>
<typeAlias type="com.liujiawei.bean.GoodsType" alias="goodsType"></typeAlias>
</typeAliases>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="${driver}"/>
<property name="url" value="${url}"/>
<property name="username" value="${user}"/>
<property name="password" value="${pwd}"/>
</dataSource>
</environment>
</environments>
<mappers>
<!-- <mapper resource="com/liujiawei/dao/GoodsTypeDao.xml"></mapper>-->
<package name="com.liujiawei.dao"/>
</mappers>
</configuration>
映射文件:
mapper标签中namespace的值,指定为接口的全类名
<?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.liujiawei.dao.GoodsDao">
下来我们做一个简单的测试:
根据typeId查询所有商品
-
dao中的方法:
public interface GoodsDao { //根据typeId获取所有商品 public List<Goods> selectAllByTypeId(int typeId); } ```
-
方法的映射:
<select id="selectAllByTypeId" resultType="com.liujiawei.bean.Goods"> select * from goods where type_id = #{id} </select>
-
测试:
public class GoodsTest {
SqlSession session;
GoodsDao goodsDao;
@Before
public void beforeMethod(){
try {
InputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml");
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(inputStream);
session = factory.openSession();
goodsDao = session.getMapper(GoodsDao.class);
} catch (IOException e) {
e.printStackTrace();
}
}
@After
public void afterMethod(){
session.close();
}
@Test
public void selectAllByTypeId(){
List<Goods> list = goodsDao.selectAllByTypeId(4);
for (Goods goods:list) {
System.out.println(goods.getGoodId()+"\t"+goods.getGoodName()+"\t"+goods.getTypeId());
}
}
小结
- 接口式编程
原生:Dao ===> DaoImpl
mybatis: Dao映射 ===> xxx.xml - SqlSession代表和数据库的一次会话,用完必须关闭;
- SqlSession和connection一样都是非线程安全。每次使用都应该去获取新的对象。不能定义为成员变量
- mapper接口没有实现类,但是mybatis会为这个接口生成一个代理对象。(将接口和xml进行绑定)getMapper()这个方法
- 配置文件中,不会对每个一映射文件做映射,通常使用package标签映射到某个包下
- 接口中的方法名必须是xml文件中的每个statement的id
- 事务是手动提交的,session.commit();或者factory.openSession(true);
两个重要的配置文件:
- mybatis的全局配置文件:包含数据库连接池信息,事务管理器信息等…系统运行环境信息
- sql映射文件:保存了每一个sql语句的映射信息,将sql抽取出来。
注意:约定大于配置
在实际开发中,会有dao接口。使用mybatis,不用创建实现类,而是每个接口对应xml文件
1、接口与xml放在同一包下,且名字必须相同
2、映射文件中的namespace的值必须和接口的完全限定名保持一致
3、定义的映射文件中的每个statement的id值必须和接口中的方法名保持一致