MyBatis实战
光看不练容易迷糊,先写个实例试试,在回去读文档,或许体会会多一些。
1、实例准备
jar包:
mybatis-3.4.5.jar(mybatis)
mysql-connector-java-5.1.21.jar(数据库驱动)
junit-4.4.jar(测试,不想用这个junit,用main方法测试也行)
项目结构
数据库
-- 用户表结构
CREATE TABLE `user` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`userName` varchar(20) DEFAULT NULL,
`age` int(3) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=latin1;
-- 初始化数据
INSERT INTO user (id,userName,age) VALUES(1,'one',25);
INSERT INTO user (id,userName,age) VALUES(2,'two',25);
INSERT INTO user (id,userName,age) VALUES(3,'three',25);
代码实例
UserMapper对应的接口:
package com.lanhuigu.mybatis.mapper;
import com.lanhuigu.mybatis.entity.User;
/**
* Mapper接口
* @author yihonglei
* @date 2018/11/20 19:00
*/
public interface UserMapper {
/**
* xml实现方式
* @author yihonglei
* @date 2018/11/20 19:00
*/
User queryUserById(int id);
}
MyBatisInterfaceTest(基于接口实现的测试代码)
package com.lanhuigu.mybatis;
import com.lanhuigu.mybatis.entity.User;
import com.lanhuigu.mybatis.mapper.UserMapper;
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.Test;
import java.io.IOException;
import java.io.InputStream;
/**
* Mapper基于接口测试
* @author yihonglei
* @date 2018/11/20 17:43
*/
public class MyBatisInterfaceTest {
@Test
public void testMyBatis() throws IOException {
// 从SqlSessionFactoryBuilder中获取的SqlSessionFactory工厂实例
SqlSessionFactory sqlSessionFactory = null;
// 从SqlSessionFactory工厂中获取的sqlSession实例,包括了MyBatis操作数据库SQL命令的所有方法
SqlSession session = null;
try {
// 1、MyBatis的配置文件路径,这里放在classpath下,相当于src下
String resource = "mybatis-config.xml";
// 2、读取mybatis配置文件,同时构建SqlSessionFactoryBuilder,然后获取SqlSessionFactory工厂实例
// 使用MyBatis提供的Resources类加载mybatis的配置文件
InputStream is = Resources.getResourceAsStream(resource);
//构建SqlSessionFactory工厂
sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);
// 3、从SqlSessionFactory工厂实例获取sqlSession,sqlSession中包含执行sql命令的所有方法
session = sqlSessionFactory.openSession();
/**
* 映射sql的标识字符串:
* com.lanhuigu.mybatis.mapper.UserMapper是UserMapper.xml文件中mapper标签的namespace属性的值,
* queryUserById是UserMapper.xml文件select标签的id属性值,通过select标签的id属性值,
* 通过这两个的组合就可以找到要执行的SQL
*/
// 执行查询返回一个唯一user对象的sql,注意:"com.lanhuigu.mybatis.mapper.UserMapper.queryUserById"为映射sql的标识字符串
UserMapper userMapper = session.getMapper(UserMapper.class);
User user = userMapper.queryUserById(1);
System.out.println(user);
} catch (Exception e) {
System.out.println("e:" + e);
} finally {
session.close();
}
}
}
代码分析:
UserMapper userMapper = session.getMapper(UserMapper.class);
User user = userMapper.queryUserById(1);
使用对于给定语句能够合理描述参数和返回值的接口(比如说UserMapper.class),
现在不但可以执行更清晰和类型安全的代码,而且还不用担心易错的字符串字面值以及强制类型转换。