MyBatis的接口式编程Demo

时间:2023-03-08 20:04:25
MyBatis的接口式编程Demo

  

很久没细看过MyBatis了,时间一长就容易忘记。

下面是一个接口式编程的例子。

这里的例子一共分为4步:

1 首先要有一个namespace为接口的全类名的映射文件,该例中是 IMyUser.xml
2 然后在mybatis的容器(就是总的配置文件)里的mappers标签内
引入第1步中的映射文件,这里是 IMyUser.xml
3 通过SqlSession对象的getMapper(IMyUserDao.class)
获取一个接口的代理对象
4 调用代理对象的具体方法,也就是对应着 IMyUser.xml中的各个select,insert
等标签,这些标签的id属性同时必须与接口中的方法名一一对应

所需要的数据库表:

 -- Create table
create table MYUSER
(
id NUMBER not null,
username VARCHAR2(32) not null,
password VARCHAR2(128) not null,
administrator VARCHAR2(5) not null
); insert into myuser (ID, USERNAME, PASSWORD, ADMINISTRATOR)
values ('', 'weiyongle01', 'hr', 'hr'); insert into myuser (ID, USERNAME, PASSWORD, ADMINISTRATOR)
values ('', 'weiyongle352', 'hr', 'hr'); insert into myuser (ID, USERNAME, PASSWORD, ADMINISTRATOR)
values ('', 'weiyongle353', 'hr', 'hr'); insert into myuser (ID, USERNAME, PASSWORD, ADMINISTRATOR)
values ('', '', 'hr', 'hr'); insert into myuser (ID, USERNAME, PASSWORD, ADMINISTRATOR)
values ('', 'weiyongle355', 'hr', 'hr'); insert into myuser (ID, USERNAME, PASSWORD, ADMINISTRATOR)
values ('', 'weiyongle359', 'hr', 'hr'); insert into myuser (ID, USERNAME, PASSWORD, ADMINISTRATOR)
values ('', 'weiyongle360', 'hr', 'wyl'); insert into myuser (ID, USERNAME, PASSWORD, ADMINISTRATOR)
values ('', 'weiyongle361', 'hr', 'hr'); insert into myuser (ID, USERNAME, PASSWORD, ADMINISTRATOR)
values ('', 'weiyongle362', 'hr', 'hr'); insert into myuser (ID, USERNAME, PASSWORD, ADMINISTRATOR)
values ('', 'weiyongle363', 'hr', 'hr'); insert into myuser (ID, USERNAME, PASSWORD, ADMINISTRATOR)
values ('', 'weiyongle364', 'hr', 'hr'); insert into myuser (ID, USERNAME, PASSWORD, ADMINISTRATOR)
values ('', 'weiyongle365', 'hr', 'hr'); insert into myuser (ID, USERNAME, PASSWORD, ADMINISTRATOR)
values ('', 'weiyongle359', 'hr', 'hr');

1 MyBatis配置文件,Configuration.xml

 <?xml version="1.0" encoding="UTF-8" ?>
<!-- Copyright 2009-2016 the original author or authors. Licensed under the
Apache License, Version 2.0 (the "License"); you may not use this file except
in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software distributed
under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES
OR CONDITIONS OF ANY KIND, either express or implied. See the License for
the specific language governing permissions and limitations under the License. -->
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd"> <configuration>
<settings>
<setting name="useGeneratedKeys" value="false" />
<setting name="useColumnLabel" value="true" />
</settings> <!-- <typeAliases> <typeAlias alias="UserAlias" type="org.apache.ibatis.submitted.complex_property.User"/>
</typeAliases> --> <environments default="development">
<environment id="development">
<transactionManager type="JDBC">
<property name="" value="" />
</transactionManager>
<dataSource type="UNPOOLED">
<!-- Oracle数据库配置 -->
<property name="driver" value="oracle.jdbc.driver.OracleDriver" />
<property name="url" value="jdbc:oracle:thin:@localhost:1521:orcl2" />
<property name="username" value="hr" />
<property name="password" value="hr" />
</dataSource>
</environment>
</environments> <!-- 配置的实体类 20161106添加 -->
<mappers>
<!-- <mapper resource="org/apache/ibatis/submitted/complex_property/User.xml" /> -->
<!-- 这个路径是从src下开始的,即以src作为根目录的,
这点和Resources.getResourcesAsStream("xx")里的xx一样,都是指向的具体文件的路径
,都是以src为根目录 -->
<mapper resource="com/test/mybatis/config/MyUser.xml" />
<!-- 接口式编程 -->
<!-- <mapper class="com.test.mybatis.dao.interf.IMyUserDao"/> -->
<mapper resource="com/test/mybatis/config/IMyUser.xml" />
</mappers> </configuration>

