MyBatis Day02(20210926)

A.封装持久层

一.原始dao方法
1.创建config代码文件夹
  • 全局配置文件(SqlMapConfig.xml)
  • 日志文件(log4j.properties)
  • 映射文件(DeptMapper.xml)

( 详细代码参考day01)

在这里插入图片描述

2.准备javabean文件

在这里插入图片描述

3.编写dao层接口

在这里插入图片描述

public interface DeptDao {
	
	//通过deptno查找dept部门信息
	Dept findDeptById(int deptno) throws IOException;
	
	//插入一条部门记录
	void insertDept(Dept dept) throws IOException;

}
4.编写dao层实现类

在这里插入图片描述

public class DeptDaoImpl implements DeptDao {

	// 注入sqlSessionFactory
	private SqlSessionFactory sqlSessionFactory;

	public DeptDaoImpl(SqlSessionFactory sqlSessionFactory) {
		this.sqlSessionFactory = sqlSessionFactory;
	}

	@Override
	public Dept findDeptById(int deptno) throws IOException {

		// 通过工厂创建sqlSession
		SqlSession sqlSession = sqlSessionFactory.openSession();
		// 通过sqlSession操作数据库
		Dept dept = sqlSession.selectOne("test.findDeptByid", 10);
		System.out.println(dept);
		// 释放资源
		sqlSession.close();
		
		return dept;
	}

	@Override
	public void insertDept(Dept dept) throws IOException {
		// 通过工厂创建sqlSession
		SqlSession sqlSession = sqlSessionFactory.openSession();
		// 通过sqlSession操作数据库
		sqlSession.insert("test.insertDept", dept);
		// 提交事务,修改表数据时需要提交事务
		sqlSession.commit();
		// 关闭资源
		sqlSession.close();
	}

}
5.编写测试类
public class Test01 {
	
	private SqlSessionFactory sqlSessionFactory;
	
	@Before//junit注解,使该方法在test方法前执行
	public void setup() throws IOException {
		// 定义mybaties的配置文件路径
		String resource = "SqlMapConfig.xml";
		// 得到配置文件流
		InputStream inputStream = Resources.getResourceAsStream(resource);
		// 创建会话工厂,传入mybaties的配置文件流
		sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
	}
	
	@Test
	public void selectTest() throws IOException {
		// 创建dao对象
		DeptDaoImpl dao = new DeptDaoImpl(sqlSessionFactory);
		dao.findDeptById(10);
	}
	
	@Test
	public void insertTest() throws IOException {
		// 创建dao对象
		DeptDaoImpl dao = new DeptDaoImpl(sqlSessionFactory);
		
		Dept dept = new Dept();
		dept.setDname("后勤保障");
		dept.setLoc("大连");
		dao.insertDept(dept);
	}
	
}

在这里插入图片描述

二.mapper代理方式
1.创建config代码文件夹
  • 全局配置文件(SqlMapConfig.xml)
  • 日志文件(log4j.properties)
    在这里插入图片描述
2.准备javabean文件

在这里插入图片描述

3.创建xxxMapper.java接口

在这里插入图片描述

public interface DeptMapper {	
	//根据id查询部门信息
	Dept findDeptById(int deptno);
	//插入部门信息
	void insertDept(Dept dept);	
}
4.创建xxxMapper.xml映射文件

映射文件名称应与mapper接口名称一致,且处在同一个文件夹内,以便于后期优化配置。
在这里插入图片描述

  • namespace属性值xxxMapper接口全路径
  • sql语句块id属性值与xxxMapper接口中的方法名须一致;
  • sql语句块parameterType属性值与xxxMapper接口中的参数须一致;
  • sql语句块resultType属性值为xxxMapper接口中的返回值须一致;
