mybatis是一个开源框架,可以把java的pojo映射成数据库的中的记录;
demo
创建实体类,用于映射数据表
package com.how2java.pojo; public class Category { private int id; private String name; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } }
配置文件mybatis-config.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> <typeAliases> <package name="com.how2java.pojo"/> </typeAliases> <environments default="development"> <environment id="development"> <transactionManager type="JDBC"/> <dataSource type="POOLED"> <property name="driver" value="com.mysql.jdbc.Driver"/> <property name="url" value="jdbc:mysql://localhost:3306/how2java?characterEncoding=UTF-8"/> <property name="username" value="root"/> <property name="password" value="admin"/> </dataSource> </environment> </environments> <mappers> <mapper resource="com/how2java/pojo/Category.xml"/> </mappers> </configuration>
配置文件Category.xml,这个是与数据表Category所对应的配置文件,其内部可以定义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="com.how2java.pojo"> <select id="listCategory" resultType="Category"> select * from category_ </select> </mapper>
测试类
package com.how2java; import java.io.IOException; import java.io.InputStream; import java.util.List; 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 com.how2java.pojo.Category; public class TestMybatis { public static void main(String[] args) throws IOException { //根据配置文件得到sqlSessionFactory String resource = "mybatis-config.xml"; InputStream inputStream = Resources.getResourceAsStream(resource); SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); //根据sqlSessionFactory 得到session SqlSession session=sqlSessionFactory.openSession(); //通过Session的selectList方法,调用配置文件Category.xml中的sql语句,sql语句的id就是selectList方法的参数 List<Category> cs=session.selectList("listCategory"); for (Category c : cs) { System.out.println(c.getName()); } } }
一级缓存
Mytabis的一级缓存在session上,只要第一次通过session查询数据,就会放在session上;下次再查询相同id的数据,直接从缓存中取出来,不用再去数据库中取。
public static void main(String[] args) throws IOException { String resource = "mybatis-config.xml"; InputStream inputStream = Resources.getResourceAsStream(resource); SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); SqlSession session1 = sqlSessionFactory.openSession(); //同一个id=1的Category,在相同的session下,第二次查询没有启动数据库 Category c1 = session1.selectOne("getCategory", 1); System.out.println(c1); Category c2 = session1.selectOne("getCategory", 1); System.out.println(c2); session1.commit(); session1.close(); }
二级缓存
mybatis的二级缓存是SessionFactory,这就比一级缓存范围更大了一些;因为session都是基于SessionFactory产生的;
二级缓存不是默认开启的,需要配置mybatis-config.xml和Category.xml,另外还需要让pojo类实现序列化接口Serializable;
这时再运行测试类,发现即使不是同一个session,但属于同一个SessionFactory,也会开启缓存,省掉第二次的数据库访问;