在MyBatis学习记录(2)里,我们用以前经常使用的方式开发DAO,但是这样存在以下问题:
原始DAO存在的问题
-Dao方法体存在重复代码:每个方法都要通过SqlSessionFactory创建SqlSession:
SqlSession session = sqlSessionFactory.openSession();
- 通过session调用数据库操作方法时需要指定id,这里存在硬编码,不得于后期的开发维护:
session.insert(“com.mybatis.mapping.userMapper.insertUser”, user);
Mapper动态代理方式
Mapper接口开发方法只需要程序员编写Mapper接口(相当于Dao接口),由Mybatis框架根据接口定义创建接口的动态代理对象,代理对象的方法体同上边Dao接口实现类的方法体类似。
Mapper接口开发需要遵循以下规范:
1、 Mapper.xml文件中的namespace与mapper接口的类路径相同。
2、 Mapper接口方法名和Mapper.xml中定义的每个statement的id相同
3、 Mapper接口方法的输入参数类型和mapper.xml中定义的每个sql 的parameterType的类型相同
4、 Mapper接口方法的输出参数类型和mapper.xml中定义的每个sql的resultType的类型相同
根据以上规范:
userMapper.xml 文件的namespace要写成:namespace=”com.mybatis.mapper.UserMapper” 。
在userMapper.xml 中有如下语句:
<!-- 根据id查询得到一个user对象-->
<select id="selectUserById" parameterType="String" resultType="com.mybatis.domain.User">
SELECT * FROM t_user WHERE uid=#{id}
</select>
那么在UserMapper.java 接口里要定义如下方法:
//根据id查询用户
public User selectUserById(String uid) throws Exception;
通过对t_user表里的数据的增删改查,练习上面介绍的方法。
jar包和数据库表,实体类都和MyBatis学习记录(1)里用的一样。
工程目录如下:
userMapper.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.mybatis.mapper.UserMapper">
<!-- 根据id查询得到一个user对象-->
<select id="selectUserById" parameterType="String" resultType="com.mybatis.domain.User">
SELECT * FROM t_user WHERE uid=#{id}
</select>
<!-- 添加一个用户 -->
<insert id="insertUser" parameterType="com.mybatis.domain.User">
INSERT INTO t_user VALUES(#{uid},#{uname},#{upassword})
</insert>
<!-- 删除一个用户 -->
<delete id="deleteUserById" parameterType="String">
DELETE FROM t_user WHERE uid=#{id}
</delete>
<!-- 更新用户信息 -->
<update id="updateUser" parameterType="com.mybatis.domain.User">
UPDATE t_user SET uname=#{uname},upassword=#{upassword} WHERE uid=#{uid}
</update>
</mapper>
mybatisConfig.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC" />
<!-- 配置数据库连接信息 -->
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver" />
<property name="url" value="jdbc:mysql://localhost:3306/test" />
<property name="username" value="root" />
<property name="password" value="dongjiong" />
</dataSource>
</environment>
</environments>
<mappers>
<!-- 注册userMapper.xml文件 -->
<mapper resource="com/mybatis/mapping/userMapper.xml"/>
</mappers>
</configuration>
UserMapper.java
package com.mybatis.mapper;
import com.mybatis.domain.User;
public interface UserMapper {
//根据id查询用户
public User selectUserById(String uid) throws Exception;
//添加用户
public void insertUser(User user) throws Exception;
//删除用户
public void deleteUserById(String uid) throws Exception;
//更新用户
public void updateUser(User user) throws Exception;
}
单元测试:UserMapperTest.java
package com.mybatis.test;
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 org.junit.Before;
import org.junit.Test;
import com.mybatis.domain.User;
import com.mybatis.mapper.UserMapper;
public class UserMapperTest {
private SqlSessionFactory sqlSessionFactory;
@Before
public void setUp() throws Exception {
//mybatis的配置文件
String resource = "mybatisConfig.xml";
//得到配置文件流
InputStream is = Resources.getResourceAsStream(resource);
//创建会话工厂
sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);
}
@Test
public void testSelectUserById() throws Exception {
SqlSession session = sqlSessionFactory.openSession();
//获取mapper接口的代理对象
UserMapper userMapper = session.getMapper(UserMapper.class);
//调用代理对象方法
User user = userMapper.selectUserById("123");
System.out.println(user);
//关闭session
session.close();
}
@Test
public void testInsertUser() throws Exception {
SqlSession session = sqlSessionFactory.openSession();
//获取mapper接口的代理对象
UserMapper userMapper = session.getMapper(UserMapper.class);
User user = new User();
user.setUid("FFFF");
user.setUname("bobo");
user.setUpassword("5555");
//调用代理对象方法
userMapper.insertUser(user);
//提交事务
session.commit();
//关闭session
session.close();
}
@Test
public void testDeleteUserById() throws Exception {
SqlSession session = sqlSessionFactory.openSession();
//获取mapper接口的代理对象
UserMapper userMapper = session.getMapper(UserMapper.class);
//调用代理对象方法
userMapper.deleteUserById("FFFF");
//提交事务
session.commit();
//关闭session
session.close();
}
@Test
public void testUpdateUser() throws Exception {
SqlSession session = sqlSessionFactory.openSession();
//获取mapper接口的代理对象
UserMapper userMapper = session.getMapper(UserMapper.class);
User user = new User();
user.setUid("F567");//赋值为数据库中已经存在的user Id
user.setUname("yaoyao");
user.setUpassword("66666");
//调用代理对象方法
userMapper.updateUser(user);
//提交事务
session.commit();
//关闭session
session.close();
}
}