MyBatis入门
SqlSessionFactory
SqlSessionFactory是Mybatis的核心,SqlSessionFactory的实例可以通过SqlSessionFactoryBuilder获得,而SqlSessionFactoryBuilder会从XML配置文件或Configuration实例中获取配置信息来构建SqlSessionFactory实例。有了SqlSessionFactory就可以获取SqlSession用来执行执行在Mapper.xml中定义好的方法了。下面有一个简单的连接MySQL数据库并查询数据的demo。
工程结构
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| main ├─java │ └─cn │ └─gmfan │ │ Main.java │ │ │ └─domain │ SysUser.java │ └─resources │ mybatis-config.xml │ └─mapper SysUserMapper.xml
|
maven依赖
1 2 3 4 5 6 7 8 9 10 11 12
| <dependencies> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.5.9</version> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.48</version> </dependency> </dependencies>
|
SysUser.java
1 2 3 4 5 6 7
| public class SysUser {
private String user_name; private String nick_Name;
}
|
SysUserMapp.xml
1 2 3 4 5 6 7 8 9 10 11 12 13
| <?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="cn.gmfan.mapper.SysUserMapper">
<select id="selectAllSysUser" resultType="cn.gmfan.domain.SysUser"> select user_name,nick_name from sys_user </select>
</mapper>
|
mybatis-config.xml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
| <?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="development"> <environment id="development"> <transactionManager type="JDBC" /> <dataSource type="POOLED"> <property name="driver" value="com.mysql.jdbc.Driver" /> <property name="url" value="jdbc:mysql://localhost:3306/database-name?characterEncoding=utf8" /> <property name="username" value="username" /> <property name="password" value="password" /> </dataSource> </environment> </environments> <mappers> <mapper resource="mapper/SysUserMapper.xml" /> </mappers> </configuration>
|
Main.java
1 2 3 4 5 6 7 8 9 10 11 12
| public class Main { public static void main(String[] args) throws IOException { InputStream config = Resources.getResourceAsStream("mybatis-config.xml"); SqlSessionFactory ssf = new SqlSessionFactoryBuilder().build(config); SqlSession ss = ssf.openSession(); List<SysUser> users = ss.selectList("cn.gmfan.mapper.SysUserMapper.selectAllSysUser"); for (SysUser user : users) { System.out.println(user); } } }
|
映射SQL语句
MyBatis提供XML与注解映射,简单的映射语句使用注解来映射会使代码更加简介,但对于稍微复杂的SQL语句来说Java注解就没有使用XML映射来得优雅。
作用域和生命周期
依赖注入框架可以创建线程安全的、基于事务的SqlSession和映射器,因此可以直接忽略它们的生命周期。
SqlSessionFactoryBuilder
这个类可以被实例化、使用和丢弃,一旦创建了 SqlSessionFactory,就不再需要它了。 因此 SqlSessionFactoryBuilder 实例的最佳作用域是方法作用域(也就是局部方法变量)。最好不要一直保留它,以保证所有的XML解析资源可以被释放给更重要的事情。
SqlSessionFactory
SqlSessionFactory 一旦被创建就应该在应用的运行期间一直存在,没有任何理由丢弃它或重新创建另一个实例。因此 SqlSessionFactory 的最佳作用域是应用作用域。 有很多方法可以做到,最简单的就是使用单例模式或者静态单例模式。
SqlSession
每个线程都应该有它自己的 SqlSession 实例。SqlSession 的实例不是线程安全的,因此是不能被共享的,所以它的最佳的作用域是请求或方法作用域。 绝对不能将 SqlSession 实例的引用放在一个类的静态域,甚至一个类的实例变量也不行。 也绝不能将 SqlSession 实例的引用放在任何类型的托管作用域中,比如 Servlet 框架中的 HttpSession。 且SqlSession应该确保使用完后被关闭以释放资源
1 2 3
| try (SqlSession session = sqlSessionFactory.openSession()) { }
|
映射器实例
映射器是一些绑定映射语句的接口。映射器接口的实例是从 SqlSession 中获得的。虽然从技术层面上来讲,任何映射器实例的最大作用域与请求它们的 SqlSession 相同。但方法作用域才是映射器实例的最合适的作用域。