提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
一、Mybatis是什么?
用于java程序和数据库连接的 半自动、轻量级 的框架。下载地址:(整片文章基于Mybatis3.4.1)
https://Github.com/mybatis/mybatis-3/
Mybatis官方介绍文档(中文版)
https://mybatis.org/mybatis-3/zh/index.html
二、使用步骤
1.导入jar包
将jar包复制到src的lib(一般来说是没有这个文件夹的,需要自己新建)文件夹下,然后导入jar包
一个是Mybatis的jar包,一个是Mysql驱动
2.建立数据库和表
2.1 创建一个数据库名字为mybatis(可以不同但最好相同)
2.2 建立tbl_employee表,并在表中填入一条数据
3.新建包和类
如上建包即可
4.新建与数据库表对应的类
因为是员工表所以我的类名字为Employee
public class Employee {
private Integer id;
private String lastName;//这里的属性名和表中的列名不一样
private String email;
private String gender;
public Employee() {
}
public Employee(String lastName, String email, String gender) {
this.lastName = lastName;
this.email = email;
this.gender = gender;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getLastName() {
return lastName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public String getGender() {
return gender;
}
public void setGender(String gender) {
this.gender = gender;
}
@Override
public String toString() {
return "Employee{" +
"id=" + id +
", lastName='" + lastName + '\'' +
", email='" + email + '\'' +
", gender='" + gender + '\'' +
'}';
}
}
5.全局配置文件
根据官方文档的介绍全局配置文档的代码如下(在src下新建一个mybatis.xml文件) 下面的中文请改成自己的配置
全局配置文件的作用:获取数据库连接,<mapper>里面的地址先忽略,不需要进行更改
<?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>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:数据库端口号/数据库名"/>
<property name="username" value="数据库的用户名"/>
<property name="password" value="数据库的密码"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="org/mybatis/example/BlogMapper.xml"/>
</mappers>
</configuration>
6.新建SqlSessionFactory
按照文档所描述的,
每个基于 MyBatis 的应用都是以一个 SqlSessionFactory 的实例为核心的。
所以我们先建立一个。
String resource = "全局配置文件的路径";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
那么在我们知道如何建立SqlSessionFactory后,我们出现了1个问题
这段代码该写在哪里
在我们刚刚建的test包下新建一个test类
将代码写在里面,这里面的 .getResourceAsStream方法会有异常,选择throws或者try/catch都可以
7.获取SqlSession实例
该获取SqlSession实例了
SqlSession sqlSession = sqlSessionFactory.openSession();
我们发现SqlSession对象可以使用的方法有很多,几乎都是和数据库增删改查有关,下面我们选择.selectOne(),这个方法需要两个参数,第一个为执行sql语句的唯一标识符;第二个为执行sql要用的参数。
8.书写Sql映射文件
<?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.xxxxx.mybatis.bean.EmployeeMapper">
<!-- namesapce:名称空间(可以随便起)
id:唯一标识
resultType:返回值类型
#{id}:从传递过来的参数中取出id值
-->
<select id="selectEmp" resultType="com.xxxx.mybatis.bean.Employee">
select id,last_name lastName,email,gender from tbl_employee where id = #{id}
</select>
<!--
这里的sql语句我们给last_name起了一个别名为lastName和java类中的名字一样
-->
</mapper>
9.获取SqlSession的返回值,输出并关闭sqlSession
try {
Employee employee = sqlSession.selectOne("com.xxx.mybatis.bean.EmployeeMapper.selectEmp", 1);
System.out.println(employee);
} finally {
sqlSession.close();
}
10.面向接口式编程
我们在配置完后可以发现,我们可以随意往数据库中传递参数,这肯定是不可以的,所以我们将对我们所写的代码进行改进。
10.1 新建一个接口
public interface EmployeeMapper {
public Employee getEmpById(Integer id);
}
10.2 更改sql映射文件的内容
1) 将namespace改为接口的全类名
2) 将id改为接口中对应方法的名字
<mapper namespace="com.xxx.mybatis.dao.EmployeeMapper">
<!-- namesapce:名称空间; 指定为接口的全类名
id:唯一标识; 将对应的方法的方法名和id对应,保证一样
resultType:返回值类型
#{id}:从传递过来的参数中取出id值
public Employee getEmpById(Integer id);
-->
<select id="getEmpById" resultType="com.huyichuan.mybatis.bean.Employee">
select id,last_name lastName,email,gender from tbl_employee where id = #{id}
</select>
</mapper>
10.3 在test类中新建方法,代码如下
@Test
public void test01(){
SqlSession sqlSession = null;
try {
//1.获取sqlsessionfactory对象
InputStream resourceAsStream = Resources.getResourceAsStream("mybatis.xml");
SqlSessionFactory sqlsessionfactoty = new SqlSessionFactoryBuilder().build(resourceAsStream);
//2.获取sqlSession对象
sqlSession = sqlsessionfactoty.openSession();
//3.获取接口的实现类对象
//接口和xml绑定,mybatis会为接口自动创建一个代理对象,代理对象去执行增删改查方法
EmployeeMapper mapper = sqlSession.getMapper(EmployeeMapper.class);
Employee empById = mapper.getEmpById(1);
System.out.println(empById);
} catch (IOException e) {
e.printStackTrace();
}finally {
sqlSession.close();
}
}
三、进一步强化
1.全局配置文件
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
在我们写xml配置文件的时候,我们一定会先写着一段代码
其中 http://mybatis.org/dtd/mybatis-3-config.dtd为xml文档的dtd约束文件,下载之后xml文件就会有提示
1.1 properties
mybatis可以使用properties来引入外部properties配置文件的内容
resource:引入类路径下的资源
url:引入网络路径或者磁盘路径下的资源
1.2 settings
settings包含了很多重要的设置项
setting:用来设置每一个设置项
name:设置项名
value:设置项取值
mapUnderscoreToCamelCase 默认为false,可设置为true
例:数据库中的列名为last_Name 对应 lastName ,则会自动匹配
1.3 typeAliases
typeAliases:别名处理器,可以为我们的java类型起别名
别名不区分大小写,还是写全类名比较好
<typeAlias type="com.huyichuan.mybatis.bean.Employee" alias="emp"/>
typeAlias:为某个java类型起别名
type:指定要起别名的类型全类名;
什么都不写的情况下默认别名就是类名小写:employee
alias:指定新的别名
<package name="com.huyichuan.mybatis.bean"/>
package:可以为某个包下的所有类批量起别名
name:指定包名(当前包以及下面所有后代包的每一个类都起一个默认别名(类名小写))
批量起别名的情况下,也可以使用@Alias注解为某个类型指定新的别名
tips:直接写在类里,例子见如下图片
1.4 environments
environments:环境们,mybatis可以配置多种环境
default 指定使用某种环境,可以达到快速切换环境
environment:配置一个具体的环境信息;
必须有两个标签;id代表当前环境的唯一标识
1)transactionManager:事务管理器
2)type:事务管理器的类型JDBC(JdbcTransactionFactory)| MANAGED(ManagedTransactionFactory)
最终方案:Spring
自定义事务控制管理器,实现TransactionFactory接口,type指定为全类名dataSource:数据源;
type:数据源类型;
UNPOOLED(UnpooledDataSourceFactory)、
POOLED(PooledDataSourceFactory)、
JNDI(JndiDataSourceFactory)
自定义数据源:实现DataSourceFactory接口即可,type是数据源的全类名
最终方案:Spring
1.5 databaseIdProvider
databaseIdProvider:支持多数据厂商;
type="DB_WENDOR":VendorDatabaseIdProvider
作用就是得到数据库厂商的标识(驱动自带):mybatis就能根据数据库厂商标识来执行不同的sql
MySQL、Oracle、SQL Server,xxx
<databaseIdProvider type="DB_WENDOR">
<!--为不同的数据库厂商起别名-->
<property name="MySQL" value="mysql"/>
<property name="Oracle" value="oracle"/>
<property name="SQL Server" value="sqlserver"/>
<!--在sql映射文件中 数据库语句中标签中有一个属性为databaseId="xxxx"
xxxx为数据库厂商的别名,意味着在xxx数据库环境下,使用xxx语句-->
</databaseIdProvider>
sql映射文件:
<select id="getEmpById" resultType="emp" databaseId="mysql">
select * from tbl_employee where id = #{id}
</select>
1.6 mappers
将sql映射注册到全局配置中
mapper:注册一个sql映射
注册配置文件
resource:应用类路径下的sql映射文件
url:应用网络路径或者磁盘路径下的sql映射文件
注册接口
class:引用(注册)接口:
1、有sql映射文件,映射文件名必须和接口同名,并且放在与接口统一目录下;
2、没有sql映射文件,所有的sql都是利用注解写在接口上;
推荐:比较重要的、复杂的Dao接口我们来写sql映射文件
不重要的、简单的Dao接口为了开发快速可以使用注解
<mapper resource="com/xxx/mybatis/dao/mapper.xml"/>
<mapper class="com.xxx.mybatis.dao.EmployeeMapperAnnotation"/>
<!-- 批量注册,name里面写包名;
映射文件和接口放在同一个包下、同包名
-->
<package name="com.xxx.mybatis.dao"/>
在Dao接口使用注解直接写sql语句,如下图所示