入门
1.创建maven项目(此处略去)
2.在pom.xml文件中导入mybatis依赖
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.7</version>
</dependency>
3.在resource目录下创建配置文件mybatis-config.xml
XML 配置文件中包含了对 MyBatis 系统的核心设置,包括获取数据库连接实例的数据(DataSource)以及决定事务作用域和控制方式的事务管理器(TransactionManager)。后面会再探讨 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>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="com.mysql.cj.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/xskc?serverTimezone=GMT"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
</dataSource>
</environment>
</environments>
<mappers>
<!--指定SQL映射文件-->
<package name="com.zua.mapper"/>
</mappers>
</configuration>
当然,还有很多可以在 XML 文件中配置的选项,上面的示例仅罗列了最关键的部分。 注意 XML 头部的声明,它用来验证 XML 文档的正确性。environment 元素体中包含了事务管理和连接池的配置。mappers 元素则包含了一组映射器(mapper),这些映射器的 XML 映射文件包含了 SQL 代码和映射定义信息。
自此,MyBatis环境搭建就完成了。
下面将在MyBatis环境下实现一个入门程序来演示MyBatis框架的使用,该程序要求实现根据id查询用户信息的操作。
1.数据准备
在数据库中创建user表,并在user表中插入两条数据,具体SQL语句如下:
create table user(
id int primary key auto_increment,
user_name varchar(20) not null,
user_age int not null
);
insert into user(id,user_name,user_age) values(null,'张三',20),(null,'李四',18);
2.创建JavaBean实体类
package com.zua.pojo;
public class User {
private Integer id;
private String userName;
private Integer userAge;
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 Integer getUserAge() {
return userAge;
}
public void setUserAge(Integer userAge) {
this.userAge = userAge;
}
}
3.在resource目录下创建映射文件UserMapper.xml
该文件主要用于配置SQL语句和Java对象之间的映射,使SQL语句查询出来的数据能够被封装成Java对象。一个项目中可以有多个映射文件,每个实体类都可以有对应的映射文件。映射文件通常使用实体类名+Mapper命名。例如,User实体类的映射文件名就为UserMapper.xml。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">
<!--
namespace:指定dao接口的完整类名,mybatis会依据这个接口动态创建一个实现类去实现这个接口,
而这个类时一个Mapper对象
id:查询语句的唯一标识,即接口中的方法名
parameterType:传入参数的类型
resultType:返回实体类对象
-->
<mapper namespace="com.zua.mapper.UserMapper">
<select id="findById" parameterType="int" resultType="com.zua.pojo.User">
select * from user where id = #{id}
</select>
</mapper>
4.修改mybatis-config.xml配置文件
在mybatis-config.xml配置文件中增加以下代码:
<mappers>
<!--指定SQL映射文件-->
<mapper resource="com/zua/mapper/UserMapper.xml"/>
</mappers>
5.编写测试类
package com.zua.test;
import com.zua.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 java.io.IOException;
import java.io.InputStream;
public class MyBatisTest2 {
public static void main(String[] args) throws IOException {
//从 XML 中构建 SqlSessionFactory
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
//获取SqlSession对象,用于执行sql语句
SqlSession sqlSession = sqlSessionFactory.openSession();
//如果查询的结果是实体类的集合,可调用sqlSession对象的selectList()方法
User user = sqlSession.selectOne("findById",1);
System.out.println(user.getUserName());
sqlSession.close();
}
}
运行上述代码后,发现运行结果为:
下面给出原因:
在数据库中,字段的命名为:
字段的命名都是以下划线为分割,而在JavaBean中,字段是驼峰命名的规则:
所以导致了查询结果为null。
解决方法
使用 resultMap标签
在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.zua.mapper.UserMapper">
<resultMap id="userResultMap" type="com.zua.pojo.User">
<result column="user_name" property="userName"/>
<result column="user_age" property="userAge"/>
</resultMap>
<select id="findById" parameterType="int" resultMap="userResultMap">
select * from user where id = #{id}
</select>
</mapper>
修改后运行结果: