一、概述
-
Mybatis是一个优秀的持久层框架,它对JDBC操作数据库的过程进行封装,使开发者只需要关注sql本身。
-
我们原来使用JDBC操作数据库,需要手动的写代码去注册驱动、获取connection、获取statement等等,现在Mybaits帮助我们把这些事情做了,我们只需要关注我们的业务sql即可,这样可以提高我们的开发效率。
-
mybatis定义:
-
1.MyBatis 是一个可以自定义SQL、存储过程和高级映射的持久层框架。MyBatis 摒除了大部分的JDBC代码、手工设置参数和结果集重获。MyBatis 只使用简单的XML 和注解来配置和映射基本数据类型、Map 接口和POJO 到数据库记录。相对Hibernate和Apache OJB等“一站式”ORM解决方案而言,Mybatis 是一种“半自动化”的ORM实现。
-
2.需要使用的Jar包:mybatis-3.0.2.jar(mybatis核心包)。mybatis-spring-1.0.0.jar(与Spring结合包)。
3.MyBatis的前身是ibatis,但是在配置sql的语法上有明显的区别,并且spring目前的版本封装mybatis,至于mybatis-spring.jar文件也是mybatis团队复杂开发的jar包,用于和spring整合。之前ibatis的源码托管方是apache,而mybatis是google。
-
优点:基于SQL语句编程,相当灵活,不会对应用程序或者数据库的现有设计造成任何影响,SQL写在XML里,解除sql与程序代码的耦合,便于统一管理;提供XML标签,支持编写动态SQL语句,并可重用。
与JDBC相比,减少了50%以上的代码量,消除了JDBC大量冗余的代码,不需要手动开关连接;
很好的与各种数据库兼容(因为MyBatis使用JDBC来连接数据库,所以只要JDBC支持的数据库MyBatis都支持)。
能够与Spring很好的集成;
提供映射标签,支持对象与数据库的ORM字段关系映射;提供对象关系映射标签,支持对象关系组件维护。
缺点:1.Sql语句的编写工作量较大,尤其当字段多、关联表多时,对开发人员编写Sql语句的功底有一定要求。
2.对性能的要求很高,或者需求变化较多的项目,如互联网项目,MyBatis将是不错的选择。 -
传统java程序访问数据库流程图:
-
使用mybatis作为“中间商”访问数据库流程图:
添加mybatis的配置文件:
事务: 同一个事务下执行一组sql, 要就全部成功(提交事务, 写到文件中), 要就全部失败(有的成功,有的失败, 全部失败)(回滚事务, 成功的sql: 还原修改之前的状态) 事务: 加在业务层
主配置文件: mybatis-config.xml
-
对应有一个配置类: Configuration
-
<?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="mysql"> <!--具体的数据源环境--> <environment id="mysql"> <!--事务管理器 事务: 同一个事务下执行一组sql, 要就全部成功(提交事务, 写到文件中), 要就全部失败(有的成功,有的失败, 全部失败)(回滚事务, 成功的sql: 还原修改之前的状态) 事务: 加在业务层 JDBC: 默认自动提交, 设置手动提交 MANAGED: 事务交给第三方管理: Mybatis与Spring整合, 事务交给Spring管理 --> <transactionManager type="JDBC"></transactionManager> <!--数据源类型: JNDI: 把数据源配置Tomcat上, java 得到Tomcat配置的数据源 POOLED: 连接池, mybatis自带的连接池, 第三方连接池: 阿里 druid c3p0 commons-pool2 UNPOOLED: 未使用连接池, 操作数据库,创建连接, 使用完成, 关闭连接: JdbcUtil --> <!--连接那个数据库--> <dataSource type="POOLED"> <!--数据库四大参数--> <property name="driver" value="com.mysql.jdbc.Driver" /> <property name="url" value="jdbc:mysql://localhost:3306/mybatis-db" /> <property name="username" value="root" /> <property name="password" value="123" /> </dataSource> </environment> </environments> </configuration>
-
编写sql语句
sql位于sql映射文件: 与Dao接口作为文件名
UserDao接口: UserDao.xml的sql映射文件
OrderDao接口: OrderDao.xml的sql映射文件
一个dao对应一个sql映射文件
哪一个dao的sql, 写在对应sql映射文件中
-
<?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="xxx"> <!-- id: sql语句的唯一标识符 resultType: 结果集映射的对应的类类型: 包名.类名 parameterType: 参数类型: 对应的Dao的方法参数类型, 如果参数类型是简单数据类型(八大基本数据类型+String) 可以省略 使用 #{名字} --> <select id="findById" parameterType="int" resultType="com.fs.pojo.User" > select * from tb_user where id = #{id} </select> <!-- <update id=""> </update> <delete id=""> </delete> <insert id=""> </insert>--> </mapper>
编写代码
-
@Test public void test1() throws IOException { //读取mybatis全局配置文件 //默认读取类路径下的资源 InputStream in = Resources.getResourceAsStream("mybatis-config.xml"); //0.通过SqlSessionFactoryBuilder对象创建SqlSessionFactory //1.创建SqlSessionFactory对象: 作用: 创建SqlSession SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(in); //2. 创建SqlSession: 相当于Collection SqlSession sqlSession = sqlSessionFactory.openSession(); //3. 执行sql selectOne() 第一个参数: sql的id: namespace.id // 第二个参数: 给?赋值 User user = sqlSession.selectOne("xxx.findById", 1); System.out.println(user); //4.关闭 sqlSession.close(); }