javaEE Mybatis,mapper接口动态代理的方式避免重复代码

Mybatis的Jar包下载:https://pan.baidu.com/s/16P-MGgn53e1EtCL6wQ9VWA  密码:1azq

用传统Dao层实现类的方式开发,Dao层实现类需要注入SqlSessionFactory,并在各个方法中重复创建SqlSession。

mapper接口动态代理的方式避免重复创建SqlSession的问题。(mapper接口其实就是Dao层接口(动态代理自动创建Dao层实现类),接口需要遵循四个原则)

UserMapper.java(遵循四个原则的Dao层接口):

package com.xxx.mybatis.mapper;

import com.xxx.mybatis.pojo.User;

//其实就是Dao层接口
public interface UserMapper {
	
	//遵循四个原则:
	//UserMapper.xml中配置的命名空间要与该接口的全类名保持一致(com.xxx.mybatis.mapper.UserMapper) 
	//接口中的方法名  == UserMapper.xml中配置的sql语句的id名
	//返回值类型  与  UserMapper.xml文件中配置的返回值类型(resultType)要一致
	//方法的输入参数类型 与UserMapper.xml中配置的输入参数的类型(parameterType)要一致
	public User findUserById(Integer id); //根据返回值类型决定调用selectOne()还是selectList()方法
	
}

 Test.java(测试类):

package com.xxx.mybatis.junit;

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.Test;

import com.xxx.mybatis.mapper.UserMapper;
import com.xxx.mybatis.pojo.User;

public class Test {
	
	@Test
	public void testMapper() throws Exception {
		//加载核心配置文件
		String resource = "sqlMapConfig.xml";
		InputStream in = Resources.getResourceAsStream(resource);
		//创建SqlSessionFactory
		SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(in);
		//创建SqlSession
		SqlSession sqlSession = sqlSessionFactory.openSession();
		
		//SqlSession会根据接口自动生成这个接口的实现类 (接口必须遵循那四个原则) (动态代理)。  多次调用接口中的方法,上面创建SqlSession的代码只用写一次。避免重复代码。
		UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
		
		User user = userMapper.findUserById(10);  //根据生成的实现类,调用接口中的方法。
		System.out.println(user);
	}
	
}

UserMapper.xml(实体类的Sql映射文件,配置原生SQL语句):

<?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">

<!-- 配置原生Sql语句   -->
<mapper namespace="com.xxx.mybatis.mapper.UserMapper">  <!-- 命名空间namespace一般设置为Dao层接口全类名"com.xxx.mybatis.mapper.UserMapper" -->

	<!-- 通过ID查询一个用户。resultType:数据库中表的字段要和User实体类中的属性保持对应(如果不对应可以使用resultMap标签配置映射关系) -->
	<select id="findUserById" parameterType="Integer" resultType="User">   <!-- 可以在sqlMapConfig.xml配置文件中配置"com.xxx.mybatis.pojo.User"类型的别名为User --> 
		select * from user where id = #{v}
	</select>
	
	<!-- 根据用户名称模糊查询用户列表 -->
	<!-- 
		#{}表示占位符             '%#{v}%' ==> '%'五'%'  (String类型会自动带引号)
		${}表示字符串拼接(不能防SQL注入)  '%${value}%' ==> '%五%'   ${value}中只能填value。   "%"#{haha}"%"可以防SQL注入
	 -->
	<select id="findUserByUsername" parameterType="String" resultType="com.xxx.mybatis.pojo.User">
		select * from user where username like "%"#{haha}"%"
	</select>
	
	<!-- 添加用户 -->
	<insert id="insertUser" parameterType="com.xxx.mybatis.pojo.User">
		<!-- 插入成功后,将生成的主键id注入到user对象中。 keyProperty的"id"要和User实体类中的属性保持一致 -->
		<selectKey keyProperty="id" resultType="Integer" order="AFTER"> <!-- MySql中的自增主键用AFTER(先插入,后生成主键)。UUID用BEFORE -->
			select LAST_INSERT_ID()
		</selectKey>
		insert into user (username,birthday,address,sex) 
		values (#{username},#{birthday},#{address},#{sex})
		<!-- #{username}中的"username"要和User实体类中的属性名保持对应。 (OGNL表达式) -->
	</insert>
	
	<!-- 更新 -->
	<update id="updateUserById" parameterType="com.xxx.mybatis.pojo.User">
		update user 
		set username = #{username},sex = #{sex},birthday = #{birthday},address = #{address}
		where id = #{id}
	</update>
	
	<!-- 删除 -->
	<delete id="deleteUserById" parameterType="Integer">
		delete from user where id = #{vvvvv}
	</delete>

</mapper>

src/sqlMapConfig.xml(Mybatis的核心配置文件):

<?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>

	<properties resource="jdbc.properties"/>
	
	<!-- 为类型配置别名 -->
	<typeAliases>
		<!-- <typeAlias type="com.xxx.mybatis.pojo.User" alias="User"/> -->
		<!-- 该包及其子包下的所有类都会自动取简单类名为别名,且别名首字母大小写都可以 -->
		<package name="com.xxx.mybatis.pojo"/>
	</typeAliases>
	
	<!-- 连接数据库的参数配置。和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:mysql://localhost:3306/mybatis?characterEncoding=utf-8" />
				<property name="username" value="root" />
				<property name="password" value="123" />
			</dataSource>
		</environment>
	</environments>
	
	<!-- 加载外部实体类的Sql映射文件 -->
	<mappers>
		<!-- 使用resource配置Sql映射文件,xml映射文件的名字和位置比较灵活 -->
		<mapper resource="sqlmap/User.xml" />  <!-- resource和class和url只能配置其中一个 -->
		<!-- <mapper class="com.xxx.mybatis.pojo.User" /> -->  <!-- 使用class定位User.xml的位置。必须满足User.xml的名字和位置与User类相同 -->  
		<!-- <mapper url="c://User.xml" /> -->   <!-- 根据绝对路径定位User.xml的位置,不推荐 -->
		<package name="com.xxx.mybatis.mapper" />  <!-- 该包下的所有类对应的xml映射文件都会包含进来(推荐)。必须满足该包下的xml文件的名字和位置与对应类相同 -->
	</mappers>
	
</configuration>

src/ jdbc.properties:

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

猜你喜欢

转载自blog.csdn.net/houyanhua1/article/details/82763857