概要
提示: Mybatis使用细节: 1、将数据源抽取到外部配置文件中(减少硬编码) 2、类型名别名配置 3、开启Mybatis日期功能 4、配置模板
Mybatis三种开发模式:
1、接口+映射文件
2、映射文件+SqlSession提供的API方法使用(了解)
3、接口+注解
整体架构流程
整体架构
方式一(接口+映射文件)
(接口与配置文件动态绑定。mybatis会为接口自动创建代理对象)
(注意:1.需要将namespace中的值,写成接口的全路径 2.接口方法名称跟标签id一致)
(使用接口式优点,有明确的返回值,更严格的类型检查。将规范与实现分离,可以使用不同的持久层技术,方便开发扩展以及维护。)
UserMapper.java
import com.jw.pojo.User;
import org.apache.ibatis.annotations.Select;
import java.util.List;
public interface UserMapper {
List<User> selectAll();
}
User.java
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {
private Integer id;
private String username;
private String password;
}
UserMapper.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.jw.mapper.UserMapper">
<select id="selectAll" resultType="com.jw.pojo.User">
select * from tb_user
</select>
</mapper>
db.properties
driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/java2307?useUnicode=true&characterEncoding=utf-8
username=root
password=root
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">
<configuration>
<!--引入外部的配置文件-->
<properties resource="db.properties"></properties>
<!-- mybatis的环境配置。(多环境配置) default:执行使用哪个环境 -->
<environments default="development">
<!-- 数据源环境的唯一标识 -->
<environment id="development">
<!-- mybatis的事务管理,默认使用JDBC的事务管理(未来使用Spring的事务管理) -->
<transactionManager type="JDBC"/>
<!-- dataSource:数据源配置 POOLED:默认使用mybatis的数据源(未来使用druid数据源) -->
<dataSource type="POOLED">
<!--driver:驱动类-->
<property name="driver" value="${driver}"/>
<!--url:协议+数据库地址-->
<property name="url" value="${url}"/>
<property name="username" value="${username}"/>
<property name="password" value="${password}"/>
</dataSource>
</environment>
</environments>
<!-- 加载映射文件 -->
<!-- 映射文件可以有多个,可以使用package标签进行批量加载 -->
<mappers>
<!--如果使用xml配置文件的方式,那么需要去关联映射文件-->
<mapper resource="com/jw/mapper/UserMapper.xml"></mapper>
</mappers>
</configuration>
TestMybatis.java
import com.jw.mapper.UserMapper;
import com.jw.pojo.User;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Test;
import java.io.IOException;
import java.util.List;
public class TestMybatis {
@Test
public void test02() throws IOException {
final SqlSessionFactoryBuilder sfb = new SqlSessionFactoryBuilder();
final SqlSessionFactory sf = sfb.build(Resources.getResourceAsStream("mybatis-config.xml"));
final SqlSession sqlSession = sf.openSession();
final UserMapper mapper = sqlSession.getMapper(UserMapper.class);
List<User> userList = mapper.selectAll();
userList.forEach(System.out::println);
}
}
方式一结果
方式二(映射文件+SqlSession提供的API方法使用)
(接口与配置文件动态绑定。mybatis会为接口自动创建代理对象)
(注意:1.需要将namespace中的值,写成接口的全路径 2.接口方法名称跟标签id一致)
(使用接口式优点,有明确的返回值,更严格的类型检查。将规范与实现分离,可以使用不同的持久层技术,方便开发扩展以及维护。)
UserMapper.java
import com.jw.pojo.User;
import org.apache.ibatis.annotations.Select;
import java.util.List;
public interface UserMapper {
List<User> selectAll();
}
User.java
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {
private Integer id;
private String username;
private String password;
}
UserMapper.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="UserMapper">
<!--id:唯一标识 要与方法名对应
resultType:返回值类型 (单一类型)
-->
<select id="selectAll" resultType="com.jw.pojo.User">
select * from tb_user
</select>
</mapper>
db.properties
driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/java2307?useUnicode=true&characterEncoding=utf-8
username=root
password=root
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">
<configuration>
<!--引入外部的配置文件-->
<properties resource="db.properties"></properties>
<!-- mybatis的环境配置。(多环境配置) default:执行使用哪个环境 -->
<environments default="development">
<!-- 数据源环境的唯一标识 -->
<environment id="development">
<!-- mybatis的事务管理,默认使用JDBC的事务管理(未来使用Spring的事务管理) -->
<transactionManager type="JDBC"/>
<!-- dataSource:数据源配置 POOLED:默认使用mybatis的数据源(未来使用druid数据源) -->
<dataSource type="POOLED">
<!--driver:驱动类-->
<property name="driver" value="${driver}"/>
<!--url:协议+数据库地址-->
<property name="url" value="${url}"/>
<property name="username" value="${username}"/>
<property name="password" value="${password}"/>
</dataSource>
</environment>
</environments>
<!-- 加载映射文件 -->
<!-- 映射文件可以有多个,可以使用package标签进行批量加载 -->
<mappers>
<!--如果使用xml配置文件的方式,那么需要去关联映射文件-->
<mapper resource="com/jw/mapper/UserMapper.xml"></mapper>
</mappers>
</configuration>
TestMybatis.java
import com.jw.mapper.UserMapper;
import com.jw.pojo.User;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Test;
import java.io.IOException;
import java.util.List;
public class TestMybatis {
@Test
public void test01() throws IOException {
final SqlSessionFactoryBuilder sfb = new SqlSessionFactoryBuilder();
final SqlSessionFactory sf = sfb.build(Resources.getResourceAsStream("mybatis-config.xml"));
final SqlSession sqlSession = sf.openSession();
//通过Mybatis中的SqlSession提供的API方法
final List<User> userList = sqlSession.selectList("UserMapper.selectAll");
userList.forEach(System.out::println);
}
}
方式二结果
方式三(接口+注解)
(接口与配置文件动态绑定。mybatis会为接口自动创建代理对象)
(注意:1.需要将namespace中的值,写成接口的全路径 2.接口方法名称跟标签id一致)
(使用接口式优点,有明确的返回值,更严格的类型检查。将规范与实现分离,可以使用不同的持久层技术,方便开发扩展以及维护。)
UserMapper.java
import com.jw.pojo.User;
import org.apache.ibatis.annotations.Select;
import java.util.List;
public interface UserMapper {
@Select("select * from tb_user")
List<User> selectAll();
}
User.java
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {
private Integer id;
private String username;
private String password;
}
UserMapper.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.jw.mapper.UserMapper">
<!-- <select id="selectAll" resultType="com.jw.pojo.User">-->
<!-- select * from tb_user-->
<!-- </select>-->
</mapper>
db.properties
driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/java2307?useUnicode=true&characterEncoding=utf-8
username=root
password=root
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">
<configuration>
<!--引入外部的配置文件-->
<properties resource="db.properties"></properties>
<!-- mybatis的环境配置。(多环境配置) default:执行使用哪个环境 -->
<environments default="development">
<!-- 数据源环境的唯一标识 -->
<environment id="development">
<!-- mybatis的事务管理,默认使用JDBC的事务管理(未来使用Spring的事务管理) -->
<transactionManager type="JDBC"/>
<!-- dataSource:数据源配置 POOLED:默认使用mybatis的数据源(未来使用druid数据源) -->
<dataSource type="POOLED">
<!--driver:驱动类-->
<property name="driver" value="${driver}"/>
<!--url:协议+数据库地址-->
<property name="url" value="${url}"/>
<property name="username" value="${username}"/>
<property name="password" value="${password}"/>
</dataSource>
</environment>
</environments>
<!-- 加载映射文件 -->
<!-- 映射文件可以有多个,可以使用package标签进行批量加载 -->
<mappers>
<!--如果使用注解的方式,那么需要关联Mapper接口-->
<mapper class="com.jw.mapper.UserMapper"></mapper>
</mappers>
</configuration>
TestMybatis.java
import com.jw.mapper.UserMapper;
import com.jw.pojo.User;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Test;
import java.io.IOException;
import java.util.List;
public class TestMybatis {
@Test
public void test02() throws IOException {
final SqlSessionFactoryBuilder sfb = new SqlSessionFactoryBuilder();
final SqlSessionFactory sf = sfb.build(Resources.getResourceAsStream("mybatis-config.xml"));
final SqlSession sqlSession = sf.openSession();
final UserMapper mapper = sqlSession.getMapper(UserMapper.class);
List<User> userList = mapper.selectAll();
userList.forEach(System.out::println);
}
}
方式三结果
注意:注解使用后不能再在映射Mapper.xml文件内使用重复定义SQL语句
否则会出现以下错误,导致两文件内容冲突
提示:出现错误
错误翻译:org.apache.ibatis.builder.BuilderException:解析SQL Mapper配置时出现的错误。原因:java.lang.IllegalArgumentException:映射的语句集合已经包含com.jw.mapper.UserMapper.selectAll的值。请查看com/jw/mapper/UserMapper.xml和com/jw/mapper/UserMapper.java(最佳猜测)。
小 结
关注mybatis-config文件的 配置
<!-- 加载映射文件 -->
<!-- 映射文件可以有多个,可以使用package标签进行批量加载 -->
<mappers>
<!--如果使用xml配置文件的方式,那么需要去关联映射文件-->
<!-- <mapper resource="com/jw/mapper/UserMapper.xml"></mapper>-->
<!--如果使用注解的方式,那么需要关联Mapper接口-->
<mapper class="com.jw.mapper.UserMapper"></mapper>
<!--如果mapper两个包同名配置下,可以不使用注解-->
<!-- <package name="com.jw.mapper"/>-->
</mappers>
mybatis-config.xml配置文件注意事项
1. 使用 xml 配置文件的方式,需要在 <mappers> 标签中添加 <mapper resource="com/jw/mapper/UserMapper.xml"></mapper> 标签。
2. 使用注解的方式,需要在 <mappers> 标签中添加 <mapper class="com.jw.mapper.UserMapper"></mapper> 标签。
3. 如果 mapper 两个包同名配置下,可以不使用注解,只需要在 <mappers> 标签中添加 <package name="com.jw.mapper"/> 标签。
4. 在 <mappers> 标签中,只能使用一种方式关联映射文件或 Mapper 接口。
5. 如果使用 xml 配置文件的方式,需要在 <mapper resource="com/jw/mapper/UserMapper.xml"></mapper> 标签中指定映射文件的路径。
6. 如果使用注解的方式,需要在 <mapper class="com.jw.mapper.UserMapper"></mapper> 标签中指定 Mapper 接口的类名。
7. 如果 mapper 两个包同名配置下,需要在 <package name="com.jw.mapper"/> 标签中指定 mapper 包的名称。
8. 在 <mappers> 标签中,不能同时使用 <mapper resource="com/jw/mapper/UserMapper.xml"></mapper> 标签和 <mapper class="com.jw.mapper.UserMapper"></mapper> 标签。
9. 在 <mappers> 标签中,不能同时使用 <mapper resource="com/jw/mapper/UserMapper.xml"></mapper> 标签和 <package name="com.jw.mapper"/> 标签。
10. 在 <mappers> 标签中,不能同时使用 <mapper class="com.jw.mapper.UserMapper"></mapper> 标签和 <package name="com.jw.mapper"/> 标签。