Mybatis简介
Mybatis是一个持久层框架,java语言编写的,他封装了jdbc操作的很多细节,是开发者只需要关注sql语句本身而无需关注注册驱动、创建连接等复杂过程,他使用了ORM思想实现了结果集的封装。
ORM:Object Relationl Mapping对象关系映射。简单的说就是把数据库表和实体类及属性对应起来,让我们操作实体类就实现操作数据库表
Mybatis入门(xml方式)
-
引入依赖(Mybatis,Mysql)
<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和SQL语句(入门案例为了简单,将数据库表的字段名称与实体类属性保持一致)
SQL语句:
CREATE TABLE `user` ( `id` int(11) NOT NULL AUTO_INCREMENT, `username` varchar(255) DEFAULT NULL, `birthday` date DEFAULT NULL, `sex` varchar(255) DEFAULT NULL, `address` varchar(255) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8;
实体类:
import java.io.Serializable; import java.util.Date; public class User implements Serializable { private Integer id; private String username; private Date birthday; private String sex; private String address; // get/set方法省略 @Override public String toString() { return "User [id=" + id + ", username=" + username + ", birthday=" + birthday + ", sex=" + sex + ", address=" + address + "]"; } }
-
dao接口 IUserMapper
public interface IUserDao { //查询所有用户 List<User> findAll(); }
-
编写持久层接口的映射文件 IUserMapper.xml
要求:要和dao接口的路径和名称保持一致
<?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"> <!-- namespace 取值是dao接口的全限定名 --> <mapper namespace="com.mg.dao.IUserMapper"> <!-- select标签的id属性取值是dao接口的方法名 --> <select id="findAll" resultType="com.mg.entity.User"> select * from user </select> </mapper>
-
编写mybatis主配置文件 SqlMapConfig.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="mysql"> <environment id="mysql"> <!-- 配置事务类型 --> <transactionManager type="JDBC"></transactionManager> <!-- 配置数据源(连接池) --> <dataSource type="POOLED"> <property name="driver" value="com.mysql.jdbc.Driver"></property> <property name="url" value="jdbc:mysql://localhost:3306/mybatis"></property> <property name="username" value="root"></property> <property name="password" value="root"></property> </dataSource> </environment> </environments> <!-- mapper文件的注册:指定持久层接口映射文件的位置 --> <mappers> <mapper resource="com/mg/dao/IUserMapper.xml"></mapper> </mappers> </configuration>
-
编写测试类,测试使用
import com.mg.dao.IUserMapper; import com.mg.entity.User; import org.apache.ibatis.io.Resources; import org.apache.ibatis.session.SqlSession; import org.apache.ibatis.session.SqlSessionFactory; import org.apache.ibatis.session.SqlSessionFactoryBuilder; import org.junit.Test; import java.io.IOException; import java.io.InputStream; import java.util.List; public class MyTest { @Test public void test1() { try { //读取配置文件 InputStream in = Resources.getResourceAsStream("sqlMapConfig.xml"); //创建工厂对象。构建者模式,builder就是构建者。好处:把对象的创建细节隐藏,使用者直接调用方 法即可拿到对象 SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(in); //使用工厂生产SqlSession 工厂模式,可以解耦,降低类之间的依赖关系 SqlSession sqlSession = factory.openSession(); //使用SqlSession 创建 dao 接口的代理对象。代理模式,好处是不修改源码的基础上对已有方法增强 IUserMapper mapper = sqlSession.getMapper(IUserMapper.class); //使用代理对象执行查询所有方法 List<User> users = mapper.findAll(); for(User user:users) { System.out.println(user); } //释放资源 sqlSession.close(); in.close(); } catch (IOException e) { e.printStackTrace(); } } }
Resource
作用:读取mybatis相关配置文件的。打开IO
建议:一次性 通过IO读取 所有的数据
SqlSessionFactory 作用:通过SqlSessionFactory 这个工厂 创建SqlSession 特点:重量级资源 内存占用多 功能多 每一个应用只创建一个对象 线程安全
SqlSession 特点:轻量级资源 不能被多线程共享 作用:
-
根据程序员书写的mapper文件,自动的创建mapper文件对应的Java类(DAO接口的实现类)
-
SqlSession 内部 封装 Connection对象 (一一对应的关系)
- SqlSession 控制事务 SqlSession.commit(); –相当于– Connection.commit();
SqlSession.rollback(); –相当于– Connection.rollback();
注意:实战中,查询操作不需要控制事务。增删改操作必须要控制事务
查询所有的原理分析图
Mybatis入门(注解方式)
-
引入依赖(和xml方式一致)
-
实体类(和xml方式一致)
-
dao接口(和xml方式一致)
-
持久层接口的映射文件 IUserMapper.xml 不需要了,要在dao接口的方法上使用相应注解
import com.mg.entity.User; import org.apache.ibatis.annotations.Select; import java.util.List; public interface IUserMapper { //查询所有 @Select("select * from user") List<User> findAll(); }
-
编写mybatis主配置文件 SqlMapConfig.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="mysql"> <environment id="mysql"> <transactionManager type="JDBC"></transactionManager> <dataSource type="POOLED"> <property name="driver" value="com.mysql.jdbc.Driver"></property> <property name="url" value="jdbc:mysql://localhost:3306/mybatis"></property> <property name="username" value="root"></property> <property name="password" value="root"></property> </dataSource> </environment> </environments> <mappers> <!--使用注解方式,mapper文件的注册需要变化--> <!--<mapper resource="com/mg/dao/IUserMapper.xml"></mapper>--> <mapper class="com.mg.dao.IUserMapper"></mapper> </mappers> </configuration>
注意: 我们在实际开发中都是偏向简单,所以无论是xml方式还是注解方式,我们都是不写dao实现类 的,但是Mybatis也是支持写dao实现类的
- SqlSession 控制事务 SqlSession.commit(); –相当于– Connection.commit();
SqlSession.rollback(); –相当于– Connection.rollback();
注意:实战中,查询操作不需要控制事务。增删改操作必须要控制事务