mysql xml映射文件中的_Mybatis第六篇【配置文件和映射文件再解读、Mapper代理】...

原标题:Mybatis第六篇【配置文件和映射文件再解读、占位符、主键生成与获取、Mapper代理】

配置文件和映射文件再解读

映射文件

在mapper.xml文件中配置很多的sql语句,执行每个sql语句时,封装为MappedStatement对象,mapper.xml以statement为单位管理sql语句

Statement的实际位置就等于namespace+StatementId

配置文件

别名

typeAliases别名:

AAffA0nNPuCLAAAAAElFTkSuQmCC

自定义别名:

AAffA0nNPuCLAAAAAElFTkSuQmCC

Mapper加载

Mybatis解决JDBC编程的问题

1、数据库链接创建、释放频繁造成系统资源浪费从而影响系统性能,如果使用数据库链接池可解决此问题。

解决:在SqlMapConfig.xml中配置数据链接池,使用连接池管理数据库链接。

2、Sql语句写在代码中造成代码不易维护,实际应用sql变化的可能较大,sql变动需要改变java代码。

解决:将Sql语句配置在XXXXmapper.xml文件中与java代码分离。

3、向sql语句传参数麻烦,因为sql语句的where条件不一定,可能多也可能少,占位符需要和参数一一对应。

解决:Mybatis自动将java对象映射至sql语句,通过statement中的parameterType定义输入参数的类型。

4、对结果集解析麻烦,sql变化导致解析代码变化,且解析前需要遍历,如果能将数据库记录封装成pojo对象解析比较方便。

解决:Mybatis自动将sql执行结果映射至java对象,通过statement中的resultType定义输出结果的类型。

占位符

在Mybatis中,有两种占位符

{}解析传递进来的参数数据

${}对传递进来的参数原样拼接在SQL中

主键生成策略

如果我们在Hibernate中,当我们插入数据的时候,我们是可以选择是UUID策略的...

那么在Mybatis是怎么做的呢??

UUID

select uuid()

INSERT INTO USER(id,username,birthday,sex,address) VALUES(#{id},#{username},#{birthday},#{sex},#{address})

主键返回

如果我们一般插入数据的话,如果我们想要知道刚刚插入的数据的主键是多少,我们可以通过以下的方式来获取

需求:

user对象插入到数据库后,新记录的主键要通过user对象返回,通过user获取主键值。

解决思路:

通过LAST_INSERT_ID()获取刚插入记录的自增主键值,在insert语句执行后,执行select LAST_INSERT_ID()就可以获取自增主键。

mysql:

select LAST_INSERT_ID()

INSERT INTO USER(username,birthday,sex,address) VALUES(#{username},#{birthday},#{sex},#{address})

oracle:

实现思路:

先查询序列得到主键,将主键设置到user对象中,将user对象插入数据库。

select 序列.nextval() from dual

INSERT INTO USER(id,username,birthday,sex,address) VALUES( 序列.nextval(),#{username},#{birthday},#{sex},#{address})

Mapper代理方式

Mapper代理方式的意思就是:程序员只需要写dao接口,dao接口实现对象由mybatis自动生成代理对象。

经过我们上面的几篇博文,我们可以发现我们的DaoImpl是十分重复的...

1 dao的实现类中存在重复代码,整个mybatis操作的过程代码模板重复(先创建sqlsession、调用sqlsession的方法、关闭sqlsession)

2、dao的实现 类中存在硬编码,调用sqlsession方法时将statement的id硬编码。

以前的重复代码和硬编码如下:

public class StudentDao {

public void add(Student student) throws Exception {

//得到连接对象

SqlSession sqlSession = MybatisUtil.getSqlSession();

try{

//映射文件的命名空间.SQL片段的ID,就可以调用对应的映射文件中的SQL

sqlSession.insert("StudentID.add", student);

sqlSession.commit();

}catch(Exception e){

e.printStackTrace();

sqlSession.rollback();

throw e;

}finally{

MybatisUtil.closeSqlSession();

}

}

public static void main(String[] args) throws Exception {

StudentDao studentDao = new StudentDao();

Student student = new Student(3, "zhong3", 10000D);

studentDao.add(student);

}

}

Mapper开发规范

想要Mybatis帮我们自动生成Mapper代理的话,我们需要遵循以下的规范:

1、mapper.xml中namespace指定为mapper接口的全限定名

此步骤目的:通过mapper.xml和mapper.java进行关联。

2、mapper.xml中statement的id就是mapper.java中方法名

3、mapper.xml中statement的parameterType和mapper.java中方法输入参数类型一致

4、mapper.xml中statement的resultType和mapper.java中方法返回值类型一致.

再次说明:statement就是我们在mapper.xml文件中命名空间+sql指定的id

Mapper代理返回值问题

mapper接口方法返回值:

如果是返回的单个对象,返回值类型是pojo类型,生成的代理对象内部通过selectOne获取记录

如果返回值类型是集合对象,生成的代理对象内部通过selectList获取记录。

总结

在程序中调用的SQL语句是由映射文件的命令空间+sql片段的id所组成的。它内部会生成一个Statement对象的。

在使用别名的时候,可以指定包名,在使用总配置文件加载映射文件时,也可以指定包名。

主键如果需要返回的话,使用selectKey 标签即可。UUID也可以返回。在Oracle的话,是使用序列来返回自动增长的主键的。

由于之前写的DaoImpl是有非常多的硬编码的。可以使用Mapper代理的方式来简化开发

命名空间要与JavaBean的全类名相同

sql片段语句的id要与Dao接口的方法名相同

方法的参数和返回值要与SQL片段的接收参数类型和返回类型相同。

占位符有两种,一种是解析传递进来的参数数据、一种是原样输出传递进来的数据。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值