Mybatis 的配置详解

  • 1.核心配置文件
  • 1.1 properties 属性
  • 1.2 settings 设置
  • 1.3 typeAliases 类型命名
  • 1.4 environments 环境
  • 1.5 mappers映射器
  • 2.映射文件
  • 3.测试代码
  • 4.核心API
  • 5.单表增删改查
  • 6.主键返回


1.核心配置文件

1.1 properties 属性

<!-- 配置属性
1.用于外部配置实现动态替换。
2.可以使用property属性来配置;也可以引用外部的properties文件,默认读取classpath下的文件。
 使用${name}来获取value值
3.配置冲突时,先读取property标签数据;然后读取配置文件数据;最后读取方法参数传递的属性值,重名时会覆盖。
-->
  <properties resource="db.properties">
  	<property name="username" value="root"/>
  </properties>

1.2 settings 设置

<!-- settings
  	调整设置,可改变运行时行为
   -->
 <settings>
  	 <!-- 缓存的全局开关,默认是true -->
    <setting name="cacheEnabled" value="true"/>
     <!-- 延迟加载全局开关,默认是false -->
     <setting name="lazyLoadingEnabled" value="true"/>
  </settings>

1.3 typeAliases 类型命名

<!-- 类型别名设置:
   		类型别名是为 Java 类型设置一个短的名字。它只和 XML 配置有关,存在的意义仅在于用来减少类完全限定名的冗余。
    -->
   <typeAliases>
   	 <!-- 单个类指定别名  -->
   	 <!-- <typeAlias type="po.User" alias="user"/>  -->
   	 <!-- 为指定的包下所有类指定别名,默认为类名,首字母大小写均可 -->
   	 <package name="pojo"/>
   </typeAliases>

d) typeHandlers 类型处理器
将获取的值以合适的方式转换成 Java 类型。
默认即可,也可自定义。
e) objectFactory 对象工厂
MyBatis 每次创建结果对象的新实例时,它都会使用一个对象工厂(ObjectFactory)实例来完成。 默认的对象工厂需要做的仅仅是实例化目标类,要么通过默认构造方法,要么在参数映射存在的时候通过参数构造方法来实例化
f) plugins 插件
MyBatis 允许你在已映射语句执行过程中的某一点进行拦截调用。

1.4 environments 环境

  1. environment 环境变量
  2. transactionManager 事务管理器
  3. dataSource 数据源
<!-- 配置环境:
      1.可以配置成适应多种环境,将sql映射到多种数据库中
      2.尽管可以配置多个环境,每个 SqlSessionFactory实例只能选择其一
      3.default指默认使用环境的id
   --> 
  <environments default="development">
    <!-- 单个环境配置:必须指定id -->
    <environment id="development">
  <!--事务管理器:
      type:
      1.JDBC:这个配置就是直接使用了 JDBC 的提交和回滚设置,它依赖于从数据源得到的连接来管理事务作用域。
       需要手动控制,除非指定自动提交事务
       2.MANAGED:从来不提交或回滚一个连接,而是让容器来管理事务的整个生命周期 
    -->
      <transactionManager type="JDBC"/>
    <!--数据源的配置:
        type:
       1.UNPOOLED:这个数据源的实现只是每次被请求时打开和关闭连接。虽然一点慢,它对在及时可用连接方面没有性能要求的简单应用程序是一个很好的选择。
        2.POOLED:这种数据源的实现利用“池”的概念将 JDBC 连接对象组织起来,避免了创建新的连接实例时所必需的初始化和认证时间。 这是一种使得并发 Web 应用快速响应请求的流行处理方式。
        3.JNDI:这个数据源的实现是为了能在如 EJB 或应用服务器这类容器中使用,容器可以集中或在外部配置数据源,然后放置一个 JNDI 上下文的引用。
       -->
      <dataSource type="POOLED">
        <property name="driver" value="${driver}"/>
        <property name="url" value="${url}"/>
        <property name="username" value="${username}"/>
        <property name="password" value="${password}"/>
      </dataSource>
    </environment>
  </environments>

1.5 mappers映射器

