2018_03_08 mybatis原始dao开发,mapper接口开发

本文详细介绍了MyBatis中Mapper接口的开发规范,包括Mapper.xml文件的命名空间与接口类路径的对应、接口方法名与statement ID的一致、参数与parameterType匹配、返回类型与resultType匹配。此外,还提到了整体工程架构,如DAO接口与实现类的定义、SqlMapConfig.xml的配置、db.properties文件的使用,以及mapper接口的三种注册方式:资源路径、类路径和包名注册。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

github代码地址:点击打开链接

Mapper动态代理方式,开发规范:

Mapper接口开发需要遵循以下规范:

1、  Mapper.xml文件中的namespace与mapper接口的类路径相同。

2、  Mapper接口方法名和Mapper.xml中定义的每个statement的id相同

3、  Mapper接口方法的输入参数类型和mapper.xml中定义的每个sql 的parameterType的类型相同

4、  Mapper接口方法的输出参数类型和mapper.xml中定义的每个sql的resultType的类型相同


整体工程架构



Mapper接口方式开发:
定义Mapper接口文件

package com.jxliu.mybatis.mapper;

import java.util.List;

import com.jxliu.mybatis.po.User;

/**
 * 用户管理mapper
 */
public interface UserMapper{
	//根据用户id查询用户信息
	public User getUserById(int id) throws Exception;
	//查询用户列表
	public List<User> getUserByName(String username) throws Exception;
	//添加用户信息
	public void insertUser(User user)throws Exception; 
}


定义Mapper.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语句的隔离,后面还有重要作用 
#{}作用就是占位符,相当于jdbc的“?”
parameterType:查询的参数类型
resultType:查询结果的数据类型,如果时候pojo应该给全路径。
-->
<!-- mapper代理的开发规则:
	1、namespace必须时候接口的全限定名
	2、Statementid必须和接口的方法名称一致
	3、接口方法的参数类型要和parameterType要一致
	4、接口方法的返回值类型要和resultType一致
 -->
