目录
什么是mybatis
[百度百科]。
我个人的理解就是:这个框架的出现减少了我们在传统持久层的注册驱动、获得数据库连接、设置SQL语句、获得SQL对象、执行SQL语句到数据库、获得结果集、处理结果集、关闭数据库连接相关对象的繁杂步骤。让我们只需要在实际开发中专注于SQL语句,从而起到了提升开发效率的作用
本文开始:
- 本文系统环境:windows10 NT(1809)
- jdk环境:jdk8(默认) 、jdk11
- mybatis 描述版本:3.5.1
- 测试文末代码的基本jar包包括:mysql-connector-java-8.0.16.jar、mybatis-3.5.1.jar、junit-4.10.jar
理解要点:
编程中有个概念——不要重复写一样的代码。因为编程的工作应该更加专注于对业务的实现,而那些重复性的工作应尽量减少,重复性的写代码不仅浪费时间,而且没有意义(这也就是通常程序员自黑说的搬砖,搬砖并不能提升技能,只能固化思维)。所以这些具有重复开发部分的都应该被封装成一个方法、一个类或一个框架。
所以这里mybatis框架,就是为了解决开发过程中,一些对数据操作的持久层重复性工作做了一个封装。所以,从入门角度出发,mybatis执行过程:
- 编写配置文件(xml)
- mybatis读取配置文件(InputSteam)——整个项目只加载一次
- 实现配置构造器(SqlSessionFactory)——整个项目只加载一次
- 实现配置环境(SqlSessionFactory.bulid(inputSteam))——整个项目只需要加载一次,可重复使用
- 给出SQL会话(SqlSessionFactory.openSqlSession())——数据库操作基础
- SQL会话给出数据库操作代理类(SqlSession.getMapper(Dao.class))
- dao层方法执行方法([dao.insert,dao.select,dao.updata,dao.delete])
- SQL会话执行代理类做的操作(SqlSession.commit)
- SQL会话关闭(SqlSession.close())
其他资料:
- 书籍:java面向对象编程思想(第四版)
- 连接:博客:为什么要使用框架
正文开始
一、mybatis框架配置文件(xml)概述
1.mybatis基础配置文件结构(xml)
注:配置文件结构copy自官网
configuration(顶级标签,代表设置)
- properties(属性)
- settings(设置)
- typeAliases(类型别名)
- typeHandlers(类型处理器)
- objectFactory(对象工厂)
- plugins(插件)
- environments(环境配置)
- environment(环境变量)
- transactionManager(事务管理器)
- dataSource(数据源)
- databaseIdProvider(数据库厂商标识)
- mappers(映射器)
在xml中配置文件骨架(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">
<!--mybatis的主配置文件顶级标签-->
<configuration>
<properties resource="fileName">
<property name="key1" value="value1"/>
<property name="key2" value="value2"/>
......
</properties>
<settings>
<!--详情见官网-->
[http://www.mybatis.org/mybatis-3/zh/configuration.html#settings]
</settings>
<typeAliases>
<!--详情见官网-->
[http://www.mybatis.org/mybatis-3/zh/configuration.html#typeAliases]
</typeAliases>
<typeHandlers>
<!--详情见官网-->
[http://www.mybatis.org/mybatis-3/zh/configuration.html#typeHandlers]
</typeHandlers>
<!-- environments,这里的environment是复数,代表里面不止可以有一种配置,有个属性default代表
使用的默认配置项id,默认项必填 -->
<environments default="DeveloperConfig">
<!--配置id为 [customConfig] 的配置环境-->
<environment id="customConfig">
<!--配置事物的类型-->
<transactionManager type="[JDBC|]"/>
<!--配置数据源类型-->
<dataSource type="[unpooled|polled|jndi]">
<!--配置数据源具体参数-->
<property name="jdbcUrl" value="${key1}"/>
<property name="username" value="${key2}"/>
<property name="password" value="${keyn}"/>
......
</dataSource>
</environment>
<!--配置id为[DeveloperConfig]的配置环境-->
<environment id="DeveloperConfig">
......
</environment>
</environments>
......
......
......
<!-- 指定映射配置文件的位置,映射配置文件指的是每个dao独立的配置文件-->
<mappers>
<mapper resource="com/xxxxx/dao/xxxxDao.xml"/>
</mappers>
</configuration>
以上只是mybatis的基本配置环境,接下来才是涉及到开发者最应该熟悉文件——mapper.xml
2.mapper映射文件(xml)
配置mapper映射文件,基于基础配置文件的mappers标签中地址。因为在mybatis执行过程中涉及到读取配置文件的操作,所以,构建器会根据基础配置文件的mapper resource属性,根据其值中的文件路径查找到mapper映射文件,然后读取mapper映射文件构造dao代理类。所以配置mapper文件就等于在构建代理类的功能或模样啦。因此,在mapper文件中如何配置决定了代理类如何执行,有哪些功能,返回什么等等具有重复性质的操作。根据官网描述能节省95%代码,所以,对于一个大系统来说,这是非常具有意义的框架,有效提高了开发效率。至此,简单介绍一下mapper文件的结构
注:以下mapper.xml文件结构copy自官网
- cache – 对给定命名空间的缓存配置。
- cache-ref – 对其他命名空间缓存配置的引用。
- resultMap – 是最复杂也是最强大的元素,用来描述如何从数据库结果集中来加载对象。
parameterMap– 已被废弃!老式风格的参数映射。更好的办法是使用内联参数,此元素可能在将来被移除。文档中不会介绍此元素。- sql – 可被其他语句引用的可重用语句块。
- insert – 映射插入语句
- update – 映射更新语句
- delete – 映射删除语句
- select – 映射查询语句
那么mapper.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.xxxx.dao.xxxxDao">
<!--以下代码大都来自官网-->
<!--dao代理类的有关查询的方法-->
<select
id="selectPerson"
parameterType="com.xxxx.bean.xxx"
parameterMap="deprecated"
resultType="hashmap"
resultMap="personResultMap"
flushCache="false"
useCache="true"
timeout="10"
fetchSize="256"
statementType="PREPARED"
resultSetType="FORWARD_ONLY">
<!--查询的SQL语句-->
select * form table_name where id = #{key}
</select>
<!---dao代理类的有关插入的方法-->
<insert
id="insertAuthor"
parameterType="domain.blog.Author"
flushCache="true"
statementType="PREPARED"
keyProperty=""
keyColumn=""
useGeneratedKeys=""
timeout="20">
<!--插入的SQL语句-->
insert into tabelname values(value1,value2........);
</insert>
<!--dao代理类的有关更新的方法-->
<update
id="updateAuthor"
parameterType="domain.blog.Author"
flushCache="true"
statementType="PREPARED"
timeout="20">
<!--更新的SQL语句-->
update tabelnaem set key1=value1 , key2=value2.............
</update>
<!--dao代理类的有关删除的方法-->
<delete
id="deleteAuthor"
parameterType="domain.blog.Author"
flushCache="true"
statementType="PREPARED"
timeout="20">
<!--删除的SQL语句-->
delete tablename where key=value and .... and ....
</delete>
</mapper>
除此之外,还有不少能减少代码的标签,这里不再一一介绍,mybatis提供的功能还是很强大的!
这里值得注意的是,在mapper.xml中如果有的方法涉及到参数,例如select 标签的属性parameterType,如果提供的参数是一个对象,那么mybatis将直接提取对象中的属性,我们在使用的时候就可以用 [#{}] 的形式直接提取对象中的属性到SQL语句中。而不需要 [对象.属性] 的形式去提取数据到SQL语句中,这样子还是升了不少代码,当然,如果对象中还嵌套A着另外的对象B,此时如果还需要使用对象A中的对象B的部分属性,就需要[B.属性],看起来很复杂,但是mybatis仍然让我们省了至少[对象.]吧。
二、参考代码(非完全代码)
1.部分xml配置
1.1.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">
<!--mybatis的主配置文件-->
<configuration>
<!-- 默认配置环境 -->
<environments default="DeveloperConfig">
<!--配置id为DeveloperConfig的配置环境-->
<environment id="DeveloperConfig">
<!--配置事物的类型-->
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<!-- 配置连接数据库的4个基本信息-->
<property name="driver" value="com.mysql.cj.jdbc.Driver"/>
<property name="url"
value="jdbc:mysql://localhost:3306/dbname?useSSL=false&characterEncoding=utf-8&serverTimezone=UTC"/>
<property name="username" value="root"/>
<property name="password" value="${passworld}"/>
</dataSource>
</environment>
</environments>
<!-- 指定映射配置文件的位置,映射配置文件指的是每个dao独立的配置文件-->
<mappers>
<mapper resource="com/xxxx/dao/xxxxDao.xml"/>
</mappers>
</configuration>
1.2. mapper.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.xxxx.dao.xxxxxDao">
<!-- 插入新用户的方法-->
<insert id="insertUser" parameterType="com.xxxx.bean.User">
insert into user(`username`,`birthday`,`sex`,`address`)
values
(#{username},#{birthday},#{sex},#{address})
</insert>
<!-- 通过传入的useridx删除用户-->
<delete id="deleteById" parameterType="int">
delete from user where id =#{userid}
</delete>
<!-- 查找所有用户的方法-->
<select id="findAll" resultType="com.xxxx.bean.User">
select * from user
</select>
<!-- 通过用户id查找用户的方法-->
<select id="findById" parameterType="int" resultType="com.xxxx.bean.User">
select * from user where id=#{userid}
</select>
</mapper>
2.部分java代码
2.1 用户数据库操作接口
import com.itheima.domain.User;
import java.util.List;
/**
* 用户信息操作接口
* @Auther
*/
public interface UserDao {
/**
* 添加用户
*
* @param user
* @return
*/
int insertUser(User user);
/**
* 通过id删除用户
*
* @param userid
* @return
*/
int deleteById(int userid);
/**
*
* 查询所有方法
* @return
*/
List<User> findAll();
/**
*
* 通过id查找用户
* @param id
* @return
*/
User findById(int id);
}
2.2.实体类
import java.io.Serializable;
import java.util.Date;
/**
* 实体类
*/
public class User implements Serializable {
private Integer id;
private String username;
private Date birthday;
private String sex;
private String address;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public Date getBirthday() {
return birthday;
}
public void setBirthday(Date birthday) {
this.birthday = birthday;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
@Override
public String toString() {
return "user{" +
"id=" + id +
", username='" + username + '\'' +
", birthday=" + birthday +
", sex='" + sex + '\'' +
", address='" + address + '\'' +
'}';
}
}
2.3.测试代码
/**
* 这里只是一部分测试代码,不包含配置文件
*/
SqlSessionFactory factory;
SqlSession session;
UserDao userDao;
@Before
public void createFactroy() throws IOException {
//2.加载配置文件
InputStream in = Resources.getResourceAsStream("mybatis-config.xml");
//3~4.构建配置构建器,并给出会话工厂
factory = new SqlSessionFactoryBuilder().build(in);
//5.会话工厂给出SQL会话
session = factory.openSession();
//6.SQL会话给出代理数据库操作代理类
userDao = session.getMapper(UserDao.class);
}
@After
public void closeSession() {
//9.SQLsession会话关闭
session.close();
}
@Test
public void findUserById() {
//7.dao层执行方法
User user = userDao.findById(41);
//8.session.commit(),这里只是涉及查询,所以没有事务,略
System.out.println(user);
}