MyBatis中Mapper代理开发方式
一、说在前面
上文(MyBatis原始Dao开发方式)结尾处提到,原始的dao开发方式存在一些问题,为了解决掉这些问题,现在采用mapper代理方式进行开发。Mapper接口开发方法只需要程序员编写Mapper接口(相当于Dao接口),由Mybatis框架根据接口定义创建接口的动态代理对象。
Mapper接口开发需要遵循以下规范:
1、 Mapper.xml文件中的namespace与mapper接口的类路径相同。
2、 Mapper接口方法名和Mapper.xml中定义的每个statement的id相同
3、 Mapper接口方法的输入参数类型和mapper.xml中定义的每个sql 的parameterType的类型相同
4、 Mapper接口方法的输出参数类型和mapper.xml中定义的每个sql的resultType的类型相同
二、实例代码
数据库文件以及用户实体类都和上文(MyBatis原始Dao开发方式)一模一样,在此不再赘述。1、 UserMapper.java
package cn.at.mybatis.mapper;
import java.util.List;
import cn.at.mybatis.po.User;
/*
* mapper接口 , 相当于dao接口,用户管理
*/
public interface UserMapper {
//根据用户id查询用户信息
public User findUserById(int id) throws Exception;
//根据用户名称查询多条用户信息
public List<User> findUserByName(String name) throws Exception;
//添加用户
public void insertUser(User user) throws Exception;
//更加用户id删除用户
public void deleteUser(int id) throws Exception;
}
2、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">
<!-- namespace命名空间,作用就是对sql进行分类化管理,理解sql隔离
注意:使用mapper代理方法开发,namespace有特殊重要的作用
-->
<mapper namespace="cn.at.mybatis.mapper.UserMapper">
<!-- 在映射文件中配置很多sql语句 -->
<!-- 通过id查询用户表的记录 -->
<!-- 通过select来执行数据库的查询
id:标识映射文件的sql,
将sql语句封装到mappedStatement对象中,所以称之为statement的id
#{}表示一个占位符
#{id}:其中的id表示接受输入的参数,参数名称就是id,如果输入参数是简单类型,#{}中的参数名可以任意,可以是value或者其他名称
resultType:指定sql输出结果所映射的java对象类型,SELECT指定resultType表示将单条记录映射成java对象。
-->
<select id="findUserById" parameterType="int" resultType="cn.at.mybatis.po.User">
SELECT * FROM user WHERE id=#{id}
</select>
<!-- 根据用户名称模糊查询用户信息 , 可能返回多条
resultType: 指的就是单条记录所映射的java对象类型
${}:表示拼接sql串,将接受到的参数的内容不加任何修饰的拼接到sql中
使用${}拼接sql,会引起sql注入
${value}:接受输入参数的内容,如果传入的类型是简单类型,${}中只能是用value
-->
<select id="findUserByName" parameterType="String" resultType="cn.at.mybatis.po.User">
SELECT * FROM user WHERE username LIKE '%${value}%'
</select>
<!-- 添加用户 -->
<insert id="insertUser" parameterType="cn.at.mybatis.po.User">
<!-- 将插入数据的主键返回,返回到user对象中
keyProperty:将查询到的主键设置到parameterType指定对象的属性中
order:指的是SELECT LAST_INSERT_ID()的执行顺序,相对于insert来说。
resultType:指定SELECT LAST_INSERT_ID()的结果类型
-->
<selectKey keyProperty="id" order="AFTER" resultType="java.lang.Integer">
SELECT LAST_INSERT_ID()
</selectKey>
INSERT INTO user (username,birthday,sex,address) VALUES (#{username},#{birthday},#{sex},#{address})
</insert>
<!-- 删除用户
根据用户的id删除,需要输入用户的id
-->
<delete id="deleteUser" parameterType="int">
DELETE FROM user WHERE id=#{id}
</delete>
<!-- 更新用户信息
parameterType指定user对象,包括id和更新的信息,id必须存在
-->
<update id="updateUser" parameterType="cn.at.mybatis.po.User">
UPDATE user SET username=#{username},birthday=#{birthday},sex=#{sex},address=#{address} WHERE id=#{id}
</update>
</mapper>
3、SqlMapConfig.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>
<!-- 和spring整合后 environments配置将废除-->
<environments default="development">
<environment id="development">
<!-- 使用jdbc事务管理-->
<transactionManager type="JDBC" />
<!-- 数据库连接池-->
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver" />
<property name="url" value="jdbc:mysql://localhost:3306/mybatis?characterEncoding=utf-8" />
<property name="username" value="root" />
<property name="password" value="111111" />
</dataSource>
</environment>
</environments>
<!-- 加载映射文件 -->
<mappers>
<mapper resource="sqlmap/User.xml"/>
<!-- 在这里别忘记加载映射文件了 -->
<mapper resource="mapper/UserMapper.xml"/>
</mappers>
</configuration>
4、UserMapperTest.java测试类
package cn.at.mybatis.mapper;
import static org.junit.Assert.*;
import java.io.InputStream;
import java.util.List;
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 cn.at.mybatis.po.User;
public class UserMapperTest {
private SqlSessionFactory sqlSessionFactory;
//此方法是在执行testFindUserById之前执行
@Before
public void setUp() throws Exception {
//创建sqlSessionFactory
//读取配置文件
String resource = "SqlMapConfig.xml";
//得到配置文件流
InputStream inputStream = Resources.getResourceAsStream(resource);
//创建会话工厂
sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
}
//Mapper代理方式通过id进行查询
@Test
public void testFindUserById() throws Exception {
SqlSession sqlSession = sqlSessionFactory.openSession();
//创建UserMapper对象,mybatis自动生成代理对象
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
//调用UserMapper的方法
User user = userMapper.findUserById(29);
System.out.println("Mapper代理方式通过id进行查询====》"+user);
}
//Mapper代理方式通过用户名称进行查询
@Test
public void testFindUserByName() throws Exception {
SqlSession sqlSession = sqlSessionFactory.openSession();
//创建UserMapper对象,mybatis自动生成代理对象
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
//调用UserMapper的方法
List<User> list = userMapper.findUserByName("小明");
System.out.println("Mapper代理方式通过用户名称进行查询====》"+list);
}
}
5、测试结果
DEBUG [main] - Logging initialized using 'class org.apache.ibatis.logging.slf4j.Slf4jImpl' adapter.
DEBUG [main] - PooledDataSource forcefully closed/removed all connections.
DEBUG [main] - PooledDataSource forcefully closed/removed all connections.
DEBUG [main] - PooledDataSource forcefully closed/removed all connections.
DEBUG [main] - PooledDataSource forcefully closed/removed all connections.
DEBUG [main] - Opening JDBC Connection
DEBUG [main] - Created connection 161733249.
DEBUG [main] - Setting autocommit to false on JDBC Connection [com.mysql.jdbc.JDBC4Connection@9a3da81]
DEBUG [main] - ==> Preparing: SELECT * FROM user WHERE username LIKE '%luoyepiaoxue%'
DEBUG [main] - ==> Parameters:
DEBUG [main] - <== Total: 2
Mapper代理方式通过用户名称进行查询====》[User [id=26, username=luoyepiaoxue2014, sex=null, birthday=Fri Sep 01 00:00:00 CST 2017, address=安徽], User [id=29, username=luoyepiaoxue, sex=男, birthday=Sun Sep 17 00:00:00 CST 2017, address=北京市]]
By luoyepiaoxue2014
微博地址: http://weibo.com/luoyepiaoxue2014 点击打开链接