<!-- 
          映射文件的资源引用:寻找sql映射文件
  -->
  <mappers>
    <!-- 1.使用相对资源路径 -->
    <!-- <mapper resource="mapper/UserMapper.xml"/> -->
    <!-- 2.使用完全限定资源定位符 -->
    <!-- <mapper url="file:///D:/Mybatis_day01/src/mapper/UserMapper.xml"/> -->
    <!-- 3.使用mapper接口的全限定类名 -->
    <!--  <mapper class="com.lee.mapper.UserMapper"/> -->
    <!-- 4.注册该包下面的所有映射文件,mapper映射文件和mapper接口必须同包同名 -->
       <package name="mapper"/>
  </mappers>

2.映射文件

<!DOCTYPE mapper
  PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
  "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!--
	namespace:命名空间
	   1.用于分类化管理sql,即sql隔离
	   2.在mapper接口开发中有特殊含义
  -->
<mapper namespace="mapper">
   <!--  根据用户id查询用户信息
       1.select标签代表查询的MappedStatement对象
        1.1 id:statement的唯一标识,在namespace中必须唯一
        1.2 resultType:输出单条结果集对应的java类型
        1.3 parameterType:输入参数的java类型
        1.4 #{}:代表一个占位符
       1.5 #{id}:输入参数的名称为id。输入参数为简单数据类型时可任意。
     -->
  <select id="selectUsers" resultType="user" >
    select * from users where userid = #{userid}
  </select>
    <!--sql片段复用 
		id:sql片段的唯一标识
	 -->
	<sql id="cols">
		userid,uname,pwd,roleid
	</sql>
	<!-- include:包含sql片段
	     refid:引用sql片段的id
	 -->
	<select id="selectUser" resultType="user" >
    select <include refid="cols"/>
     from users where userid = #{userid}
    </select>
  <!-- insert代表添加的映射 -->
  <!-- update代表修改的映射 -->
  <!-- delete代表删除的映射 -->
</mapper>

3.测试代码

//1.获取配置文件,并将其转换为输入流
InputStream is = Resources.getResourceAsStream("Mybatis.cfg.xml");
//2.借助SqlSessionFactoryBuilder创建sqlSessionFactory对象,是重量级组件,在整个应用程序是单例的
// 用于创建SqlSession对象
SqlSessionFactory ssf = new SqlSessionFactoryBuilder() .build(is);
//3.创建sqlSession对象
//用于执行sql映射
//ssf.openSession(true)  指定为true代表事务会自动提交
SqlSession session = ssf.openSession();
//4.执行查询
User user = session.selectOne("mapper.selectUsers", 1);
System.out.println(user);
//5.释放资源
session.close();

4.核心API

SQLSessionFactoryBuilder:
它的作用只是通过配置文件创建SQLSessionFactory,所以只要创建出SQLSessionFactory,它就可以销毁了。所以说,它的生命周期是在方法之内。
SQLSessionFactory:
它的作用是创建SQLSession的工厂,工厂一旦创建,除非应用停掉,不要销毁。
所以说它的生命周期是在应用范围内。这里可以通过单例模式来管理它。
在mybatis整合spring之后,最好的处理方式是把SQLSessionFactory交由spring来做单例管理。
SQLSession:
SQLSession是一个面向用户(程序员)的接口,它的默认实现是DefaultSQLSession。
Mybatis是通过SQLSession来操作数据库的。SQLSession中不仅包含要处理的SQL信息,还包括一些数据信息,所以说它是线程不安全的,因此它最佳的生命周期范围是在方法体之内。

5.单表增删改查

映射文件:

<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="mapper">
 <!--1.根据userid查询用户 -->
<select id="selectUsers" resultType="user" >
  select * from users where userid = #{userid}
</select>
<!--2.查询所有用户  -->
<select id="selectAll" resultType="user">
	select * from users
</select>
<!-- 3.模糊查询 
	     3.1 ${} 表示连接符,存在注入风险,但是排序等操作,输入排序列名时使用
	     3.2 简单数据类型的输入参数必须使用value
        3.3 pojo类型使用属性名称
        3.4 map类型使用key值
-->
<select id="selectLike" resultType="user" parameterType="string">
	select * from users where username like '%${value}%'
