搭建MaBatis
一、下载及创建maven工程
-
环境搭建详见maven笔记 -
下载MyBatis MyBatis官网 -
引入的依赖
<packaging>jar</packaging>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.37</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.7</version>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
</dependencies>
二、创建MaBatis的核心配置文件
-
MyBatis核心配置文件中,标签的顺序: properties?,settings?,typeAliases?,typeHandlers?, objectFactory?,objectWrapperFactory?,reflectorFactory?, plugins?,environments?,databaseIdProvider?,mappers? -
properties 用于引入properties文件 -
typeAlias:设置某个类型的别名 因为查询功能中,需要返回结果集,故要设置resultType=实体类的全类名,而一个工程中会有大量的查询,所以用全类名设置所有的resultType会很麻烦,所以可以通过typeAlias标签设置实体类全类名的别名 type:设置需要设置别名的类型 alias:设置某个类型的别名,若不设置该属性,则该类型拥有默认的别名(即类名),且不区分大小写 方式一:对指定实体类设置别名
<typeAlias type="com.atguigu.mybatis.pojo.User"></typeAlias>
方式二:以包为单位,将包下所有的类型设置默认的类型别名,即类名且不区分大小写
<package name="com.atguigu.mybatis.pojo"/>
-
environments:配置多个连接数据库的环境 属性:default,设置默认使用的环境的id,因为一个工程只是用一个数据库连接 -
子标签:environment -
子标签:transactionManager:设置事务管理方式 type=“JDBC|MANAGED” JDBC:表示当前环境中,执行SQL时,使用的是JDBC中原生的事务管理方式,事务的提交或回滚需要手动处理 MANAGED:被管理,例如Spring -
子标签:dataSource:配置数据源 type:设置数据源的类型,type=“POOLED|UNPOOLED|JNDI” POOLED:表示使用数据库连接池缓存数据库连接 UNPOOLED:表示不使用数据库连接池 JNDI:表示使用上下文中的数据源 -
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="jdbc.properties" />
<typeAliases>
<package name="com.atguigu.mybatis.pojo"/>
</typeAliases>
<environments default="development">
<environment id="development">
<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="test">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:13306/mybatis"/>
<property name="username" value="root"/>
<property name="password" value="7989775nx"/>
</dataSource>
</environment>
</environments>
<mappers>
<package name="com.atguigu.mybatis.mapper"/>
</mappers>
</configuration>
-
引入映射文件 是指映射文件resources文件下的路径 <mappers>
<package name="com.atguigu.mybatis.mapper"/>
</mappers>
-
配置properties 因为一个工程中可能会有多个properties文件,故需要再每个键前加上一个标识,如:jdbc.driver jdbc.properties jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:13306/mybatis
jdbc.username=root
jdbc.password=123456
三、创建Mapper接口
-
作用 相当于JavaWeb工程中的dao,但不需要实现类,接口会对应映射文件进行实现 -
UserMapper.java public interface UserMapper {
int insertUser();
void updateUser();
void deleteUser();
User retrieveTest();
List<User> retrieveAllTest();
}
四、创建MaBatis映射文件
-
ORM:Object Relationship Mapping , 对象映射关系 Object:java实体类对象 Relationship:关系型数据库 Mapping:二者之间的对应关系
Java概念 | 数据库概念 |
---|
类 | 表 | 属性 | 字段/列 | 对象 | 记录/行 |
-
映射文件的命名规则 表所对应 的实体类的类名 加上 Mapper.xml后缀:类如UserMapper.xml -
创建的位置 src/main/resources/mappers目录下 -
作用 用于编写SQL语句,故Mapper接口不需要写实现类 -
保证两个一致,以实现面向接口操作数据 mapper接口的全类名和映射文件的mapper标签的命名空间namespace保持一致 mapper接口中的方法名与映射文件中SQL标签的id保持一致 -
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.atguigu.mybatis.mapper.UserMapper">
<insert id="insertUser">
insert into t_user values(null,'张三','123',23,'女',"zhangsan@qq.com")
</insert>
<update id="updateUser">
update t_user set username = "李四" where id = 4
</update>
<delete id="deleteUser">
delete from t_user where id >4
</delete>
<select id="retrieveTest" resultType="com.atguigu.mybatis.pojo.User">
select * from t_user where id = 4
</select>
<select id="retrieveAllTest" resultType="com.atguigu.mybatis.pojo.User">
select * from t_user
</select>
</mapper>
五、通过Junit测试
-
测试程序 public class UserTest {
@Test
public void userTest() throws IOException {
InputStream mybatisConfigStream = Resources.getResourceAsStream("mybatis-config.xml");
SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
SqlSessionFactory build = sqlSessionFactoryBuilder.build(mybatisConfigStream);
SqlSession sqlSession = build.openSession(true);
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
int result = mapper.insertUser();
mapper.updateUser();
mapper.deleteUser();
User user = mapper.retrieveTest();
System.out.println("user = " + user);
List<User> userList = mapper.retrieveAllTest();
userList.forEach(user -> System.out.println(user));
}
}
六、加入log4j日志功能
-
创建log4j.xml <?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">
<appender name="STDOUT" class="org.apache.log4j.ConsoleAppender">
<param name="Encoding" value="UTF-8" />
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%-5p %d{MM-dd HH:mm:ss,SSS}
%m (%F:%L) \n" />
</layout>
</appender>
<logger name="java.sql">
<level value="debug" />
</logger>
<logger name="org.apache.ibatis">
<level value="info" />
</logger>
<root>
<level value="debug" />
<appender-ref ref="STDOUT" />
</root>
</log4j:configuration>
-
日志的级别 FATAL(致命) > ERROR(错误) > WARN (警告) > INFO(信息) > DEBUG(调试) ? 从左到右的内容越来越详细
七、设置模板
-
设置mybatis-config.xml模板
错误总结
-
java文件所在的文件夹目录写错,和映射所对应的文件路径对不上 atguigu写成了arguigu -
电脑装了两个版本的MySQL MySQL5.7 的端口号是:13306 MySQL8.0 的端口号是:3306 -
空格 mapper标签中的namespace的值后面,不能有任何空格,否则就会报错 // 错误示例
<mapper namespace="com.atguigu.mybatis.mapper.ParamMapper ">
// 正确示例
<mapper namespace="com.atguigu.mybatis.mapper.ParamMapper">
|