使用MyBatis框架配置dao层服务流程

2019-10-19  本文已影响0人  黎涛note

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”
上一篇下一篇

猜你喜欢

热点阅读