可以查看Mybatis的官方说明文档,(文档很贴心,设有中文):https://mybatis.org/mybatis-3/zh/configuration.html
Mybatis全局配置文件
下边是一个已经配置好了的Mybatis全局配置文件: config.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">
<!-- mybaits全局配置文件的根标签:注意该配置文件使用DTD约束,标志与标志之间要注意顺序 -->
<configuration>
<!-- 属性标签:引入外部的properties文件
resource:引入类路径下的资源
url:引入网络路径 或者磁盘路径下的资源
-->
<properties resource="jdbc.properties"></properties>
<!-- settings mybatis极为重要的调整设置,它们会改变mybatis的运行时行为
里边可以设置很多的属性,参考官方文档:https://mybatis.org/mybatis-3/zh/configuration.html#settings
-->
<settings>
<!-- 开启驼峰命名法规则,例如: 数据库字段 user_id 实体类属性为 userId,可以自动进行匹配成功 -->
<setting name="mapUnderscoreToCamelCase" value="true"/>
</settings>
<!-- 类型别名 -->
<typeAliases>
<!-- type:指定要起别名的类型全类名 默认别名:类首字母小写。
alias:指定别名
-->
<typeAlias type="com.mybatis.bean.User" alias="us"/>
<!-- 批量取别名,为包下的所有类批量起别名 (默认别名是类首字母小写 )。
也可以使用注解@Alias("别名"),为该包下的具体类取别名
(mybatis已经 为 java中的基本数据类型和包装类型起了别名)
_byte byte 基本数据类型别名前面加 _ 下划线
string String 包装类型别名类首字母小写
name:指定包名-->
<package name="com.mybatis"/>
</typeAliases>
<!-- 环境配置,内部可以通过子标签 environment 配置多个环境
default: 指定数据库运行环境,可以达到快速切换的环境的效果
-->
<environments default="oracle">
<!-- mysql 环境配置 -->
<environment id="mysql"> <!-- id:当前环境的唯一标识 -->
<!-- 事务管理器 type:事务管理器的类型 (mybatis中有两种事务管理类型 JDBC/MANAGED )-->
<transactionManager type="JDBC"/>
<!-- 配置数据源 type属性:数据源类型(连接池) POOLED是mybatis自带的连接池 -->
<dataSource type="POOLED">
<property name="driver" value="${jdbc.driverClass}"/> <!-- 使用EL表达式 ${属性名} -->
<property name="url" value="${jdbc.Url}"/>
<property name="username" value="${jdbc.User}"/>
<property name="password" value="${jdbc.Password}"/>
</dataSource>
</environment>
<!-- 配置一个oracle运行环境 -->
<environment id="oracle">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="${orcl.driver}"/>
<property name="url" value="${orcl.url}"/>
<property name="username" value="${orcl.user}"/>
<property name="password" value="${orcl.password}"/>
</dataSource>
</environment>
</environments>
<!-- 数据库厂商标识 type:用于指定数据库标识-->
<databaseIdProvider type="DB_VENDOR">
<!-- 为不同的数据库厂商,起别名,
属性:value= 设置别名
可以在SQL指令中 通过databaseId属性 设置SQL适用的数据库
"-->
<property name="MySQL" value="mysql"/>
<property name="Oracle" value="oracle"/>
</databaseIdProvider>
<!-- 引入sql映射文件 -->
<mappers>
<!-- 引入指定的sql映射文件 因为该文件在类路径下(与mybatis同一路径下,直接指定文件名) -->
<mapper resource="userMapper.xml"/>
</mappers>
</configuration>
细说mybatis全局配置文件中的 <mappers> 标签
该标签用来将SQL文件映射到全局配置文件中,它有两个子标签 <mapper> 和 <package>
前者用于指定一个映射文件,后者用于批量配置(配置一个包下的所有SQL映射文件)
- <mapper>
resource 属性 : 引用类路径下的SQL文件
url 属性 : 引入网络路径 或者磁盘路径下的资源
class 属性: 引用接口全类名
使用class属性注意:
1.有映射文件,映射文件需要和接口名相同 且 SQL映射文件和 接口class文件需要在同一个路径下
2.没有映射文件,所有的SQL指令可以通过注解写在接口方法中(不推荐使用)
使用resource配置类路径下的SQL映射文件
<!-- 配置路径下的SQL文件 -->
<mapper resource="userMapper.xml"/>
还可以通过 通配符配置类路径下多个 SQL 映射文件 如: <mapper resource="*.xml"/>
使用class引用接口全类名
1.有SQL映射文件的情况下
<mapper class="com.mybatis.dao.UserMapper"/>
接口和SQL映射文件需要在同一个路径下,且同名
2.没有SQL映射文件的情况下
<mapper class="com.mybatis.dao.UserMapper"/>
DAO接口中的方法 通过mybatis提供的注解配置SQL指令
package com.mybatis.dao;
public interface UserMapper {
//通过id查询User表中信息
@Select("select * from USER where id = #{id} ")
User findUserById(Integer id);
}
- <package>
用于批量配置
name 属性: 配置包名 (SQL映射文件需要和DAO接口在同一个包下)
注意:SQL映射文件和DAO接口必须同名且在同一个包下
<Mappers>
<!-- 批量配置SQL映射文件 -->
<package name="com.mybatis.dao"/>
</Mappers>
class文件和 SQL的xml文件在同一个目录下,显得太凌乱。
可以在项目的src类路径下,创建和接口相同的包,将SQL映射文件放在该包中。
如:
com.mybatis.dao包下的java源文件 经过编译之后的calss字节码文件 也是存放在类路径下的,
其实就是和 SQL映射文件在同一个路径下
打开eclipse中的工作空间可以看到
SQL映射文件
mybatis将SQL语句全部抽取出来,全部定义在mybatis的SQL映射文件中
Mybatis全局配置文件中配置了 类型别名、数据库运行环境、数据库厂商标识别名....等!这些可以方便我们配置SQL映射文件
1首先创建一个DAO接口,定义需要操作数据库的功能
package com.mybatis.dao;
/**
* User表的 DAO接口
*/
public interface UserMapper {
/***
通过id查询User表中信息
*/
public User findUserById(Integer id);
/**
新增方法
*/
public void save(User u);
/**
更新方法
mybatis 允许 增删改 直接定义一些返回值类型
Integer Long Boolean (在Mapper映射文件对应标签中,不需要设置返回值)
Integer或Long返回的是 该SQL指令影响的行数
Boolen类型 大于0则返回true 小于0 返回false
*/
public Integer update(User u);
/**
删除方法
*/
public boolean delete(Integer id);
}
2.建立UserMapper.xml SQL映射文件 (配置sql指令,实现DAO接口中的方法)
<?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">
<!--
User的SQL映射文件
该文件配置了执行的sql语句,以及查询出来的数据封装格式
-->
<!-- namespace:名称空间(用于区别文件) 将命名空间置于合适的 Java 包命名空间之中 这样使代码更加整洁
使用User的Dao接口的包名类名,作为该xml的名称空间,使User的Dao接口与xml配置文件绑定
-->
<mapper namespace="com.mybatis.dao.UserMapper">
<!--定义sql语句 :相当于对 UserMapper接口方法的实现 -->
<!-- 属性: resultType="us" : 该属性指定结果集封装javabean类型,us是mybatis配置文件设置的别名 (表示一个类)
databaseId="mysql" : 标识该sql指令在那个数据库执行 (mysql全局配置文件设置的别名)
-->
<!-- 定义查询语句 public User findUserById(Integer id) -->
<select id="findUserById" resultType="us" databaseId="mysql"> <!-- databaseId="数据库标识" -->
select * from USER where id = #{id}
</select>
<select id="findUserById" resultType="com.mybatis.bean.User" databaseId="oracle">
select * from USER where id = #{id}
</select>
<!-- 新增员工 public void save(User u) -->
<!-- 使用 insert标签
parameType 属性: 代表参数类型 (这里的参数类型是User对象)
可以使用全类名,或者使用Mybatis配置文件中已经 配置的别名
-->
<insert id="save" parameterType="us"> <!-- 使用别名:us -->
insert into USER(name,password,money,sex) value(#{name},#{password},#{money},#{sex}) <!-- 内部就是使用User对象的get方法取值 -->
</insert>
<!-- 更新方法 public void update(User u) -->
<update id="update" parameterType="com.mybatis.bean.User">
update user set name=#{name},money=#{money} where id = #{id}
</update>
<!-- 删除 public void delete(Integer id) -->
<delete id="delete" parameterType="integer"> <!-- mybatis已经为 Java基本属类型和包装类配置了别名 -->
delete from user where id = #{id}
</delete>
</mapper>
注意:SQL映射文件需要 与 要实现的DAO接口 同名 如: DAO接口 UserMapper.java SQL映射文件: UserMapper.xml
Mybatis全局配置文件和 SQL映射文件配置好了,测试一下
@Test
public void test1() throws IOException {
String resource = "config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
/**
* openSession() 获取一个Session对象(一次与数据库的会话) 该Sission不会自动提交事务
* openSession(true) 获取Session对象,会自动提交事务
*/
SqlSession session = sqlSessionFactory.openSession();
//通过反射 动态创建 DAO接口对象
UserMapper mapper = session.getMapper(UserMapper.class);
//调用查询方法
User user = mapper.findUserById(1);
user.setName("秃头");
//调用更新
mapper.update(user);
//调用删除方法
mapper.delete(4);
//事务提交
session.commit();
session.close();
}