MyBatis框架实现简单的增删改查
一、MyBatis架构
1、MyBatis配置
两大配置文件:核心配置文件SqlMapConfig.xml;映射配置文件Mapper.xml
SqlMapConfig.xml,此文件作为mybatis的全局配置文件,配置了mybatis的运行环境等信息。
mapper.xml文件即sql映射文件,文件中配置了操作数据库的sql语句。此文件需要在
SqlMapConfig.xml中加载。
- 通过mybatis环境等配置信息构造SqlSessionFactory即会话工厂
- 由会话工厂创建sqlSession即会话,操作数据库需要通过sqlSession进行。
- mybatis底层自定义了Executor执行器接口操作数据库,Executor接口有两个实现,一个是基本执行器、一个是
缓存执行器。 - Mapped Statement也是mybatis一个底层封装对象,它包装了mybatis配置信息及sql映射信息等。
mapper.xml文件中一个sql对应一个Mapped Statement对象,sql的id即是Mapped statement的id。 - Mapped Statement对sql执行输入参数进行定义,包括HashMap、基本类型、pojo,Executor通过Mapped
Statement在执行sql前将输入的java对象映射至sql中,输入参数映射就是jdbc编程中对preparedStatement设
置参数。 - Mapped Statement对sql执行输出结果进行定义,包括HashMap、基本类型、pojo,Executor通过Mapped
Statement在执行sql后将输出结果映射至java对象中,输出结果映射过程相当于jdbc编程中对结果的解析处理过程。
二、MyBatis配置文件
1、核心配置文件sqlMapConfig.xml
<?xml version="1.0" encoding="UTF-8"?> <settings>
<!-- 可以在控制台输出日志信息:sql语句和参数 -->
<setting name="logImpl" value="STDOUT_LOGGING"/>
</settings>
<!-- 2.表示类型别名 -->
<typeAliases>
<!-- 2.1每一个类型的别名 type属性表示别名对应的类型地址 alias表示起的别名-->
<typeAlias type="java.util.List" alias="list"/>
<!--<typeAlias type="com.kgc.pojo.Emp" alias="emp"/>-->
<!-- package表示包,利用包的形式进行扫描包之下的所有的类,别名就是当前类名 -->
<package name="com.k9503.pojo"/>
</typeAliases>
<!-- 分页插件 -->
<!-- <plugins>
<plugin interceptor="com.github.pagehelper.PageInterceptor"> 3.3.0版本可用 - 分页参数合理化,默认false禁用
pageNum表示当前页 pages表示尾页
true启用合理化时,如果pageNum<1会查询第一页,如果pageNum>pages会查询最后一页 false禁用合理化时,如果pageNum<1或pageNum>pages会返回空数据
<property name="reasonable" value="true"/>
</plugin>
</plugins> -->
<!-- 3.环境配置 作为连接数据库的环境 -->
<environments default="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>
<environment id="oracle">
<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>
<!-- 4. 加载映射文件 mappers表示代理模式扫描 ,目的主要是在当前配置文件中扫描到sql映射文件-->
<mappers>
<mapper resource="mapper/EmpMapper.xml"/>
<!--<package name="mapper"></package>-->
</mappers>
2、映射配置文件Mapper.xml
<?xml version="1.0" encoding="UTF-8"?> <select id="selectAll" resultType="emp">
select * from emp
</select>
<insert id="add" parameterType="emp">
insert into emp (name,age,sex) values (#{name},#{age},#{sex})
</insert>
<update id="update" parameterType="emp">
update emp set name=#{name},age=#{age} where id=#{id}
</update>
<delete id="delete" parameterType="_int">
delete from emp where id=#{id}
</delete>
3、数据库配置文件db.properties
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/k9503?zeroDateTimeBehavior=convertToNull
jdbc.username=root
jdbc.password=171009
三、MyBatis配置文件主要配置内容
properties(属性:连接数据库四大参数)
settings(全局配置参数)
typeAliases(类型别名)
typeHandlers(类型处理器)
objectFactory(对象工厂)
plugins(插件)
environments(环境集合属性对象)
environment(环境子属性对象)
transactionManager(事务管理)
dataSource(数据源)
mappers(映射器)
四、java测试类
public class AppTest {
SqlSession session=null;
@Before//执行每一个test之前都会执行该方法
public void init(){
try {
//加载核心配置文件
InputStream is = Resources.getResourceAsStream("sqlMapConfig.xml");
//创建sqlSessionFactory工厂
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
//构建工厂
SqlSessionFactory factory = builder.build(is);
//产生SQLSession对象
session= factory.openSession();
} catch (IOException e) {
e.printStackTrace();
}
}
@Test
public void selectAll() {
List<Emp> emps = session.getMapper(EmpMapper.class).selectAll();
System.out.println(emps);
}
@Test
public void add() {
Emp emp = new Emp();
emp.setName("鸿蒙");
emp.setAge(23);
emp.setSex("男");
int i = session.getMapper(EmpMapper.class).add(emp);
System.out.println(i);
}
@Test
public void update() {
Emp emp = new Emp();
emp.setName("黎明");
emp.setAge(23);
emp.setId(43);
int i = session.getMapper(EmpMapper.class).update(emp);
System.out.println(i);
}
@Test
public void delete() {
int i = session.getMapper(EmpMapper.class).delete(43);
System.out.println(i);
}
@After
public void distory(){
try{
session.commit();//正常提交
}catch (Exception e){
session.rollback();//一旦出现异常 撤销 回滚
}finally {
session.close();//关闭资源
}
}
}