本文已参与「新人创作礼」活动,一起开启掘金创作之路。 @TOC
Mybatis是什么?
mybatis是一个ORM(object relation mapping)框架。
对比手写JDBC和使用Mybatis
手写JDBC
Class.forName("com.mysql.cj.jdbc.Driver");
Connection connection = null;
Statement statement = null;
ResultSet resultSet = null;
List<UserInfo> res = null;
try {
connection = DriverManager.getConnection("url","username","password");
statement = connection.createStatement();
resultSet = statement.executeQuery("sql");
res = new ArrayList<>();
while (resultSet.next()){
UserInfo userInfo = new UserInfo();
userInfo.setId(resultSet.getInt(1));
userInfo.setUsername(resultSet.getString("2"));
res.add(userInfo);
}
} catch (SQLException e) {
e.printStackTrace();
}finally {
if(resultSet!=null){
try {
resultSet.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(statement!=null){
try {
statement.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(connection!=null){
try {
connection.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
使用Mybatis(方式很多,这里以非xml方式为例)
DataSource dataSource = new PooledDataSource("com.mysql.cj.jdbc.Driver"
,"url"
,"username"
,"password");
TransactionFactory transactionFactory = new JdbcTransactionFactory();
Environment environment = new Environment("develoment",transactionFactory,dataSource);
Configuration configuration = new Configuration(environment);
configuration.addMapper(UserMapper.class);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(configuration);
SqlSession session = sqlSessionFactory.openSession();
UserMapper mapper = session.getMapper(UserMapper.class);
List<UserInfo> userInfoList = mapper.selectUserList(1,"lwl");
可以看到,用mybatis之后确实更加方便,并且不用写一大堆try cath和记得使用后要关闭连接。
开始研究
从上面的代码可以看到,抛开数据源等设置,mybatis需要先定义mapper接口,然后把放到configuration中,然后在需要使用的时候直接通过session去渠道mapper的实例,执行即可得到结果。那一系列过程中mybati做了什么呢?mybatis如何获取到sql,如何将参数注入,又如何将数据库返回的结果映射成我们需要的对象? 下面这张图是我根据上面的代码结合源码画的一个大致流程图。 对于数据源配置,事务工厂什么的配置环节比较简单,只是做了一些初始化操作,这里调重点讲:mapper的注册、Mapper的实例化、方法的执行和结果集映射。