MyBatis全局配置文件_junit_映射文件

MyBatis流程图
在这里插入图片描述
一、传统的JDBC编程过程
加载驱动、获取connection、创建Statement预编译对象、编写sql语句、占位符设值、执行sql,并返回结果、对sql结果进行解析、释放资源。
存在的问题:
      加载驱动、获取connection、释放资源等过程过于频繁,影响性能而且造成资源的浪费。
      Statement对象的sql设置参数、sql语句存在硬编码问题,造成代码不易维护。
      对结果集的封装也存在硬编码问题。
二、mybatis框架
mybatis是apache的一个开源项目GitHub;
是一个优秀的持久化层框架。相当于架构中Dao层,对JDBC的操作过程进行了封装,是的开发者只需关注sql本身,而不需要去处理,例如:加载驱动、获取链接、创建Statement对象、结果集封装、资源释放等过程。

三、mybatis的架构
**.xml全局配置文件,配置了mybatis的运行环境信息。
配置了映射文件:–>编写sql语句 文件格式*Mapper.xml
SqlSessionFactory:会话工厂。通过全局配置文件加载生成。功能:创建会话,SqlSession
SqlSession:会话。作用:操作数据库中的一些增删改查。是一个接口。
Executor执行器:SqlSession通过执行器进行的操作数据库。
mappedStatement:底层封装对象。作用:对数据库的操作过程进行封装,包括sql语句、输入参数、输出结果;
输入参数的类型:java基本类型、自定义的pojo对象、hashMap
输出结果的类型:Java基本类型,自定义的pojo对象,hashMap

配置全局文件

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

	<!-- 
		配置的运行环境 default:默认要加载的环境
		当mybatis与spring整合后,以下配置将废除不需要了
	 -->
	<environments default="mysql">
		<environment id="mysql">
			<!-- 事务管理的配置 -->
			<transactionManager type="JDBC"></transactionManager>
			<!-- 数据库链接池 -->
			<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>

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


这里数据库连接池参数采用的是引用的方式,放置以后频繁修改参数造成不必要的错误
引用的方式

<!-- 读取资源文件 -->
<properties resource="db.properties"></properties>

<!-- ----------------------------------数据的配置文件--------------------------------------------- -->
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://127.0.0.1:3306/db_user?characterEncoding=utf-8
jdbc.username=root
jdbc.password=123456

配置映射文件
对数据库中标的增删改查语句都将在映射文件编写

<?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="UserMapper">
	
</mapper>

查询数据库中的数据
两种方式
id:用于标识映射文件的sql , 为statement的id, 唯一的,不能重复
parameterType:输入参数的类型 支持的类型:java基础类型、pojo对象、hashMap
#{}:给占位符设置值 接收参数里的参数信息
当参数类型为基本类型时,#{}里的参数任意或者是#{value}
resultType:结果集类型 支持的类型:java基础类型、pojo对象、hashMap,指的是单条记录的类型

<!-- 根据id查询用户信息 -->
<select id="selectById" parameterType="int" resultType="com.hpe.pojo.User" >
	SELECT * FROM user WHERE id = #{id}
</select>

第二种
${}:字符串拼接,没有使用占位符,不安全,有sql注入的风险
如果参数类型为基本类型则${}里面参数只能是${value} 建议不要使用此方式。
模糊查询时可以在java代码中直接使用%%模糊查询的符号作为参数传过去即可

<!-- 根据姓名模糊查询 -->
<select id="selectByName" parameterType="String" resultType="User" >
	SELECT * FROM user WHERE username LIKE <!-- #{value} --> '%${value}%'
</select>

添加
参数类型为自定义的pojo对象时,取值方式#{属性}
keyProperty=“id” useGeneratedKeys=“true” 获取新增数据的id

