本文主要是介绍Mybatis学习笔记(4)--MyBatis的Mapper动态代理方式,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
1.开发规范
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的类型相同
2.mapper映射文件
将UserMapper.xml放在config下mapper目录下
<?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,还有一个很重要的作用,后面会讲 -->
<mapper namespace="com.skiff.www.mapper.UserMapper"><!-- id:statement的id 或者叫做sql的id --><!-- parameterType:声明输入参数的类型 --><!-- resultType:声明输出结果的类型,应该填写pojo的全路径 --><!-- #{}:输入参数的占位符,相当于jdbc的? --><select id="queryUserId" parameterType="int"resultType="com.skiff.www.domain.User">select * from user where id = #{id}</select><!-- 如果返回多个结果,mybatis会自动把返回的结果放在list容器中 --><!-- resultType的配置和返回一个结果的配置一样 --><select id="queryUserByUsername1" parameterType="string"resultType="com.skiff.www.domain.User">SELECT * FROM user WHERE username LIKE #{username}</select><!-- 如果传入的参数是简单数据类型,${}里面必须写value --><select id="queryUserByUsername2" parameterType="string"resultType="com.skiff.www.domain.User">SELECT * FROM `user` WHERE username LIKE '%${value}%'</select><!-- 插入语句中values中括号的字段和数据库中的表中的数据是一一对应的 而value后面的数据是实体的对象中对应的属性 --><!-- 保存用户 --><insert id="saveUser" parameterType="com.skiff.www.domain.User"><!-- selectKey 标签实现主键返回 --><!-- keyColumn:主键对应的表中的哪一列 --><!-- keyProperty:主键对应的pojo中的哪一个属性 --><!-- order:设置在执行insert语句前执行查询id的sql,在执行insert语句之后执行查询id的sql --><!-- resultType:设置返回的id的类型 --><selectKey keyColumn="id" keyProperty="id" order="AFTER"resultType="int">SELECT LAST_INSERT_ID()</selectKey>INSERT INTO `user`(username,birthday,sex,address) VALUES(#{name},#{birthday},#{sex},#{address})</insert><!-- 更新用户 --><update id="updateUserById" parameterType="com.skiff.www.domain.User">UPDATE `user` SETusername = #{name},address = #{address},birthday = #{birthday} WHERE id = #{id}</update><!-- 删除用户 --><delete id="deleteUserById" parameterType="int">delete from user whereid=#{id}</delete></mapper>
3.UserMapper接口文件
/** * @文件名称: UserMapper.java * @描述: TODO * @作者: 一叶扁舟(skiff)* @时间:2018年1月9日 下午3:18:05 * @版本:V1.0 */
package com.skiff.www.mapper;import java.util.List;import com.skiff.www.domain.User;/** * @类功能说明: * @作者: 一叶扁舟 (skiff)* @创建时间:2018年1月9日 下午3:18:05 * @版本:V1.0 */
public interface UserMapper {//遵循四个原则//接口 方法名 == User.xml 中 id 名//返回值类型 与 Mapper.xml文件中返回值类型要一致//方法的入参类型 与Mapper.xml中入参的类型要一致//命名空间 绑定此接口public User findUserById(Integer id);public List<User> queryUserByUsername1(String name);}
4.sqlMapConfig.xml文件中添加UserMapper.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="123456" /></dataSource></environment></environments><mappers><mapper resource="sqlmap/User.xml"/><mapper resource="sqlmap/Order.xml"/></mappers> </configuration>
5.测试
/** * @文件名称: UserMapperTest.java * @描述: TODO * @作者: 一叶扁舟(skiff)* @时间:2018年1月9日 下午6:14:34 * @版本:V1.0 */
package test.com.skiff.www.testUser;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 com.skiff.www.domain.User;
import com.skiff.www.mapper.OrderMapper;
import com.skiff.www.mapper.UserMapper;/** * @类功能说明: * @作者: 一叶扁舟 (skiff)* @创建时间:2018年1月9日 下午6:14:34 * @版本:V1.0 */
public class UserMapperTest {private SqlSessionFactory sqlSessionFactory;@Beforepublic void init() throws Exception {InputStream inputStream = Resources.getResourceAsStream("SqlMapConfig.xml");this.sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);}@Testpublic void testQueryName(){SqlSession session = this.sqlSessionFactory.openSession();UserMapper mapper = session.getMapper(UserMapper.class);List<User> users = mapper.queryUserByUsername1("无悔");for (User user2 : users) {System.out.println(user2);}}}
6.注意:
UserDao userDao = new UserDaoImpl(sqlSessionFactory);
//调用dao方法查询出结果
User user = userDao.selectUserById(31);
UserMapper mapper = session.getMapper(UserMapper.class);
List<User> users = mapper.queryUserByUsername1("无悔");
(2).原始dao开发,是dao直接操作数据库,可以在dao中编写sql语句,而是使用mapper动态代理开发时,使用mapper接口调用sql,sql都是在xxxMapper.xml文件中(注意mapper规范)。因此这两种方式都是可以直接操作数据库的,在项目实际开发中一般采用的是,controller--->service--->dao---->mapper--->sql
这篇关于Mybatis学习笔记(4)--MyBatis的Mapper动态代理方式的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!