Mybatis框架:
一:框架概述
- mybatis是一个优秀的基于java的持久层框架,内部封装了jdbc,开发者只需要关注sql语句本身,不需要去处理加载驱动,创建连接,等过程
- mybatis通过xml’或者注解的方式将要执行的各种statement配置起来,并通过java对象和statement中的sql的动态参数进行映射生成最终执行的sql语句,最后让mybatis框架进行执行sql语句并将结果封装为java对象返回.
- 采用 ORM 思想解决了实体和数据库映射的问题,对 jdbc 进行了封装,屏蔽了 jdbc api 底层访问细节,使我 们不用与 jdbc api 打交道,就可以完成对数据库的持久化操作为了我们能够更好掌握框架运行的内部过程,并且有更好的体验.
二:简单入门
-
安装:使用 MyBatis, 只需将 mybatis-x.x.x.jar 文件置于 classpath 中即可。
如果使用 Maven 来构建项目,则需将下面的 dependency 代码置于 pom.xml 文件中
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>x.x.x</version>
</dependency>
-
功能架构
- API接口层:提供给外部使用的接口API,开发人员通过这些本地API来操纵数据库.接口层–接收到调用请求就会调用数据处理层来完成具体的数据处理
- 数据处理层:负责具体的sql查找,sql解析,sql执行结果映射处理等
- 基础支撑层: 负责最最基础的功能支撑
-
搭建开发环境
- 创建maven工程
Groupid:com.ityouxin ArtifactId:mybatis01 Packing:jar
- 添加依赖jar包
<dependencies> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.4.5</version> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.10</version> <scope>test</scope> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.6</version> <scope>runtime</scope> </dependency> <dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>1.2.12</version> </dependency> </dependencies> <dependencies> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.4.5</version> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.10</version> <scope>test</scope> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.6</version> <scope>runtime</scope> </dependency> <dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>1.2.12</version> </dependency> </dependencies>
- 编写User实体类
public class User implements Serializable { private Integer id; private String username; private Date birthday; private String sex; private String address; public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public Date getBirthday() { return birthday; } public void setBirthday(Date birthday) { this.birthday = birthday; } public String getSex() { return sex; } public void setSex(String sex) { this.sex = sex; } public String getAddress() { return address; } public void setAddress(String address) { this.address = address; } @Override public String toString() { return "User [id=" + id + ", username=" + username + ", birthday=" + birthday + ", sex=" + sex + ", address=" + address + "]"; } }
- 编写持久层接口UserDao
public interface UserDao{ List<User> findAll(); }
- 编写持久层接口的映射文件UserDao.xml
要求:创建位置必须与持久层接口的包结构相同 名称必须以持久层接口名称命名的.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"> //命名空间 绑定到UserDao接口的全路径 //当namespace绑定的是dao接口的全路径时,其实现数据持久化的方式为有代理模式实现数据持久化。即会自动产生代理,自动实现数据的持久化,不需要实现dao层的接口 <mapper namespace="com.ityouxin.dao.UserDao"> <!-- 配置查询所有操作 --> //id对应接口中的方法名 <select id="findAll" resultType="com.ityouxin.domain.User"> select * from user </select> </mapper>
- 编写SqlMaoConfig.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> <!-- 配置 mybatis 的环境 --> <environments default="mysql"> <!-- 配置 mysql 的环境 --> <environment id="mysql"> <!-- 配置事务的类型 --> <transactionManager type="JDBC"></transactionManager> <!-- 配置连接数据库的信息:用的是数据源(连接池) --> <dataSource type="POOLED"> <property name="driver" value="com.mysql.jdbc.Driver"/> <property name="url" value="jdbc:mysql://localhost:3306/mybatis"/> <property name="username" value="root"/> <property name="password" value="123"/> </dataSource> </environment> </environments> <!-- 告知 mybatis 映射配置的位置 --> <mappers> //映射到UserDao.xml文件 <mapper resource="com/ityouxin/dao/UserDao.xml"/> </mappers> </configuration>
- 编写测试类
public class test{ public static void main(String[] args) throws Exception { //读取配置文件 InputStrean in = Resources.getResourceAsStream("SqlMapConfig.xml"); //创建SqlSessionFactory的构建者对象,构建工厂对象 SqlSessionFactory factory = new SqlSessionFactoryBulider().bulid(in); //使用 SqlSessionFactory 生产 SqlSession 对象 SqlSession session = factory.openSession(); //使用 SqlSession 创建 dao 接口的代理对象 IUserDao userDao = session.getMapper(IUserDao.class); //使用代理对象执行查询所有方法 List<User> users = userDao.findAll(); for(User user : users) { System.out.println(user); } //释放资源 session.close(); in.close(); } }
三:小结
1. 通过快速入门示例,我们发现使用 mybatis 是非常容易的一件事情,因为只需要编写 Dao 接口并且按照 mybatis 要求编写两个配置文件,就可以实现功能。远比我们之前的 jdbc 方便多了。(我们使用注解之后,将变得 更为简单,只需要编写一个 mybatis 配置文件就够了。) 但是,这里面包含了许多细节,比如为什么会有工厂对象(SqlSessionFactory),为什么有了工厂之后还 要有构建者对象(SqlSessionFactoryBuilderIUserDao.xml
四:基于注解的mybatis使用
- 持久层添加注解
public interface IUserDao {
/**
* 查询所有用户
* @return
*/
@Select("select * from user")
List<User> findAll();
}
- 修改SqlMapConfig.xml配置文件
<!-- 告知 mybatis 映射配置的位置 -->
<mappers>
<mapper class="com.ityouxin.dao.IUserDao"/>
</mappers>
注意:注解和xml两种方式不能同时使用,当使用注解,需要将UserDao.xml配置中的有关sql查询语句注释掉