2.1 MyBatis的核心对象
2.1.1 SqlSessionFactory
SqlSessionFactory是单个数据库映射关系经过编译后的内存镜像,用于创建SqlSession。
SqlSessionFactory对象实例通过SqlSessionFactoryBuilder对象来构建,通过XML配置文件或一个预先定义好的Configuration实例构建出SqlSessionFactory的实例。
InputStream inputStream= Resources.getResourceAsStream(配置文件);
SqlSessionFactory sqlSessionFactory=new SqlSessionFactoryBuilder().build(inputStream);
SqlSessionFactory是线程安全的,一旦被创建,整个应用执行期间都会存在,如果多次创建同一个数据库的SqlSessionFactory,资源很容易耗尽,所以使用单列模式。
2.1.2 SqlSession
SqlSession是应用程序与持久层之间执行交互操作的一个单线程对象,主要作用是执行持久化操作。
SqlSession对象包含数据库中所有执行SQL操作的方法,底层封装了JDBC连接,所以可以直接使用来执行已映射的SQL语句。
SqlSession使用完要及时关闭。
SqlSession常用方法:
-
<T>T selectOne(String statement);
:查询方法。
参数statement是在配置文件中定义的<select>
元素的id。
该方法返回执行SQL语句查询结果的一个泛型对象。 -
<T>I selectOne(String statement,Object parameter);
:查询方法。
参数statement是在配置文件中定义的<select>
元素的id,parameter是查询所需的参数。
该方法返回执行SQL语句查询结果的一个泛型对象。 -
<E> List <E> selectList(String statement);
:查询方法。
参数statement是在配置文件中定义的<select>
元素的id。
该方法返回执行SQL语句查询结果的泛型对象的集合。 -
<E>List<E> selectList(String statement,Object parameter);
:查询方法。
参数statement是在配置文件中定义的<select>
元素的id,parameter是查询所需的参数。
该方法返回执行SQL语句查询结果的泛型对象的集合。 -
e <E> List <E> selectList(String statement,Object parameter,RowBounds rowBounds);
:查询方法。
参数statement是在配置文件中定义的<select>
元素的id,parameter是查询所需的参数,rowBounds是用于分页的参数对象。
该方法返回执行SQL语句查询结果的泛型对象的集合。 -
void select(String statement, Object parameter, ResultHandlerhandler);
查询方法。
参数statement是在配置文件中定义的<select>
元素的id,parameter是查询所需的参数,ResultHandler对象用于处理查询返回的复杂结果集,通常用于多表查询。 -
int insert( String statement);
插入方法。
参数statement是在配置文件中定义的<insert>
元素的id。
该方法返回执行SQL语句所影响的行数。 -
int insert(String statement, Object parameter);
插入方法。
参数statement是在配置文件中定义的<insert>
元素的id,parameter是插入所需的参数。
该方法返回执行SQL语句所影响的行数。 -
int update(String statement);
更新方法。
参数statement是在配置文件中定义的<update>
元素的id。
该方法返回执行SQL语句所影响的行数。 -
int update(String statement, Object parameter);
更新方法。
参数statement是在配置文件中定义的<update>
元素的id,parameter是更新所需的参数。该方法返回执行SQL语句所影响的行数。 -
int delete(String statement);
删除方法。
参数statement是在配置文件中定义的<delete>
元素的id。
该方法返回执行SQL语句所影响的行数。 -
int delete(String statement, Object parameter );
删除方法。
参数statement是在配置文件中定义的<delete>
元素的id,parameter是删除所需的参数。
该方法返回执行SQL语句所影响的行数。 -
void commit();
提交事务的方法。 -
void rollback();
回滚事务的方法。 -
void close();
关闭SqlSession对象。 -
<T>T getMapper(Class<T> type)
返回 Mapper接口的代理对象,该对象关联了Sqlsession对象,开发人员可以使用该对象直接调用方法操作数据库。
参数type是Mapper的接口类型。 -
Connection getConnection();
获取JDBC数据库连接对象的方法。
2.2 MyBatis配置文件元素
<Configuration>
是配置文件的根元素,其他元素都要在<Configuration>
内配置。
MyBatis配置文件主要元素:
2.2.1<properties>
元素
<properties>
是一个配置属性的元素,通过外部配置来动态替换内部定义的属性。
示例2-1
配置数据库的连接等属性
- 创建db.properties文件
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/db_mybatis?serverTimezone=UTC
jdbc.username=root
jdbc.password=root
- 在mybatis-config.xml中配置
<properties/>
属性
<properties resource="db.properties"/>
- 修改配置文件中的数据库连接信息。
<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>
2.2.2 <settings>
元素
<settings>
元素主要用于改变MyBatis运行时的行为,例如开启二级缓存、开启延迟加载等。
<settings>
元素中常见的配置及描述:
2.2.3 <typeAliases>
元素
<typeAliases>
元素用于为配置文件的java类型设置一个简短的名字。
别名的设置与xml配置相关。
<typeAliases>
<typeAlias type="com.ssm.po.User" alias="user"/>
</typeAliases>
<typeAliases>
的子元素<typeAlias>
的type属性用于指定需要被定义别名的类的全限定名;alias属性的属性值就是自定义的别名。
当POJO类过多时,还可通过自动扫描包定义别名。
<!-- 自动扫描包定义别名-->
<typeAliases>
<package name="com.ssm.po"/>
</typeAliases>
<package>
中的name用于指定要定义别名的包,MyBatis会将所有POJO类以首字母小写的非限定类名作为别名。
MyBatis默认别名:
2.2.4 <typeHandler>
元素
MyBatis在预处理语句中设置一个参数或者从结果集中取出一个值时,都会用其框架内部注册了的typeHandler进行相关处理。
typeHandler的作用是将预处理语句中传入的参数从javatype转换为jdbcType,或者从数据库取出结果时将jdbcType转换为javaType。
使用方式:
(1)注册一个类的类型处理器
<typeHandlers>
<!-- 以单个类的形式-->
<typeHandler handler="com.ssm.type.UsertypeHandler1"/>
</typeHandlers>
<typeHandler>
的handler属性用于指定在程序中自定义的类型处理器。
(2)注册一个包中所有类型处理器
<typeHandlers>
<package name="com.ssm.type"/>
</typeHandlers>
2.2.5 <objectFactory>
元素
MyBatis每次创建结果对象的新实例时,都会使用一个对象工厂的实例来完成。MyBatis中默认objectFactory的作用就是实例化目标类。
2.2.6 <plugins>
元素
MyBatis允许在已映射语句执行过程中的某一点进行拦截调用。<plugins>
用来配置用户所开发的插件。
2.2.7 <environments>
元素
<environments>
用于在配置文件中对环境进行配置。
<!-- 1.配置环境,默认的环境id为mysql-->
<environments default="mysql">
<!-- 1.2 配置id为mysql的数据库环境-->
<environment id="mysql">
<!-- 使用JDBC事务管理-->
<transactionManager type="JDBC"></transactionManager>
<!-- 数据库连接池-->
<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>
在上述示例代码中,<environments>
元素是环境配置的根元素,它包含一个default属性,该属性用于指定默认的环境ID。<environment>
是<environments>
元素的子元素,它可以被定义多个,其id属性用于表示所定义环境的ID值。
在<environment>
元素内,包含事务管理和数据源的配置信息,其中<transactionManager>
元素用于配置事务管理,它的type属性用于指定事务管理的方式,即使用哪种事务管理器;<dataSource>
元素用于配置数据源,它的type属性用于指定使用哪种数据源。
在MyBatis中,可以配置两种类型的事务管理器,分别是JDBC和MANAGED。
JDBC:此配置直接使用JDBC的提交和回滚设置,依赖从数据源得到的连接来管理事务的作用域。
MANAGED:此配置从来不提交或回滚一个连接,而是让容器来管理事务的整个生命周期。在默认情况下,它会关闭连接,但一些容器并不希望这样,为此可以将closeConnection属性设置为false来阻止它默认的关闭行为。
对于数据源的配置,MyBatis框架提供了UNPOOLED、POOLED和JNDI三种数据源类型。
UNPOOLED:配置此数据源类型后,在每次被请求时会打开和关闭连接。它对没有性能要求的简单应用程序是一个很好的选择。
POOLED:此数据源利用“池”的概念将JDBC连接对象组织起来,避免在创建新的连接实例时需要初始化和认证的时间。这种方式使得并发Web应用可以快速地响应请求,是当前流行的处理方式。
JNDI:此数据源可以在EJB或应用服务器等容器中使用。容器可以集中或在外部配置数据源,然后放置一个JNDI上下文的引用。
2.2.8 <mappers>
元素
用于指定MyBatis映射文件的位置。
- 使用类路径引入
- 使用本地文件路径引入
- 使用接口类引入
- 使用包名引入
2.3 映射文件
映射文件中的主要元素:
2.3.1 <select>
元素
<select>
用于映射查询语句,从数据库读取数据,并组装数据给业务开发人员。
<select id="findUserById" parameterType="Integer" resultType="com.ssm.po.User">
select * from t_user where id=#{id}
</select>
上述语句中的唯一标识为findUserById,它接收一个Integer类型的参数,并返回一个User类型的对象。
在<select>
元素中,除了上述示例代码中的几个属性外,还有其他可以配置的属性:
2.3.2 <insert>
元素
<insert>
元素用于映射插入语句,在执行完元素中定义的SQL语句后,会返回一个表示插入记录数的整数。
<insert id="addUser" parameterType="com.ssm.po.User" flushCache="true"
statementType="PREPARED" keyProperty="id" keyColumn=""
useGeneratedKeys="" timeout="20">
insert into t_user(username,jobs,phone)values(#{username},#{jobs},#{phone})
</insert>