mybatis的核心配置
SqlSessionFactory
- 它是单个数据库映射关系经过编译后的内存镜像,主要作用是创建SqlSession
- SqlSessionFactory对象的实例通过SqlSessionFactoryBuilder对象来构建,而SqlSessionFactoryBuilder可以通过XML配置文件或一个预先定义好的Configuration实例构建出它的实例。
//得到文件的输出流
InputStream resourceAsStream = Resources.getResourceAsStream(“配置文件位置”);
//根据配置文件构建SqlSessionFactory
SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);**
- SqlSessionFactory对象是线程安全的,它一旦被创建,在整个应用执行期间都会存在,每个数据库对应一个SqlSessionFactory对象,在构建SqlSessionFactory实例的时候,建议使用单例模式。
SqlSession
- 它是应用程序域持久化层之间交互操作的一个单线程对象,其主要作用是执行持久化操作;
- 每个线程都应该有一个自己的SqlSession实例,并且实例时不能被共享的,同时,SqlSession实例也是线程不安全的,因此其使用范围最好在一次请求或一个方法中,但不能在一个类的静态字段或者实例字段或任何类型的管理范围使用;
- 通常使用完SqlSession对象之后,要进行关闭操作。
- 方法
MyBatisUtils
package com.yzb.example;
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 java.io.IOException;
import java.io.InputStream;
/*
* 工具类
* */
public class MyBatisUtils {
/*
* 初始化sqlSessionFactory对象
* */
private static SqlSessionFactory sqlSessionFactory = null;
static {
try {
//使用mybatis提供resources类加载MyBatis的配置文件
InputStream resourceAsStream = Resources.getResourceAsStream("mybatis-config.xml");
//创建SqlSessionFactory工厂
sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);
} catch (IOException e) {
e.printStackTrace();
}
}
//获取SqlSession对象的方法
public static SqlSession getSession(){
return sqlSessionFactory.openSession();
}
}
配置文件
在MyBatis框架的核心配置文件中,元素是配置文件的根元素。其他元素都在根元素里面配置。
在这个配置文件中,子元素要按照上面的顺序进行配置,否则会出错。
properties
db.properties
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/spring
jdbc.username=root
jdbc.password=root
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>
<!--配置属性-->
****<properties resource="db.properties"/>****
<!--1.配置环境 ,默认的环境id为mysql-->
<environments default="mysql">
<!--1.2.配置id为mysql的数据库环境 -->
<environment id="mysql">
<!-- 使用JDBC的事务管理 -->
<transactionManager type="JDBC" />
<!--数据库连接池 -->
<dataSource type="POOLED">
<property name="driver" value="${jdbc.driver}" />
<property name="url"
value="${jdbc.url}" />
<property name="username" value="${jdbc.username}" />
<property name="password" value="${jdbc.password}" />
</dataSource>
</environment>
</environments>
<!--2.配置Mapper的位置 -->
<mappers>
<mapper resource="com/yzb/chapter06/mapper/CustomerMapper.xml" />
</mappers>
</configuration>
settings
- 用于改变mybatis运行时的行为,例如开启二级缓存,开启延迟加载等。
一级缓存
package com.yzb.example;
import com.yzb.chapter07.pojo.Customer;
import org.apache.ibatis.session.SqlSession;
public class Test2 {
public static void main(String[] args) {
SqlSession session = MyBatisUtils.getSession();
Customer o = session.selectOne("com.yzb.chapter07.mapper.CustomerMapper.findCustomerById", 1);
System.out.println(o.toString());
//事务的提交,代表一级缓存的关闭
session.commit();
SqlSession session1 = MyBatisUtils.getSession();
Customer customer = session.selectOne("com.yzb.chapter07.mapper.CustomerMapper.findCustomerById", 1);
System.out.println(customer.toString());
}
}
package com.yzb.example;
import com.yzb.chapter07.pojo.Customer;
import org.apache.ibatis.session.SqlSession;
public class Test2 {
public static void main(String[] args) {
SqlSession session = MyBatisUtils.getSession();
Customer o = session.selectOne("com.yzb.chapter07.mapper.CustomerMapper.findCustomerById", 1);
System.out.println(o.toString());
//事务的提交,代表一级缓存的关闭
/* session.commit();*/
SqlSession session1 = MyBatisUtils.getSession();
Customer customer = session.selectOne("com.yzb.chapter07.mapper.CustomerMapper.findCustomerById", 1);
System.out.println(customer.toString());
}
}
此时开启了一级缓存。
二级缓存
- 在mybatis-config.xml
<settings>
<setting name="cacheEnable" value="true"/>
</settings>
- 在customerMapper中添加
<!--开启二级缓存-->
<cache/>
- Test3
package com.yzb.example;
import com.yzb.chapter07.pojo.Customer;
import org.apache.ibatis.session.SqlSession;
public class Test3 {
/*
* 开启缓存测试
* SqlSessionFactory
* 需要手动开启
* 二级缓存查询的对象需要开启序列化接口
* */
public static void main(String[] args) {
SqlSession session = MyBatisUtils.getSession();
Customer customer = session.selectOne("com.yzb.chapter07.mapper.CustomerMapper.findCustomerById", 1);
System.out.println(customer.toString());
session.close();
session = MyBatisUtils.getSession();
customer = session.selectOne("com.yzb.chapter07.mapper.CustomerMapper.findCustomerById", 1);
System.out.println(customer.toString());
session.close();
}
}
typeAliasea元素
- 用于配置文件中的java类型设置一个简短的名字
<typeAliases>
<!--如果忘记了配置alias,那末会类名首字母小写后作为别名-->
<typeAlias type="com.yzb.chapter07.pojo.Customer" alias="customer"/>
<!--使用自动扫描包来定义别名,同上,将类名首字母小写后作为别名-->
<package name="com.yzb.chapter07.pojo"/>
<!--@Alias("")注解的形式-->
</typeAliases>
typeHandler 元素
- 主要用于将预处理对象语句中传入的参数从JavaType(java类型)转换成jdbcType(Jdbc类型),或者从数据库中取出结果时将jdbcType转换成javaType
<typeHandlers>
<!--以单个类的形式配置-->
<typeHandler handler="com.itheima.type.CustomertypeHandler"/>
<!--注册一个包中所有的typeHandler,系统会在启动时自动扫描包下的所有的文件-->
<package name="com.itheima.type"/>
</typeHandlers>
- 类处理器很多不提及了。
objectFactory和plugins元素
objectFactory(对象工厂)主要是用来实例化目标类,它可以通过默认的无参构造器来完成实例化,也可以在参数映射存在的时候通过参数构造方法来实例化。
默认情况下,使用默认的ObjectFactory,它是由DefalutObjectFactory提供服务的。
如果想进行更改,可以通过重写方法自定义。
package com.yzb.example;
import org.apache.ibatis.reflection.factory.DefaultObjectFactory;
import java.util.List;
import java.util.Properties;
public class MyObjectFactory extends DefaultObjectFactory {
@Override
public <T> T create(Class<T> type) {
return super.create(type);
}
@Override
public <T> T create(Class<T> type, List<Class<?>> constructorArgTypes, List<Object> constructorArgs) {
return super.create(type, constructorArgTypes, constructorArgs);
}
@Override
public void setProperties(Properties properties) {
super.setProperties(properties);
}
@Override
public <T> boolean isCollection(Class<T> type) {
return super.isCollection(type);
}
}
在mybatis-config.xml配置文件中加入这个配置
<objectFactory type="com.yzb.example.MyObjectFactory">
<property name="name" value="MyObjectFactory"/>
</objectFactory>
plugins 元素
- mybatis允许在已映射语句执行过程中的某一点进行拦截调用,这种拦截调用就是通过插件来实现的。
environments和mappers 元素
<environments default="mysql">
<!--1.2.配置id为mysql的数据库环境 -->
<environment id="mysql">
<!-- 使用JDBC的事务管理 -->
<transactionManager type="JDBC" />
<!--数据库连接池 -->
<dataSource type="POOLED">
<property name="driver" value="${jdbc.driver}" />
<property name="url"
value="${jdbc.url}" />
<property name="username" value="${jdbc.username}" />
<property name="password" value="${jdbc.password}" />
</dataSource>
</environment>
</environments>
<!--2.配置Mapper的位置 -->
<mappers>
<mapper resource="com/yzb/chapter07/mapper/CustomerMapper.xml" />
</mappers>
jdbc事务管理的type
DataSource的type
- 1
- 2
- 3
mappers
<!--2.配置Mapper的位置 -->
<!--使用类路径引入-->
<mappers>
<mapper resource="com/yzb/chapter07/mapper/CustomerMapper.xml" />
</mappers>
<!--使用本地文件路径引入-->
<mappers>
<mapper url="file://D:com/itheima/mapper/UserMapper"/>
</mappers>
<!--使用接口类引入-->
<mappers>
<mapper class="com.itheima.mapper.UserMapper"/>
</mappers>
<!--使用报名引入-->
<mappers>
<package name="com.itheima.mapper"/>
</mappers>
mapper.xml映射文件的主要元素
- 在这个配置文件中 <mapeper 元素是映射文件中的根元素,其他都是它的子元素。
select元素
<select id="findCustomerById" parameterType="Integer"
resultType="com.yzb.chapter07.pojo.Customer">
select * from t_customer where id = #{id}
</select>
常用属性
insert
<!--添加用户信息-->
<insert id="addCustomer" parameterType="com.yzb.chapter07.pojo.Customer" keyProperty="id" useGeneratedKeys="true">
insert into t_customer(username,jobs,phone) values(#{username},#{jobs},#{phone})
</insert>
update和delete元素
<!--更改用户信息-->
<update id="updateCustomer" parameterType="com.yzb.chapter07.pojo.Customer">
update t_customer set username= #{username} ,jobs = #{jobs} ,phone = #{phone} where id = #{id}
</update>
<delete id="deleteCustomer" parameterType="Integer">
delete from t_customer where id = #{id}
</delete>
sql元素
定义可重用的SQL语句。
<!--sql元素的使用-->
<sql id="customer">id,username,jobs,phone</sql>
<!--根据客户编号获取客户信息 -->
<select id="findCustomerById" parameterType="Integer"
resultType="com.yzb.chapter07.pojo.Customer">
select <include refid="customer"></include>
from t_customer where id = #{id}
</select>
<?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表示命名空间 -->
<mapper namespace="com.yzb.chapter07.mapper.CustomerMapper">
<sql id="tablename">
${prefix}customer
</sql>
<sql id="someinclude">
form
<include refid="${include_target}"></include>
</sql>
<sql id="customerColumns">
id,username,jobs,phone
</sql>
<select id="findCustomerById" parameterType="Integer" resultType="com.itheima.po.Customer" >
select
<include refid="customerColumns"/>
<include refid="someinclude">
<property name="prefix" value="t_"/>
<property name="include_target" value="tablename"/>
</include>
</select>
</mapper>
resultMap
结果映射集,主要是定义映射规则,级联的更新以及定义类型的转换器等。
User
package com.yzb.example1;
public class User {
private Integer id;
private String username;
private String password;
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 String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", username='" + username + '\'' +
", password='" + password + '\'' +
'}';
}
}
UserMapper.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">
<!-- namespace表示命名空间 -->
<mapper namespace="com.yzb.example1.UserMapper">
<resultMap id="resultMap" type="com.yzb.example1.User">
<id property="id" column="t_id"></id>
<result property="username" column="t_username"/>
<result property="password" column="t_password"/>
</resultMap>
<select id="findAllUser" resultMap="resultMap">
select * from t_user
</select>
</mapper>
Test
package com.yzb.example1;
import com.yzb.example.MyBatisUtils;
import org.apache.ibatis.session.SqlSession;
import java.util.List;
public class Test {
public static void main(String[] args) {
SqlSession session = MyBatisUtils.getSession();
List<User> users = session.selectList("com.yzb.example1.UserMapper.findAllUser");
for (User user : users) {
System.out.println(user);
}
session.close();
}
}