MyBatis是一个基于Java的持久层ORM关系映射框架,是一种支持定制化 SQL、存储过程以及高级映射的优秀的持久层框架。它避免了几乎所有的 JDBC 代码和手工设置参数以及抽取结果集。
MyBatis 使用简单的 XML 或注解来配置和映射基本体,将接口和 Java 的 POJOs(Plain Old Java Objects,普通的 Java对象)映射成数据库中的记录。
MyBatis原理
1.MyBatis应用程序Configuration对象根据XML配置文件或注解创建SqlSessionFactory工厂,获取一个SqlSession,加载SQL配置信息,生成一个个MappedStatement对象(包括传入参数映射配置、执行的sql语句、结果映射配置),并存储在内存中。
2.SQL解析,SqlSession包含了执行sql所需要的所有方法,可以通过SqlSession实例直接运行映射的sql语句
3.SQL执行,完成对数据的增删改查,得到数据库操作结果
4.结果映射将操作结果按照映射配置进行转换,转换成HashMap、JavaBean等
5.事务提交,用完之后关闭SqlSession,返回结果。
MyBatis应用
1.引入环境
mybatis-3.4.1.jar
mysql.connector-java-5.1.35-bin.jar
2. 设置主配置文件
a.设置别名 (两种方法二选一)
<typeAliases>
// 设置某一实体类的别名
<typeAlias type="com.motianjie.entity.Dept" alias="Dept"/>
// 设置某个包中的类都支持别名,该包下的类
<package name="com.motianjie.entity"/>
</typeAliases>
b.设置数据库数据源环境 可以多个(default表示默认使用的是哪个环境)
<environments default="mysqlEnvironment"> // id: 设置当前环境的身份id <environment id="mysqlEnvironment"> //transactionManager: 设置事务管理器 type:设置用哪个事务管理器 JDBC是使用默认的事务管理自动提交 <transactionManager type="JDBC"></transactionManager> // 数据源配置 //type:设置数据源类型 POOLED表示使用连接池策略 <dataSource type="POOLED"> <property name="driver" value="com.mysql.jdbc.Driver"/> <property name="url" value="jdbc:mysql://localhost:3306/utf8?useUnicode=true&characterEncoding=utf-8"/> <property name="username" value="root"/> <property name="password" value="123123"/> </dataSource> </environment> </environments>
c.配置映射配置文件
<mappers> //resource: 当前服务器下的文件路径 <mapper resource="com/motianjie/dao/deptMapper.xml"/> </mappers>
3.配置dao层的映射配置文件(deptMapper.xml)
1.提供了sql映射配置信息,通过该配置来实现数据库表和实体类之间的映射关系
2.mapper 是整个sql映射配置文件的根元素
3.namespace: 设置命名空间 与当前项目的模块中的dao接口全限定名对应
<mapper namespace="com.chinasofti.etc.dao.DeptMapper">
//根据id查询部门信息
//select 设置查询的SQL id:该sql的标记,是一个唯一标识
//sql 文件是直接写在当前映射文件中的
//resultType 返回值类型 需要填写全限定名或者是别名
//parameterType 参数类型,个数唯一 可以是全限定名,也可以是mybatis提供的简写类型
//#{deptno} 是mybatis的表达式 #{}是占位符 deptno是传入的参数,单一个参数,mybatis会自动传递过来赋值
<select id="findDept" resultType="com.chinasofti.etc.entity.Dept" parameterType="java.lang.Integer">
select deptno,dname,loc from dept where deptno = #{deptno}
</select>
//insert 用于插入sql操作
//当执行该sql,mybatis会根据从当前传入的对象
<insert id="saveDept" parameterType="Dept">
insert into dept values(#{deptno},#{dname},#{loc})
</insert>
<update id="updateDept" parameterType="Dept">
update Dept set dname = #{dname} where deptno = #{deptno}
</update>
<delete id="deleteDept" parameterType="integer">
delete from dept where deptno = #{deptno}
</delete>
<select id="findAll" resultType="Dept">
select deptno,dname,loc from dept
</select>
// 查询一张表中的部分字段信息 或多表查询 通过返回map来实现
<select id="findMap" resultType="java.util.HashMap">
select dname,loc from dept
</select>
</mapper>
4.工具类
private static SqlSessionFactory sqlSessionFactory; static{ try { //通过mybatis的api读取主配置文件 Reader reader = Resources.getResourceAsReader("mybatis-config.xml"); //创建造 SqlSessionFactory 工厂的对象 SqlSessionFactoryBuilder sessionFactoryBuilder = new SqlSessionFactoryBuilder(); //创建工厂 sqlSessionFactory = sessionFactoryBuilder.build(reader); } catch (IOException e) { e.printStackTrace(); } } //生产sqlSession sqlSession类与jdbc的Connection类似 public static SqlSession openSqlSession(){ return sqlSessionFactory.openSession(); }
5.测试
SqlSession session; DeptMapper deptMapper; @Before public void test() { session = MybatisUtil.openSqlSession(); //动态代理实现类 deptMapper = session.getMapper(DeptMapper.class); } @After public void after(){ session.commit(); session.close(); } @Test public void testFindDept(){ //该代理类实现了DeptMapper里面的方法 System.out.println(deptMapper.getClass().getName()); Dept dept = deptMapper.findDept(10); System.out.println(dept); }
原文:http://www.cnblogs.com/motianjie/p/7846251.html