FerryP—漫漫编程路

FerryP—漫漫编程路

开发规范

Mapper接口开发方法只需要程序员编写Mapper接口(相当于Dao接口),由Mybatis框架根据接口定义创建接口的动态代理对象,代理对象的方法体同原始Dao接口实现类方法。
Mapper接口开发需要遵循以下规范:

  • Mapper.xml文件中的namespace与mapper接口的类路径相同,即namespace必须是接口的全限定名。

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

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

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


使用mapper动态代理开发Dao案例

1)新建项目mybatis_demo02,导入所需jar包

MyBatis使用Mapper动态代理开发Dao层-LMLPHP

2)在classpath下创建log4j.properties日志配置文件、db.properties数据库配置文件以及MyBatis的核心配置文件SqlMapConfig.xml

新建源码包config
MyBatis使用Mapper动态代理开发Dao层-LMLPHP
log4j.properties内容:

# Global logging configuration
log4j.rootLogger=DEBUG, stdout
# Console output...
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n

db.properties内容:

#mysql的驱动
driver=com.mysql.jdbc.Driver
#连接地址
url=jdbc:mysql://localhost:3306/spring_jdbc02?useUnicode=true&characterEncoding=UTF-8
#连接用户名
user=root
#连接密码
password=123456
#初始化数量
initsize=5
#最大数量
maxsize=15

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>

</configuration>

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>

	<!-- db.properties配置文件 -->
	<properties resource="db.properties"/>

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

</configuration>

4)新建包com.oak.po,在其中新建User

MyBatis使用Mapper动态代理开发Dao层-LMLPHP

public class User {
	private Integer id;
	private String name;
	//方法略...	
}

5)新建一个包com.oak.mapper,新建UserMapper接口,定义方法

MyBatis使用Mapper动态代理开发Dao层-LMLPHP

public interface UserMapper {
	/**
	 * 根据id查找用户
	 * @param id
	 * @return
	 */
	User findById(int id);
	/**
	 * 根据姓名进行模糊查询
	 * @param name
	 * @return 所有满足条件的User信息
	 */
	List<User> findByName(String name);
	/**
	 * 添加一条User信息
	 * @param user
	 */
	void  add(User user);
}

6)UserMapper.xml映射文件

在config下新建一个普通包sqlmap,在其中新建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.oak.mapper.UserMapper">

	<!-- 根据id获取用户信息 -->
	<select id="findById" parameterType="int" resultType="com.oak.po.User">
		select * from `user` where id=#{id}
	</select>

	<!-- 根据名称模糊查询用户信息列表 -->
	<select id="findUserByName" parameterType="String" resultType="com.oak.po.User">
		select * from `user` where name like '${value}'
	</select>

	<!-- 添加一条信息 返回自动增长主键 -->
	<insert id="add" parameterType="com.oak.po.User">
		insert into `user` values(null,#{name})
	</insert>
</mapper>

Mapper接口开发规范(以上4条):
MyBatis使用Mapper动态代理开发Dao层-LMLPHP

7)加载UserMapper.xml映射文件

在SqlMapConfig.xml文件添加如下配置:

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

8)测试

在com.oak.test中编写写测试类UserTest:

public class UserTest {
	// 工厂对象一般在我们的系统中是单例的
	private SqlSessionFactory sqlSessionFactory=null;
	@Before
	public void init() throws IOException{
		// 第一步,创建SqlSessionFactoryBuilder对象
        SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
        // 第二步,加载配置文件
        InputStream inputStream = Resources.getResourceAsStream("SqlMapConfig.xml");
        // 第三步,创建SqlSessionFactory对象
        sqlSessionFactory = sqlSessionFactoryBuilder.build(inputStream);
	}
	@Test
	public void testFindById(){
		//第四步  得到sqlSession,与Spring整合后省略
		SqlSession sqlSession=sqlSessionFactory.openSession();
		//获得代理对象(与Spring整合后只需要通过Spring容器拿到UserMapper接口的代理对象就行了)
		UserMapper userMapper=sqlSession.getMapper(UserMapper.class);
		User user=userMapper.findById(2);
		System.out.println(user);
		sqlSession.close();
	}
}