<!-- 新增用户 -->
<insert id="addUser" parameterType="User" keyProperty="id" useGeneratedKeys="true">
	INSERT INTO user (username,birthday,sex,address) VALUES  
	(#{username},#{birthday},#{sex},#{address})
</insert>

修改

<!-- 修改用户 -->
<update id="updateUser" parameterType="User" >
	UPDATE user SET username=#{username},address=#{address} WHERE id=#{id}
</update>

删除

<!-- 删除用户 -->
<delete id="deleteUser" parameterType="int">
	DELETE FROM user WHERE id = #{id}
</delete>

四、mybatis的核心对象
SqlSessionFactory:会话工厂
      由全局配置文件加载,作用创建会话。
      特点:一旦创建了会话工厂的实例,那么在应用程序的执行期都会存在。我们应该把会话工程设计为单一的实例,单例模式。
SqlSession:会话
      由会话工厂创建,作用:创建会话
      特点:SqlSession、Servlet都是线程不安全的。调用同一个会话时就会有可能出现问题。
      解决方法:把会话声明成方法内部的局部变量。
五、全局配置文件的一些配置问题
别名的设置
给单个对象起别名 type:给谁起的别名,alias:别名

<typeAliases>
	<!-- 给单个对象起别名  type:给谁起别名  alias:别名 -->
	 <typeAlias type="com.hpe.pojo.User" alias="user"/> 
	
</typeAliases>

批量起别名 name:给哪个包下的类起别名 ,采用的是扫描的方式;别名:类名(首字母大小写都可以)

    <!-- 批量起别名 name:给哪个包下的类起别名   扫描的方式 
    			别名:类名(首字母大小写都可以)
   	-->
   <package name="com.hpe.pojo" />	

Junit测试类
使用junit’测试类需要导入junit-4.9.jar包
现在编写一个测试方法

@Test
public void testSelectById() throws IOException{
	// 1.加载mybatis的全局配置文件 io流的形式
	InputStream in = Resources.getResourceAsStream("mybatis.xml");
	// 2.获取会话工厂
	SqlSessionFactory ssf = new SqlSessionFactoryBuilder().build(in);
	// 3.获取会话   通过会话工厂创建,读取的全局配置文件获取的
	sqlSession = ssf.openSession();
	// 4.调用会话的方法进行查询
	// statement:预处理对象-->查询需要执行的sql语句  -->命名空间+id
	// paramter:参数
	User user = sqlSession.selectOne("UserMapper.selectById", 1);
	System.err.println(user);
	sqlSession.close();
}

注意:使用junit测试类方法前必须添加@Test注解符号。
这样每次编写代码时都会编写重复的代码,我们可以将重复的代码提取出来实现代码的共用。
如:

// 因为需要在方法中使用会话,所以将SqlSession声明为成员变量
SqlSession sqlSession  = null;
// @Test之前执行
@Before
public void before() throws IOException{
	// 1.加载mybatis的全局配置文件 io流的形式
	InputStream in = Resources.getResourceAsStream("mybatis.xml");
	// 2.获取会话工厂
	SqlSessionFactory ssf = new SqlSessionFactoryBuilder().build(in);
	// 3.获取会话   通过会话工厂创建,读取的全局配置文件获取的
	sqlSession = ssf.openSession();
}
// 根据姓名模糊查询
@Test
public void selectByName(){
	
	// 调用会话的方法进行查询
	List<User> selectByNameList = 
			sqlSession.selectList("UserMapper.selectByName", "三");
	System.err.println(selectByNameList);
}
// @Test之后执行
@After
public void after(){
	sqlSession.close();
}

注意:不要忘记方法前的注解。
还可以将重复的地方写成一个工具类,在以后再次使用时直接该工具类赋值项目的文件目录下即可。
如:

private static SqlSessionFactory ssf = null;
	
// 静态代码块,只加载一次
static{
	try {
		// 1.加载mybatis的全局配置文件 io流的形式
		InputStream in = Resources.getResourceAsStream("mybatis.xml");
		// 2.获取会话工厂
		ssf = new SqlSessionFactoryBuilder().build(in);
	} catch (IOException e) {
		e.printStackTrace();
	}
	
}
/**
* 
 * 方法描述:获取到会话工厂
 * @return
 */
public static SqlSessionFactory getFactory() {
	return ssf;
}

// 在测试类中的使用
@Test
public void test3() {
	// 获取会话
	SqlSession sqlSession = SqlSessionFactoryUtil.getFactory().openSession();
	User user = sqlSession.selectOne("UserMapper.selectById", 1);
	System.err.println(user);
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值