</select>
<!-- 4.添加数据 -->
<insert id="insert" parameterType="user">
	insert into users(username,password) values(#{username},#{password})
</insert>
<!-- 5.修改数据 -->
<update id="update" parameterType="user">
	update users set username = #{username},password=#{password} where userid = #{userid}
</update>
<!-- 6.删除数据 -->
<delete id="delete" parameterType="int">
	delete from users where userid = #{userid}
</delete>
</mapper>

测试代码:

//查询一个
	@Test
	public void testSelectOne(){
		SqlSession session = MybatisUtils.getSession();
		User user = session.selectOne("mapper.selectUsers", 2);
		System.out.println(user);
		MybatisUtils.closeSession();
	}
	//查询所有
	@Test
	public void testSelectList(){
		SqlSession session = MybatisUtils.getSession();
		List<User> users = session.selectList("mapper.selectAll");
		System.out.println(users);
		MybatisUtils.closeSession();
	}
	//模糊查询
	@Test
	public void selectLikeName(){
		SqlSession session = MybatisUtils.getSession();
		List<User> users = session.selectList("mapper.selectLike","l");
		System.out.println(users);
		MybatisUtils.closeSession();
	}
//查询map数据
	@Test
	public void test2(){
		SqlSession session = MybatisUtils.getSession();
		//以userid为key值,以对象为value值进行封装
		Map<Integer, UserInfo> map = 
			session.selectMap("mapper.UserInfoMapper.selectUser", "userid");
		System.out.println(map);
		MybatisUtils.closeSession();
	}
	//添加数据
	@Test
	public void insert(){
		SqlSession session = MybatisUtils.getSession();
		User user = new User();
		user.setUsername("zs");
		user.setPassword("123");
		int rows = session.insert("mapper.insert", user);
		if(rows > 0){
			System.out.println("添加成功");
		}else{
			System.out.println("添加失败");
		}
		MybatisUtils.closeSession();
	}
	//修改数据
	@Test
	public void update(){
		SqlSession session = MybatisUtils.getSession();
		User user = new User();
		user.setUserid(4);
		user.setUsername("zs");
		user.setPassword("123");
		int rows = session.update("mapper.update", user);
		if(rows > 0){
			System.out.println("修改成功");
		}else{
			System.out.println("修改失败");
		}
		MybatisUtils.closeSession();
	}
	//删除数据
	@Test
	public void delete(){
		SqlSession session = MybatisUtils.getSession();
		User user = new User();
		user.setUserid(9);
		int rows = session.update("mapper.delete", user);
		if(rows > 0){
			System.out.println("删除成功");
		}else{
			System.out.println("删除失败");
		}
		MybatisUtils.closeSession();
	}

6.主键返回

<!-- 添加并返回主键
    1.数据库支持自动生成主键的字段
      useGeneratedKeys:支持Mybatis从数据库获取主键
      keyProperty:主键封装的属性
   -->
  <insert id="insert" parameterType="user" useGeneratedKeys="true" keyProperty="userid">
  	  insert into users(username,password) values(#{username},#{password})
  </insert>
  <!-- 添加并返回主键
    2.通用的方式  <selectKey>
   -->
  <insert id="insert2" parameterType="po.User2" useGeneratedKeys="true" keyProperty="userid">
     <!-- 2.1 last_insert_id函数:是MySQL数据库自带的返回插入信息自增主键的函数,必须是insert语句一起使用:
       keyProperty:封装的属性名称
       order:相对于insert而言,查询的顺序,自增建议使用after
     -->
     <!--  <selectKey keyProperty="userid" order="AFTER" resultType="int">
      	select last_insert_id()
      </selectKey> -->
      <!--  2.2 uuid():Mysql自带的能够生成32位字符串
       order:相对于insert而言,查询的顺序,非自增建议使用before
        -->
     <!--  <selectKey keyProperty="userid" order="BEFORE" resultType="string">
      	select uuid()
      </selectKey> -->
      <!-- 2.3 序列:oracle中自带
       -->
       <selectKey keyProperty="userid" order="BEFORE" resultType="int">
       	select seq_user.nextval from dual
       </selectKey>
  	  insert into users values(#{userid},#{username},#{password})
  </insert>