一. mybatis核心组件
- SqlSessionFactoryBuilder:(构造器)根据配置信息或代码生成SqlSessionFactory(工厂接口);
- SqlSessionFactory:依靠工厂生成SqlSession回话;
- SqlSession:一个可以发送SQL去执行并返回结果,也可以起获取Mapper接口;
- SQL Mapper:有java接口和xml文件或(注解)构成的,需要sql对应的映射规则,负责发送sql去执行,并返回结果。
SqlSessionFactory:
每个mybatis都是以SqlSessionFactory的实例为中心,其实例可以通过SqlSessionFactoryBuilder获得,SqlSessionFactory是一个工厂接口而不是现实类,他的任务是创建SqlSession。
/**
* xml 生成SqlSessionFactory
*/
@Test
public void getSqlSessionFactoryTest() {
String resources = "mybatis-config.xml";
try {
InputStream inputStream = Resources.getResourceAsStream(resources);
SqlSessionFactory sqlSessionFactory = null;
sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
assertNotNull(sqlSessionFactory);
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* 通过java获取SqlSessionFactory
*
*/
@Test
public void configurationGetSqlSessionFactoryTest() {
PooledDataSource pooledDataSource = new PooledDataSource();
pooledDataSource.setDriver("com.mysql.jdbc.Driver");
pooledDataSource.setUrl("jdbc:mysql://localhost:3306/mybatis");
pooledDataSource.setUsername("root");
pooledDataSource.setPassword("admin");
TransactionFactory transactionFactory = new JdbcTransactionFactory();
Environment environment = new Environment("development", transactionFactory, pooledDataSource);
Configuration configuration = new Configuration(environment);
configuration.getTypeAliasRegistry().registerAlias("country",Country.class);
// configuration.addMapper();
SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(configuration);
assertNotNull(sessionFactory);
}
SqlSession:
sqlSession是个接口,中来接受信息和返回结果;有两个实现类,DefaultSqlSession 和SqlSessionManager;
/**
* SqlSession创建
*/
@Test
public void testGetSqlSession() {
try {
sqlSession = sqlSessionFactory.openSession();
assertNotNull(sqlSession);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
if(sqlSession!=null) {
sqlSession.close();
}
}
}
SqlSession的主要用途有两种:
1.获取映射器,让映射器通过命名空间和方法名找到对应的sql,发送给数据库后返回结果;
2.直接通过命名信息去执行sql,返回结果,这是ibatis遗留的。sqlSession可以通过select,delete,update,insert带上SQL的id来执行XML配置好的sql,同时,他也会完成commit,rollback等事务。
映射器:
映射器是由java接口和xml(或者注解)共同组成的。作用是:
- 定义参数类型,
- 描述缓存,
- 描述SQL语句,
- 定义查询结果和POJO的映射关系。
映射器的实现有两种方式:
- 通过xml配置实现,
- 通过代码实现,在Configuration注册Mapper接口或者注解实现。
Xml配置实现Mapper
第一步:定义一个java接口;
第二步:定义xml配置文件。
public interface ContryMapper {
public Country getCountryById(Long id);
}
<?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="simple.mapper.CountryMapper">
<select id="getCountryById" resultType="Country" parameterType="long">
select id,countryname,countrycode from country where id = #{id}
</select>
</mapper>
- 1.这个文件我们在mybatis-config.xml中配置的,在加载的时候或扫描这个文件,生成映射器;
- 2.定义了命名空间(namespace),和我们的全限接口名是一样的;
- 3.用select定义了一个查询。
使用sqlSession获取mapper:
ContryMapper contryMapper = sqlSession.getMapper(ContryMapper.class);
Country c = contryMapper.getCountryById((long) 1);
使用注解实现mapper:
只需在接口使用注解,注入sql即可。
@Select("select * from country where id = #{id}")
public Country getCountryById(Long id);
//加载在configuration
configuration.addMapper(ContryMapper2.class);
其他:ibatis通过sql id ,通过全路径名来执行sql,例如sqlSession.selectOne("xxxxx","id")来获取值,不推荐。