<mapper namespace="com.jxliu.mybatis.mapper.UserMapper">
	<!-- 别名不区分大小写 -->
	<select id="getUserById" parameterType="int" resultType="com.jxliu.mybatis.po.User">
		SELECT * FROM `user` WHERE id=#{id};
	</select>
	
	<!-- 如果查询结果返回list, resultType设置为list中一个元素的数据类型
		${}字符串拼接指令
	-->
	<select id="getUserByName" parameterType="string" resultType="com.jxliu.mybatis.po.User">
		SELECT * FROM `user` WHERE username LIKE '%${value}%'
	</select>
	<!-- 参数时候pojo时,#{}中的名称就是pojo的属性 -->
	<insert id="insertUser" parameterType="com.jxliu.mybatis.po.User">
		<!-- keyProperty:对于pojo的主键属性 
			resultType:对应主键的数据类型
			order:是在insert语句执行之前或者之后。
			如果使用uuid做主键,应该先生成主键然后插入数据,此时应该使用Before
		-->
		<selectKey keyProperty="id" resultType="int" order="AFTER">
			SELECT LAST_INSERT_ID()
		</selectKey>
		INSERT into user (username,birthday,sex,address) 
		values (#{username}, #{birthday}, #{sex}, #{address})
	</insert>
</mapper>

在SqlMapConfig.xml文件中加载UserMapper.xml文件

  <!-- 加载映射文件 -->
  <mappers>
    <mapper resource="mapper/UserMapper.xml"/>
  </mappers>

Mapper接口方式测试

package mybatis_demo;

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 com.jxliu.mybatis.mapper.UserMapper;
import com.jxliu.mybatis.po.User;

public class UserMapperTest {
	
	private SqlSessionFactory sqlSessionFactory = null;

	@Before
	public void init() throws Exception {
		// 第一步:创建一个SQLSessionFactoryBuilder对象。
		SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
		// 第二步:加载配置文件。
		InputStream inputStream = Resources.getResourceAsStream("SqlMapConfig.xml");
		// 第三步:创建SQLSessionFactory对象
		sqlSessionFactory = sqlSessionFactoryBuilder.build(inputStream);
	}

	@Test
	public void testGetUserById() {
		//和spring整合后省略
		SqlSession sqlSession = sqlSessionFactory.openSession();
		
		//获得代理对象
		UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
		User user;
		try {
			user = userMapper.getUserById(5);
			System.out.println(user);
		} catch (Exception e) {
			e.printStackTrace();
		}
		
		//和spring整合后省略
		sqlSession.close();
	}

	@Test
	public void testGetUserByName() {
		SqlSession sqlSession = sqlSessionFactory.openSession();
		UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
		List<User> list;
		try {
			list = userMapper.getUserByName("小");
			for (User user : list) {
				System.out.println(user);
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
		
		sqlSession.close();
	}

	@Test
	public void testInsertUser() {
		fail("Not yet implemented");
	}

}

原始Dao开发


定义dao接口和实现类

package com.jxliu.mybatis.dao;

import com.jxliu.mybatis.po.User;

public interface UserDao {
	public User findUserById(int id) throws Exception;
	public void insertUser(User user) throws Exception;
}

package com.jxliu.mybatis.dao;

import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;

import com.jxliu.mybatis.po.User;

public class UserDaoImpl implements UserDao {
	private SqlSessionFactory sqlSessionFactory;
	//注入SqlSessionFactory
	public UserDaoImpl(SqlSessionFactory sqlSessionFactory){
		this.sqlSessionFactory = sqlSessionFactory;
	}

	@Override
	public User findUserById(int id) throws Exception {
		SqlSession sqlSession = sqlSessionFactory.openSession();
		User user = null;
		try {
			user = sqlSession.selectOne("findUserById",id);
		} catch (Exception e) {
			e.printStackTrace();
		}finally{
			sqlSession.close();
		}
		return user;
	}

	@Override
	public void insertUser(User user) throws Exception {
		SqlSession sqlSession = sqlSessionFactory.openSession();
		try {
			sqlSession.insert("insertUser", user);
			sqlSession.commit();
		} finally{
			sqlSession.close();
		}

	}

}


定义user.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="test">
	<select id="findUserById" parameterType="int" resultType="com.jxliu.mybatis.po.User">
		select * from User where id = #{id};
	</select>
	
	<select id="findUserByUsername" parameterType="string" resultType="com.jxliu.mybatis.po.User">
		select * from User where username like "%${value}%"
	</select>
	
	<insert id="insertUser" parameterType="com.jxliu.mybatis.po.User">
	<!-- selectKey将主键返回,需要再返回 -->
	<selectKey keyProperty="id" order="AFTER" resultType="java.lang.Integer">
		select LAST_INSERT_ID();
	</selectKey>
		insert into User(id,username,sex,birthday,address) values (#{id},#{username},#{sex},#{birthday},#{address})
	</insert>
	
	<!-- 删除用户 -->
	<delete id="deleteUserById" parameterType="int">
		delete from user where id=#{id}
	</delete>
	
	<!-- 更新用户 -->
	<update id="updateUser" parameterType="com.jxliu.mybatis.po.User">
		update user set username=#{username},birthday=#{birthday},sex=#{sex},address=#{address}
		where id=#{id}
	</update>
	
	
</mapper>


加载User.xml文件

<mappers>
	<mapper resource="sqlmap/user.xml"/>
</mappers>


测试Dao

package mybatis_demo;

import java.io.InputStream;

import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Before;
import org.junit.Test;

import com.jxliu.mybatis.dao.UserDao;
import com.jxliu.mybatis.dao.UserDaoImpl;
import com.jxliu.mybatis.po.User;

public class TestDao {
private SqlSessionFactory sqlSessionFactory;
	
	@Before
	public void init() throws Exception {
		SqlSessionFactoryBuilder sessionFactoryBuilder = new SqlSessionFactoryBuilder();
		InputStream inputStream = Resources.getResourceAsStream("SqlMapConfig.xml");
		sqlSessionFactory = sessionFactoryBuilder.build(inputStream);
	}

	@Test
	public void testGetUserById() {
		UserDao userDao = new UserDaoImpl(sqlSessionFactory);
		User user;
		try {
			user = userDao.findUserById(0);
			System.out.println(user.getUsername());
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}


两种方式相比较,大多数企业开发中使用mapper接口开发方式,因为可以省去了写dao实现类的这一步,开发效率提高了


SqlMapConfig.xml中配置的内容和顺序如下:

 

properties(属性)

settings(全局配置参数)

typeAliases(类型别名)

typeHandlers(类型处理器)

objectFactory(对象工厂)

plugins(插件)

environments(环境集合属性对象)

environment(环境子属性对象)

transactionManager(事务管理)

dataSource(数据源)

mappers(映射器)


将SqlMapConfig.xml中数据库的配置隔离开,在db.properties中维护

定义db.properties文件

jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/mybatis?characterEncoding=utf-8
jdbc.username=root
jdbc.password=123456

在SqlMapConfig.xml中添加配置

<!-- 和spring整合后 environments配置将废除-->
<environments default="development">
	<environment id="development">
	<!-- 使用jdbc事务管理-->
		<transactionManager type="JDBC" />
	<!-- 数据库连接池-->
		<dataSource type="POOLED">
			<property name="driver" value="${jdbc.driver}" />
			<property name="url" value="${jdbc.url}" />
			<property name="username" value="${jdbc.username}" />
			<property name="password" value="${jdbc.password}" />
		</dataSource>
	</environment>
</environments>

mybatis支持别名形式:

别名

映射的类型

_byte

byte

_long

long

_short

short

_int

int

_integer

int

_double

double

_float

float

_boolean

boolean

string

String

byte

Byte

long

Long

short

Short

int

Integer

integer

Integer

double

Double

float

Float

boolean

Boolean

date

Date

decimal

BigDecimal

bigdecimal

BigDecimal

map

Map


在SqlMapConfig.xml中配置以下属性可以 自定义别名

<typeAliases>
	<!-- 单个别名定义 -->
	<typeAlias alias="user" type="com.jxliu.mybatis.po.User"/>
	<!-- 批量别名定义,扫描整个包下的类,别名为类名(首字母大写或小写都可以) -->
	<package name="com.jxliu.mybatis.po"/>
	<package name="其它包"/>
</typeAliases>

Mapper的三种映射方式

1.  <mapper resource=" " />

使用相对于类路径的资源

如:<mapper resource="sqlmap/User.xml"/>


2. <mapper class=" " />

使用mapper接口类路径

如:<mapperclass="com.jxliu.mybatis.mapper.UserMapper"/>

 

注意:此种方法要求mapper接口名称和mapper映射文件名称相同,且放在同一个目录中。

3.  <package name=""/>

注册指定包下的所有mapper接口

如:<packagename="com.jxliu.mybatis.mapper"/>

注意:此种方法要求mapper接口名称和mapper映射文件名称相同,且放在同一个目录中。







评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值