第一个mybatis——helloWorld
1、首先创建一张表,表结构、字段类型如下所示:
2、在intellij idea或eclipse中创建一个实体类Employee
3、配置mybatis的配置文件,文件名称形如:mybaits-yy.xml。具体格式如下所示:
<?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///mybatis"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="org/mybatis/example/BlogMapper.xml"/>
</mappers>
</configuration>
4、通过XML配置文件,创建一个SqlSessionFactory对象。
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
5、从SqlSessionFactory对象中获取一个SqlSession实例。SqlSession实例,能直接执行已经映射的SQL语句。(注意此步存放xml文件的文件夹要设置为resource类型,才可以找到该文件资源)。
- 获取SqlSession实例
/*2、获取sqlSession实例,能直接执行已经映射的SQL语句*/
SqlSession session = sqlSessionFactory.openSession();
- 何为已经映射的SQL语句。创建映射xml文件
<?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.lonely.myBatis.EmployeeMapper">
<!-- namespace:名称空间 -->
<select id="selectEmp" resultType="com.lonely.myBatis.Employee">
<!--
id唯一标识,作为映射标识
resultType返回值类型,封装成什么对象
#{id}:从传递过来的参数中取出id值
-->
select * from tbl_employee where id = #{id}
</select>
</mapper>
- 通过SqlSession实例,进行查询操作,其中sql标识符建议是namespace+id值。
// sql的唯一标识,对应mapper的xml中的namespace+id值。
// 执行sql要用的参数
Employee employee = session.selectOne("com.lonely.myBatis.EmployeeMapper.selectEmp", 1);
System.out.println(employee);
6、执行结果
发现lastName字段没有值,解决办法,将数据库字段与JavaBean成员名称不对应的,起一个别名。
MyBatis接口式编程
为什么要使用接口式编程?
因为在老版本的写法中,通过session.selectOne("com.lonely.myBatis.EmployeeMapper.selectEmp", 1);固然可以得到相应的对象,但是在第二个参数为Object类型。用户无法保证时时刻刻的正确性,如果所传递的参数与数据库表中类型不同,那么肯定是查询不到结果的。所以使用接口式编程,固定所传递阐述的类型。
1 创建相应的接口
public interface EmployeeMapper {
Employee getEmpById(Integer id);
}
2 MyBatis使用接口与配置文件进行动态绑定。
<mapper namespace="com.lonely.myBatis.dao.EmployeeMapper">
<!-- namespace:名称空间:动态绑定则指定为接口的全类名 -->
<select id="getEmpById" resultType="com.lonely.myBatis.model.Employee">
<!--
id唯一标识,与接口中的方法名称相同,实现绑定的功能
resultType返回值类型,封装成什么对象
#{id}:从传递过来的参数中取出id值
-->
select id, last_name AS lastName, email, gender from tbl_employee where id = #{id}
</select>
</mapper>
3 测试
public void testOne() throws IOException {
// 1 获取sqlSessionFactory
SqlSessionFactory sqlSessionFactory = getSqlSessionFactory();
// 2 获取SQLSession
SqlSession sqlSession = sqlSessionFactory.openSession();
try {
// 3 获取接口的实现类对象
EmployeeMapper mapper = sqlSession.getMapper(EmployeeMapper.class);
System.out.println(mapper.getClass());
// mybatis会为接口自动生成一个代理对象,利用代理对象去执行增删改查操作。
Employee employee = mapper.getEmpById(1);
System.out.println(employee);
} finally {
sqlSession.close();
}
}
4 测试结果
小结:
1 接口式编程
- 原生: Dao接口 => Dao接口的实现
- mybatis Mapper接口 =》 xxxMapper.xml与之对应
2 SqlSession代表和数据库的一次会话,用完必须关闭
3 SqlSession和connection一样,都是非线程安全的,每次使用都应该去获取新的对象。
4 mapper接口没有实现类,但是mybatis会为这个接口生成一个代理对象(将接口和xml文件进行绑定)
- sqlSession.getMapper(EmployeeMapper.xml);
5 有两个重要的配置文件
- mybatis的全局配置文件:包含数据库连接池的信息,事务管理信息等系统运行环境信息
- sql映射文件,保存了每一个sql语句的映射信息。将sql抽取出来