【框架】Mybatis 02 架构详解

第一步:mybatis的配置文件

1、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>

	<!-- 和spring整合后 environments配置将废除-->
	<environments default="development">
		<environment id="development">
		<!-- 使用jdbc事务管理,事务控制由mybatis-->
			<transactionManager type="JDBC" />
		<!-- 数据库连接池,由mybatis管理-->
			<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>
	
</configuration>

 sqlMapConfig.xml的头信息是config.dtd。

2、配置映射文件(配置sql语句) mapper.xml

映射文件的命名:

User.xml ;如果是mapper代理开发,映射文件的名称则叫xxxmapper.xml,比如: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="test">
	<!-- 在配置文件中配置很多sql语句-->
	<!-- 通过select执行数据库的查询 。
	id:标识映射文件中的sql,称为statement的id,
	将来sql语句会封装到mapperdStatement当中。
	#{}表示一个占位符。
	parameterType:指定输入参数的类型,这里指定的int型。
	#{id}其中的id表示接受输入的参数,如果输入的是简单类型,#{}中的参数名可以任意,可以value或其他名称
	resultType:指定sql输出的结果所映射的java对象的类型,selec指定resultType表示将单条记录映射成java对象
	-->
	<select id="findUserById" parameterType="int" resultType="com.mybatis.pojo.User">
		SELECT * FROM USER WHERE id=#{id}
	</select>
</mapper>

mapper.xml文件中配置的主要内容:

1、namespace作用是对sql进行分类管理,

2、<select>标签执行数据库的数据 id标识映射文件中的sql,称为statement的id

3、parameterType指定输入参数的类型。比如这里是通过id查找用户,id是int类型,所以填的是int

4、sql语句中#{}表示一个占位符,类似于jdbc的?。#{id}其中的id表示接受输入的参数

5、resultType指定sql输出的结果映射的java对象的类型

为什么要设定resultType呢?

因为需要输出结果的对象(POJO)接收查询结果,所以接下来创建一个POJO类接收查询结果。

3、创建POJO类

【框架】Mybatis 02 架构详解

4、在SqlMapConfig.xml中加载映射文件

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

5、程序代码

mybatis必须的配置完成之后,接下来使用mybatis完成增删改查的小案例

	@Test
	public void findUserById() throws IOException{
		
		//通过工厂得到sqlSesssion
		SqlSession sqlSession = null;
		try {
			//mybatis配置文件
			String resource = "SqlMapConfig.xml";
			//得到配置文件流
			InputStream inputStream = Resources.getResourceAsStream(resource);
			//创建会话工厂,传入mybaatis的配置文件信息
			SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(inputStream);
			sqlSession = factory.openSession();
			
			//通过SqlSession操作数据库
			//第一个参数:映射文件中statement的id,等于=namespace+“.”+statement的id
			//第二个参数:指定和映射文件中所匹配的parameterType类型参数
			//sqlSession.selectOne的结果是映射文件中所匹配的resultType类型的对象
			User user = sqlSession.selectOne("test.findUserById", 1);
			
			System.out.println(user);
		} catch (Exception e) {
			e.printStackTrace();
			
		}finally{
			//释放资源
			sqlSession.close();
		}
		
	}

从以上程序可以看出,

1、先创建会话工厂SqlSessionFactory,并将配置文件信息传入会话工厂

2、通过会话工厂创建sqlSession

3、使用sqlSession操作数据库

User user = sqlSession.selectOne("test.findUserById", 1);

第一个参数:映射文件中statement的id,第一个参数的值等于=namespace+“.”+statement的id
第二个参数:指定和映射文件中所匹配的parameterType类型参数
sqlSession.selectOne的结果是映射文件中所匹配的resultType类型的对象
4、释放资源

   sqlSession.close();

 

selectOne 和 selectList的区别

selectOne 表示查询出一条记录进行映射。如果使用的是selectOne可以实现,那么使用selectList也可以实现

selectList表示查询出一个列表多条记录进行映射。如果使用selectList查询多条记录,不能使用selectOne

#{} 和${}区别

#{}表示一个占位符,#{}接收输入参数,类型可以是简单类型,pojo,hashmap

如果接收的是简单类型,#{}中可以写成value或其他

#{}接收的pojo类型,使用的是OGNL读取对象中的属性值

 

${}表示一个拼接符号,会引发sql注入,不建议使用

${}接收的是输入参数,类型也可以是简单类型,pojo,hashmap

如果接收的是简单类型,${}中只能写value

${}接收的pojo类型,使用的是OGNL读取对象中的属性值

5.1、模糊查询

	<select id="findUserByName" parameterType="java.lang.String" resultType="com.mybatis.pojo.User">
		SELECT * FROM USER WHERE username like '%${value}%'
	</select>

5.2、添加数据

	<insert id="insertUser" parameterType="com.mybatis.pojo.User">
		insert into user(username,birthday,sex,address) value (#{username},#{birthday},#{sex},#{address}) 
	</insert>

5.2.1、自增主键的返回

mysql自增主键,执行insert之前自动生成一个自增主键

通过mysql函数获取到刚插入记录的自增主键:

LAST_INSERT_ID

是insert之后调用此函数

【框架】Mybatis 02 架构详解

 使用自增主键这种方式是先执行insert语句 , 执行过语句主后键已经生成,使用LAST_INSERT_ID查询出主键,并返回到user对象,所以order设置为AFTER。

5.2.2、非自增主键返回

		<!-- 使用mysql的uuid生成主键
			执行过程:
			1、首先通过uuid生成主键,然后设置到user对象的id属性中。
			2、其次在执行insert语句时,从user对象中取出id属性值。
		 -->
		<selectKey keyProperty="id" order="BEFORE" resultType="java.lang.String">
			SELECT UUID()
		</selectKey>

使用uuid这种方式是 先生成主键,再执行insert语句,再将uuid设置到user对象的id属性中,所以order设置成"BEFORE" 。

在执行insert语句时,从user对象中取出id属性值。

通过oracle的序列生成主键:

		<selectKey keyProperty="id" order="BEFORE" resultType="java.lang.String">
			select 序列名.nextval()
		</selectKey>

6、删除数据

	<delete id="deleteUserById" parameterType="java.lang.String">
		delete from user where id=#{id}
	</delete>

 

7、更新数据

	<update id="upadteUserById" parameterType="com.mybatis.pojo.User" >
		update user set username=#{username},birthday=#{birthday},sex=#{sex},address=#{address} where id=#{id}
	</update>

 根据id更新用户 需要传入id,传入用户更新信息

parameterType指定User对象,包括id和更新信息,注意:id必须存在

#{id}从输入的user对象中获取id的属性值进行数据更新