mybatis
mybatis是一个数据库持久层的框架,基于orm思想
搭建mybatis环境
- 创建一个maven项目
- 在pom.xml文件中导入jar
- 准备mybatis的核心配置文件
- 准备映射文件 Mapper.xml
pom.xml文件的配置
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.soft863</groupId>
<artifactId>mybatis3.4_01</artifactId>
<version>0.0.1-SNAPSHOT</version>
<!--mybatis jar mysql -->
<dependencies>
<dependency>
<!--测试包-->
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
<!--mybatis核心包-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.4</version>
</dependency>
<!--java连接mysql数据库-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.5</version>
</dependency>
<!-- 处理日志的 -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.7.8</version>
</dependency>
</dependencies>
</project>
mybatis的核心配置文件
<?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>
<!-- 给包下面的类批量起别名 默认User user-->
<package name="com.soft.bean"/>
<!-- 为特定的类起别名 -->
<!-- <typeAlias type="com.soft.bean.User" alias="user"/> -->
</typeAliases>
<!-- 配置连接数据库的相关环境-->
<environments default="development">
<environment id="development">
<!-- 事务管理器 使用jdbc去提交事务 -->
<transactionManager type="JDBC"></transactionManager>
<!-- 数据源 mybatis提供三种数据源类型 POOLED ,UNPOOLED, JNDI -->
<!-- pooled表示支持jdbc数据源连接 -->
<!-- unpooled表示不支持jdbc数据源连接 -->
<!-- jndi表示支持外部的数据源连接 -->
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/test"/>
<property name="username" value="root"/>
<property name="password" value="123456"/>
</dataSource>
</environment>
</environments>
<!-- 加载映射文件 -->
<mappers>
<mapper resource="com/soft/dao/Mapper.xml"/>
</mappers>
</configuration>
mapper映射文件
<?xml version="1.0" encoding="utf-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!-- 命名空间 -->
<mapper namespace="demo">
<!-- id 唯一性标识 -->
<!-- parameter传入参数的类型 -->
<!-- resulType返回值类型 这里因为配置文件中起了别名所以是user(com.soft.bean.User) -->
<select id="selectbyid" parameterType="int" resultType="user">
select * from s_user where id = #{id}
</select>
</mapper>
测试类
@Test
public void testSqlSession()
{
InputStream in;
try
{
//加载核心配置文件
in = Resources.getResourceAsStream("mybais-config.xml");
//获取SqlSessionFactory
SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(in);
//获取SqlSession openSession(true/false)参数默认是false,true表示开启事务
SqlSession sqlSession = sessionFactory.openSession(true);
int id = 1;
//demo.selectbyid 命名空间+唯一标识 id是要传入的参数
User user = sqlSession.selectOne("demo.selectbyid", id);
System.out.println(user);
} catch (IOException e)
{
e.printStackTrace();
}
}
mybatis中传参数
1.直接传参
2.传一个实体类,占位符里面的形参名字对应实体类的属性
3.如果传参是一个map,对应的是map的key
mybatis缓存 懒加载
<!-- 开启延迟加载 -->
<settings>
<!-- lazyLoadingEnabled:延迟加载启动,默认是false -->
<setting name="lazyLoadingEnabled" value="true"/>
<!-- aggressiveLazyLoading:积极的懒加载,false的话按需加载,默认是true -->
<setting name="aggressiveLazyLoading" value="false"/>
<!-- 开启二级缓存,默认是false -->
<setting name="cacheEnabled" value="true"/>
</settings>
mybatis一级缓存作用域是一个SqlSession,默认开启一级缓存。在同一个sql Session中执行相同的查询sql,第一次会查询数据库,并写到缓存,第二次会直接从缓存里取。当执行sql时,两次查询中间执行了insert、update、delete则sqlSqssion的缓存清空。(Mybatis的内部缓存使用一个HashMap,key为hashcode+statementId+sql语句。Value为查询出来的结果集映射成的java对象。)
mybatis二级缓存作用域是同一个namespace下的mapper映射文件的内容,多个sqlSession共享。mybatis需要手动设置开启二级缓存。
开启二级缓存
1、 在核心配置文件SqlMapConfig.xml中加入以下内容(开启二级缓存总开关):
cacheEnabled设置为 true
2、在映射文件中,加入以下内容,开启二级缓存:
实现序列化
由于二级缓存的数据不一定都是存储到内存中,它的存储介质多种多样,所以需要给缓存的对象执行序列化。
如果该类存在父类,那么父类也要实现序列化。
禁用二级缓存
该statement中设置userCache=false可以禁用当前select语句的二级缓存,即每次查询都是去数据库中查询,默认情况下是true,即该statement使用二级缓存。
刷新二级缓存
<select id="" paramaterType="" resultTpet="" flushCache="true" >...</select>