代码分布:DAO+Service
MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBatis 。2013年11月迁移到Github。
iBATIS一词来源于“internet”和“abatis”的组合,是一个基于Java的持久层框架。iBATIS提供的持久层框架包括SQL Maps和Data Access Objects(DAO)
1. 诞生背景Java的原生数据库通信API( jdbc ),使用过于繁琐,而且随着数据变得复杂越发变得繁冗。
如下一个极其简单的查询动作,足以说明问题:
// 1> 自己管理 所有底层对象:驱动类,Connection,Statement,ResultSet Class.forName("com.mysql.jdbc.Driver"); Connection connection = DriverManager.getConnection("mysql:jdbc://localhost:3306/db9?\ useUnicode=true&characterEncoding=utf8"); PreparedStatement preparedStatement = connection.prepareStatement("select id,name,age from t_user"); ResultSet resultSet = preparedStatement.executeQuery(); // 2> 自己处理数据转换过程:【 数据表格 ==> java对象 】 ArrayList<User> users = new ArrayList<User>(); while(resultSet.next()){ Integer id = resultSet.getInt("id"); String name = resultSet.getString("name"); Integer age = resultSet.getInt("age"); User user = new User(id,name,age); users.add(user); } 2. ORM概念:Object Relational Mapping,对象关系映射。
目标:在【java对象】 和 【关系表】 建立映射
:简化两者之间的通信过程。可以直接通信。( ops: 如上的过程不再用自己处理 )
细节:ORM是持久层框架(MyBatis,Hibernate),的重要底层设计思路。为简化持久层开发提供驱动
: java持久层框架将jdbc纳入底层,然后上层架设orm,使开发者脱离jdbc的繁琐
MyBatis对ORM的践行方式:二、编码过程
Jdk环境:jdk1.8
数据库环境:MySQL 5.1
Mybatis:3.4.5
1. 搭建流程 1.1 导入依赖 // pom.xml <!-- mybatis 依赖 --> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.4.5</version> </dependency> <!-- mysql驱动 依赖 --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.25</version> </dependency> //pom.xml,使得src/main/java下的xml文件可以进入编译范围 <build> <resources> <resource> <directory>src/main/java</directory> <includes> <include>**/*.xml</include> </includes> </resource> <resource> <directory>src/main/resources</directory> <includes> <include>**/*.xml</include> <include>**/*.properties</include> </includes> </resource> </resources> </build> </project> 1.2 定义O和R create table t_user( id int primary key auto_increment, name varchar(20), gender char(1),-- tinyint(1) create_time datetime )default charset=utf8 engine=innodb; class User{ private Integer id; private String name; private Boolean gender; private Date createTime; //get/set.... } 1.3 M-定义映射文件DAO接口定义不变,映射文件即Mapper文件替换之前的DAO实现
public interface UserDAO { public List<User> queryAll(); public User queryOne(@Param("id") Integer id); public List<User> queryManyByName(@Param("name") String name); public List<User> queryManyByDate(@Param("createTime") Date craeteTime); // 明确为参数定义别名,用于mapper文件中获取 public List<User> queryUserByIdAndName(@Param("id") Integer id, @Param("name") String name); } // UserDAO.xml 重点搞清楚 何为映射 <!-- 不用定义dao的实现类,此映射文件等价于dao的实现 --> <!-- namespace="dao接口路径"--> <?xml version="1.0" encoding="UTF-8"?> <!-- dtd:document type definition 配置文件规范 --> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="com.zhj.dao.UserDAO"> <!-- 根据id查询用户,User queryOne(Integer id) select:配置查询语句 id:可以通过id找到执行的statement,对应dao中的一个方法名 parameterType: 参数类型 【int long float double string boolean date 自建类型(com.zhj.domain.User)】 resultType:结果类型,查询的结果会被封装到对应类型的对象中 #{}:相当于占位符 #{id}:就是把 “queryOne” 方法的名为id的参数填充到占位上 --> <select parameterType="int" resultType="com.zhj.domain.User"> select id as id,name as name,gender as gender,create_time as createTime from t_user where id=#{id} </select> <!-- 注意:返回类型实际是List<User> , 但此处只需定义User即可 --> <select resultType="com.zhj.domain.User"> select id,name,gender,create_time as createTime from t_user </select> <select parameterType="string" resultType="com.zhj.domain.User"> select id,name,gender,create_time as createTime from t_user where name like #{name} </select> <select parameterType="date" resultType="com.zhj.domain.User"> select id,name,gender,create_time as createTime from t_user where create_time=#{createTime} </select> <!-- 注意:此时方法有多个参数,【#{xx}】取值时,需要@param支持 --> <select resultType="com.qianfeng.pojo.User" parameterType="com.qianfeng.pojo.User"> select id,name,gender,birth from t_user where id=#{id} or name like #{name} </select> </mapper> 1.4 搭建配置文件 <?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> <!-- 使用 id为“development”的环境信息 --> <environments default="development"> <environment> <!-- 配置JDBC事务控制,由mybatis进行管理 --> <transactionManager type="JDBC"></transactionManager> <!-- 配置数据源,采用mybatis连接池 --> <dataSource type="POOLED"> <property value="com.mysql.jdbc.Driver" /> <!-- 【&】是特殊字符,【&】是【&】的转义 --> <property value="jdbc:mysql://localhost:3306/db9?useUnicode=true&characterEncoding=utf8" /> <property value="root" /> <property value="111111" /> </dataSource> </environment> </environments> <!-- 加载映射文件 --> <mappers> <!-- 使用资源的路径 <mapper resource="com/zhj/dao/UserDAO.xml"/> --> <!-- 加载某个包下的映射文件 (推荐) 要求:Mapper接口的名称与映射文件名称一致 且 必须在同一个目录下 --> <package/> </mappers> </configuration> 2. 测试使用 2.1 核心APISqlSessionFactoryBuilder:该对象负责加载MyBatis配置文件 并 构建SqlSessionFactory实例
SqlSessionFactory:每一个MyBatis的应用程序都以一个SqlSessionFactory对象为核心。负责创建SqlSession对象实例。