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>