查看结果:
MyBatis使用Mapper动态代理开发Dao层-LMLPHP


小结

selectOne和selectList

动态代理对象调用sqlSession.selectOne()和sqlSession.selectList()是根据mapper接口方法的返回值决定,如果返回list则调用selectList方法,如果返回单个对象则调用selectOne方法。

namespace

mybatis官方推荐使用mapper代理方法开发mapper接口,程序员不用编写mapper接口实现类,使用mapper代理方法时,输入参数可以使用pojo包装对象或map对象,保证dao的通用性。


MyBatis核心配置文件SqlMapConfig.xml配置内容

  • properties(属性)
  • settings(全局配置参数)
  • typeAliases(类型别名)
  • typeHandlers(类型处理器)
  • objectFactory(对象工厂)
  • plugins(插件)
  • environments(环境集合属性对象)
    • environment(环境子属性对象)
      • transactionManager(事务管理)
      • dataSource(数据源)
  • mappers(映射器)

properties

如上案例:

<!-- 配置属性 -->
<properties resource="db.properties"/>

我们也可以在properties属性中使用property子标签来定义属性:

<!-- 配置属性 -->
<properties resource="db.properties">
	 <property name="driver" value="com.mysql.jdbc.Driver"/>
</properties>

MyBatis将按照下面的顺序来加载属性为:
在properties元素体内定义的属性首先被读取
然后会读取properties元素中resource或url加载的属性,它会覆盖已读取的同名属性
也就是说,此处通过property定义的属性名driver属性会被db.properties中同名的driver属性覆盖。
我们一般使用resource的方式加载属性。


typeAliases(类型别名)

mybatis支持别名:


自定义别名

我们把上述案例中的com.oak.po.User类定义别名,以方便使用,在SqlMapConfig.xml中添加如下配置信息:

<!-- 配置User别名 -->
<typeAliases>
	<!-- 单个别名定义 -->
	<typeAlias type="com.oak.po.User" alias="user"/>
</typeAliases>

在UserMapper.xml中使用别名:

<!-- 根据id获取用户信息 别名 不区分大小写-->
<select id="findById" parameterType="int"
resultType="User">
	select * from `user` where id=#{id}
</select>

注意:resultType属性的值就是User类的别名,且别名是不区分大小写的。

给所有的po同时定义别名

可以给所有的po批量定义别名,别名就是类名且不区分大小写:

<typeAliases>
  	<!-- 批量别名定义,扫描包的形式创建别名,别名就是类名,且不区分大小写 -->
    <package name="com.oak.po"/>
</typeAliases>

SqlMapConfig.xml文件加载mapper.xml文件

Mapper(映射器)配置的几种方法:

1)使用相对于类路径的资源:< mapper resource=" " />

MyBatis使用Mapper动态代理开发Dao层-LMLPHP

2)使用mapper接口类路径:< mapper class=" " />

 <!-- 加载mapper映射文件 -->
 <mappers>
  		<mapper class="com.oak.mapper.UserMapper"/>
 </mappers>

注意:此种方法要求mapper接口名称和mapper映射文件名称相同,且放在同一个目录中。
MyBatis使用Mapper动态代理开发Dao层-LMLPHP

3)注册指定包下的所有mapper接口:< package name=""/>

<!-- 加载mapper映射文件 -->
<mappers>
	<!-- 要求与使用接口名加载配置相同 -->
	<package name="com.oak.mapper"/>
</mappers>

注意:此种方法要求mapper接口名称和mapper映射文件名称相同,且放在同一个目录中。
MyBatis使用Mapper动态代理开发Dao层-LMLPHP

虽然Mapper(映射器)配置有以上三种方法,但是实际开发中就用第三种方法。

11-16 22:07