<!-- namespace值为xxxMapper接口全路径 -->
<mapper namespace="com.neuedu.mapper.DeptMapper">
	<!-- id值与xxxMapper接口中的方法名须一致 -->
	<select id="findDeptById" parameterType="int" resultType="com.neudeu.pojo.Dept">
		select * from dept where deptno = #{deptno}
	</select>
	<insert id="insertDept" parameterType="com.neudeu.pojo.Dept">
		insert into dept(dname,loc) values(#{dname},#{loc})
	</insert>
</mapper>
5.配置全局配置文件SqlMapConfig.xml
	<mappers>
		<mapper resource="com/neuedu/mapper/DeptMapper.xml"/>
		<mapper resource="com/neuedu/mapper/EmpMapper.xml"/>	
	</mappers>
6.编写测试类
public class Test02 {
	private SqlSessionFactory sqlSessionFactory;
	
	/**
	 * 创建sql会话工厂(sqlSessionFactory)
	 * @throws IOException
	 */
	@Before //junit注解,使该方法在 @Test所注解的方法 前执行
	public void setup() throws IOException {
		// 定义mybaties的配置文件路径
		String resource = "SqlMapConfig.xml";
		// 得到配置文件流
		InputStream inputStream = Resources.getResourceAsStream(resource);
		// 创建会话工厂,传入mybaties的配置文件流
		sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
	}
	
	/**
	 * 根据deptno查找dept部门信息
	 * select * from dept where deptno = #{deptno}
	 */
	@Test
	public void findDeptById() {
		// 创建sqlsession
		SqlSession sqlSession = sqlSessionFactory.openSession();
		// 获取mapper代理对象,加载字节码文件
		DeptMapper mapper = sqlSession.getMapper(DeptMapper.class);
		// 通过代理对象调用方法
		Dept dept = mapper.findDeptById(10);//该方法就是接口中的方法
		System.out.println(dept.getDname());
		//释放资源
		sqlSession.close();
	}
	/**
	 * 向dept表中插入一条部门信息
	 * insert into dept(dname,loc) values(#{dname},#{loc})
	 */
	@Test
	public void insertDeptRecord() {
		// 创建sqlsession
		SqlSession sqlSession = sqlSessionFactory.openSession();
		// 获取mapper代理对象,加载字节码文件
		DeptMapper mapper = sqlSession.getMapper(DeptMapper.class);
		// 通过代理对象调用方法
		Dept dept = new Dept();
		dept.setDname("安保部");
		dept.setLoc("大连");
		mapper.insertDept(dept);
		//提交事务
		sqlSession.commit();
		//释放资源
		sqlSession.close();
	}
}

B.MyBatis配置的优化

1.批量加载映射文件
  • 如果映射文件与mapper接口名称一致,且处在同一个文件夹内,那么就可以使用接口来批量加载映射文件;
  • 自动加载com.neuedu.mapper包下,所有与接口名称一致的映射文件;(package标签可写多个)

在这里插入图片描述
SqlMapConfig.xml

<configuration>
	<!-- 注册xml配置文件 -->
	<mappers>
		<!-- 单个加载映射文件 -->
		<!-- 
		<mapper resource="com/neuedu/mapper/DeptMapper.xml"/>
		<mapper resource="com/neuedu/mapper/EmpMapper.xml"/>
		 -->
		<!-- 批量加载映射文件 -->
		<package name="com.neuedu.mapper"/>
	</mappers>
</configuration>	
2.批量定义类别名
  • 逐一定义类别名:typeAlias type=“xxx” alias=“xxx”;
  • 批量定义类别名:package name=“xxx”
    定义的别名就是类名,首字母默认小写
    也可以通过注解的方式在实体类中设置指定别名;
    在这里插入图片描述

SqlMapConfig.xml

<configuration>
	<typeAliases>
		<!-- 方式一:逐一定义类别名 -->
		<typeAlias type="com.neudeu.pojo.Dept" alias="Dept"/> 
		
		<!-- 方式二:批量定义类别名
			定义的别名就是类名,而且首字母大写小写均可(默认使用小写) 
			也可以通过注解的方式在实体类中设置指定别名
		-->
		<package name="com.neudeu.pojo"/>
	</typeAliases>
</configuration>

DeptMapper.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.neuedu.mapper.DeptMapper">
	<select id="findDeptById" parameterType="int" resultType="Dept">
		select * from dept where deptno = #{deptno}
	</select>
	<insert id="insertDept" parameterType="Dept">
		insert into dept(dname,loc) values(#{dname},#{loc})
	</insert>
</mapper>

批量定义类别名之注解指定别名

@Alias("deptNewName")
public class Dept{}
3.数据库配置优化

在这里插入图片描述
db.properties

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

SqlMapConfig.xml

<configuration>
	<!-- 加载数据库配置文件 -->
	<properties resource="db.properties"></properties>
	
	<!-- 配置数据源相关属性和事务 -->
	<environments default="mysql">
        <!-- 配置mysql的环境-->
        <environment id="mysql">
            <!-- 配置事务 -->
            <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>
</configuration>
4.优化后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>

	<!-- 加载数据库配置文件 -->
	<properties resource="db.properties"></properties>
	
	<!-- 定义类别名,由于映射文件中关联的类别名过长,可以通过定义类别名的方式优化 -->
	<typeAliases>	
		<!-- 批量定义类别名 -->
		<package name="com.neudeu.pojo"/>
	</typeAliases>
	
	<!-- 配置数据源相关属性和事务 -->
    <environments default="mysql">
        <!-- 配置mysql的环境-->
        <environment id="mysql">
            <!-- 配置事务 -->
            <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>
    
    <!-- 配置映射文件的位置 -->
	<mappers>
		<!-- 批量加载映射文件 -->
		<package name="com.neuedu.mapper"/>
	</mappers>
	
</configuration>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值