2 IMyUser.xml

 <?xml version="1.0" encoding="UTF-8"?>
<!-- Copyright 2009-2016 the original author or authors. Licensed under the
Apache License, Version 2.0 (the "License"); you may not use this file except
in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software distributed
under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES
OR CONDITIONS OF ANY KIND, either express or implied. See the License for
the specific language governing permissions and limitations under the License. -->
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!-- MyBatis接口式编程 -->
<!-- 这里的namespace一定要是接口的全类名,这样就能够保证该mapper的唯一性 -->
<mapper namespace="com.test.mybatis.dao.interf.IMyUserDao">
<!-- select标签里的id属性值 getUser 对应着 上面namespace里的方法,
实际上就是接口里定义的方法 -->
<select id="getUser" resultType="com.test.mybatis.entity.MyUser" parameterType="int">
select * from MyUser where id = #{id}
</select>
<!-- select标签里的id属性值 getUserbyUser 对应着 上面namespace里的方法,
实际上就是接口里定义的方法 -->
<select id="getUserbyUser" parameterType="com.test.mybatis.entity.MyUser" resultType="com.test.mybatis.entity.MyUser" >
select * from MyUser
where 1=1
<!-- if 标签里的 test的属性值 username实际上是指的是
parameterType的属性值 com.test.mybatis.entity.MyUser
这个类里的一个成员属性,用于getter和setter方法,
不是之前理解的对应于数据库里的字段,还有username !=''
一定要写上,如果不写的话那么这个String类型的username成员变量
就会被MyBatis框架默认为"",从而可能会影响这里配置的slq的逻辑,
从而查询出来的结果可能会与我们自己设想中的不一样 -->
<if test="username != null and username !='' ">
AND username = #{username}
</if>
<if test="administrator != null and username !='' ">
AND administrator = #{administrator}
</if>
</select> <delete id="deleteUser" parameterType="String">
delete from MyUser where id = #{id}
</delete>
</mapper>

3.IMyUserDao.java

 package com.test.mybatis.dao.interf;

 import com.test.mybatis.entity.MyUser;

 /**
* MyBatis接口式编程Demo
* @author Wei
* @time 2017年3月23日 下午1:26:21
*/
public interface IMyUserDao {
public MyUser getUser(int id);
public MyUser getUserbyUser(MyUser user);
public void deleteUser(String username);
}

4. IMyUserTest.java

 package com.test.mybatis.dao.interf;

 import java.io.IOException;
import java.io.InputStream; import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import com.test.mybatis.entity.MyUser; /**
* 接口式编程的测试类
* @author Wei
* @time 2017年3月23日 下午2:26:22
*/
public class IMyUserTest { public IMyUserTest() {
// TODO Auto-generated constructor stub
} public static void main(String[] args) {
InputStream is = null;
SqlSessionFactory factory = null;
SqlSession sqlsession = null;
try {
is = Resources.getResourceAsStream("com/test/mybatis/config/Configuration.xml");
factory = new SqlSessionFactoryBuilder().build(is);
sqlsession = factory.openSession();
/**
* 获取接口,实际上是通过代理模式来获取的代理对象
* 1 首先要有一个namespace为接口的全类名的映射文件,该例中是 IMyUser.xml
* 2 然后在mybatis的容器(就是总的配置文件)里的mappers标签内
* 引入第1步中的映射文件,这里是 IMyUser.xml
* 3 通过SqlSession对象的getMapper(IMyUserDao.class)
* 获取一个接口的代理对象
* 4 调用代理对象的具体方法,也就是对应着 IMyUser.xml中的各个select,insert
* 等标签,这些标签的id属性同时必须与接口中的方法名一一对应
*/
IMyUserDao dao = sqlsession.getMapper(IMyUserDao.class);
MyUser user = new MyUser();
user.setUsername("weiyongle363");
// user.setAdministrator("wyl");
//调用接口的方法
user = dao.getUserbyUser(user);//正常
// user = dao.getUser(361);//正常运行
// user = dao.getUser(355);
// MyUser user = sqlsession.selectOne("com.test.mybatis.dao.interf.IMyUserDao.getUser",1);
if(user!=null){
System.out.println(user.toString());
}else{
System.out.println("没有查询到结果");
} } catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}

执行结果:

MyBatis的接口式编程Demo