使用MyBatis框架配置dao层服务流程
1,导入mybatis-3.x.jar和数据库驱动jar包;
2,在数据访问层添加如下文件:
• 一个核心配置文件(例:Configuration.xml)
• 多个映射器接口(例:UserMapper.java)
• 多个映射xml文件(例:UserMapper.xml)
3,编写代码,解析Configuration.xml文件,创建SqlSessionFactory;一个应用中,只需创建一个工厂;
4,通过SqlSessionFactory创建SqlSession实例,进一步得到映射器接口的实例;
UserMapper userMapper=session.getMapper(UserMapper.class);
5,调用映射器接口中的方法执行业务处理;
user = userMapper.selectById(userId);
6,关闭SqlSession。
• 【示例1】完成用户登录功能
使用MyBatis框架完成根据用户账号读取用户信息。
UseMapper接口中的方法:
UserInfo getInfoByAccount(String account);
注:
1、在<select>元素中使用parameterType属性、resultType属性;
2、要确保select语句的结果集中的列名和Bean中的属性一致,可在SQL语句
中使用列别名。
该文件中配置数据库的连接参数和映射文件路径。
Configuration.xml配置文件
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<environments default="dev">
<environment id="dev">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value=""/>
<property name="url" value=""/>
<property name="username" value=""/>
<property name="password" value=""/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource=“com/.../XxxMapper.xml"/>
</mappers>
</configuration>
<environment id="dev">
<transactionManager type="JDBC"></transactionManager>
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver" />
......
</dataSource>
</environment>
说明:
transactionManager元素配置事务管理类型:
JDBC - 使用JDBC的提交和回滚功能管理事务。
MANAGED – 由容器管理事务。如Spring。
dataSource元素配置数据源,有三种数据源:UNPOOLED,POOLED,JNDI。
UNPOOLED –需配置以下属性: driver、url、username、password 。
POOLED –连接池数据源 。除了上述属性之外,还可配置如下属性:
poolMaximumActiveConnections –最大活动连接数。默认值:10
poolMaximumIdleConnections –最大空闲连接数。
poolMaximumCheckoutTime –池中连接的检查时间。默认值:20000毫秒
获取SqlSession和Mapper实例
• SqlSessionFactory 是创建SqlSession 的工厂。
核心配置文件Configuration.xml中配置了数据库的连接参数、连接池信息和事
务属性,通过解析核心配置文件创建SqlSessionFactory对象。
示例代码:
String rs = “com…/Configuration.xml";
Reader reader = Resources.getResourceAsReader(rs);
sqlSessionFactory=new SqlSessionFactoryBuilder().build(reader);
• 【了解】Configuration.xml文件中,environments下可配置多套环境,包括数
据源信息、事务属性等 ,但一个SqlSessionFactory实例只对应一种环境。
通过sqlSessionFactoryBuilder.build(Reader reader, String id)方法,传入环境id即可构
建应用此环境参数的SqlSessionFactory。
①创建SqlSession:
SqlSession session = sqlSessionFactory.openSession();
//该SqlSession默认非自动提交事务。也可使用以下重载的方法:
SqlSession openSession(boolean autoCommit)
② 获取Mapper实例
UserMapper um = session.getMapper(UserMapper.class);
Mapper映射xml文件
文档类型声明:
<!DOCTYPE mapper PUBLIC
"-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
• 示例:
<mapper namespace="com...UserMapper">
<select id="" parameterType="_int" resultType="UserInfo">
<![CDATA[SELECT ID,NAME FROM USERINFO WHERE ID=#{id}]]>
</select>
……
</mapper>
注:
namespace属性值为映射器接口的完整类名;
SQL语句中的占位符使用#{}
(1)<select>元素
该元素中放置select查询语句,该元素的属性:
id --语句id,对应映射器接口中的方法名
parameterType --参数类型
resultType --结果类型
resultMap --结果映射
注: parameterType 和resultType 属性取值为自定义类的完整限定名或MyBatis预定义
别名。 MyBatis预定义别名如下:
image.png
【示例2】产品信息列表页面。
ProductMapper接口中的方法:
List<ProductInfo> getProductList();
注:
1,方法返回值类型为List或Set类型,MyBatis均会自动识别。<select>元素的
resultType属性设置List中的元素类型;
2,可在<select>元素中使用resultMap属性,通过重用<ResultMap>可减少编
码量;也可解决Bean中的属性名为数据库保留字的情况;
3、resultMap属性和resultType属性不能同时存在。
【示例3】使用<sql>定义可重用的sql片段
<sql id=“id">
select ... from ...
</sql>
使用:
<select>
<include refid=“id"></include>
...
</select>
【示例4】使用typeAliases元素设置类别名
可以在XML映射文件中使用别名取代类的全限定名。例:
<typeAliases>
<typeAlias alias="User" type="com … User" />
</typeAliases>
(2)<insert>元素
该元素中放置insert语句。
无需使用resultType属性,默认返回整数,代表该语句影响的记录条数;
【示例5】添加新产品
ProductMapper接口中的方法:
int saveInfo(ProductInfo info);
执行insert语句时,如果某些属性值可能为null,此时需要声明该属性对应
列的jdbcType。
如下:
insert into userInfo(id,name,age,birthday) values(
#{id},
#{name},
#{age},
#{birthday,jdbcType=DATE}
)
jdbcType属性指明该null参数对应的列类型为DATE类型。
jdbcType属性可取org.apache.ibatis.type.JdbcType的枚举值:
TINYINT; SMALLINT; INTEGER;
FLOAT; REAL; DOUBLE; NUMERIC; DECIMAL;
CHAR; VARCHAR; LONGVARCHAR;
DATE; TIMESTAMP;
BLOB; CLOB;
BOOLEAN;
NCHAR; NVARCHAR
主键列的值若是借助序列生成,同时程序中还要使用刚生成的主键值,则需使用
<selectKey>子句。如下:
<insert id="" parameterType=“">
<selectKey keyProperty=“" resultType="" order="BEFORE">
select SEQ_disp.NEXTVAL from DUAL
</selectKey>
insert into ......
</insert>
如果主键列是自增类型(auto_increment),则<insert>中使用如下属性:
useGeneratedKeys=“true” keyProperty=“someId”