Mybatis 入门
流程
- 编写配置文件(全局配置文件)创建一个SqlSessionFactory对象,其中包括数据源等相关运行环境信息
- sql映射文件:配置了每一个sql,以及查询结果的封装规则。
- 将sql映射文件注册在全局配置文件中
- 获取sqlSessionFactory,使用sqlSession工厂获取sqlSession对象由他来执行CRUD;一个sqlSession代表一次会话,用完关闭当前会话避免造成资源浪费。
环境
- mysql
- mybatis.jar
- mybatis-connector.jar
lib 方式:下载 mybatis、mybatis-connector jar 包引入 lib 即可;
maven 方式:在 pom.xml 加入一下配置
<!-- https://mvnrepository.com/artifact/org.mybatis/mybatis -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.6</version>
</dependency>
<!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>6.0.6</version>
</dependency>
实体代码:
package test;
import java.util.Date;
public class UserEntity {
private Long userId;
private String userName;
private String passWord;
private String email;
private String mobile;
private char status;
private Long createUserId;
private Date createTime;
private Long deptId;
public Long getUserId() {
return userId;
}
public void setUserId(Long userId) {
this.userId = userId;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getPassWord() {
return passWord;
}
public void setPassWord(String passWord) {
this.passWord = passWord;
}
public String getEmial() {
return email;
}
public void setEmial(String email) {
this.email = email;
}
public String getMobile() {
return mobile;
}
public void setMobile(String mobile) {
this.mobile = mobile;
}
public char getStatus() {
return status;
}
public void setStatus(char status) {
this.status = status;
}
public Long getCreateUserId() {
return createUserId;
}
public void setCreateUserId(Long createUserId) {
this.createUserId = createUserId;
}
public Date getCreateTime() {
return createTime;
}
public void setCreateTime(Date createTime) {
this.createTime = createTime;
}
public Long getDeptId() {
return deptId;
}
public void setDeptId(Long deptId) {
this.deptId = deptId;
}
@Override
public String toString() {
return "userId: "+ getUserId()
+"| userName: "+ getUserName()
+"| password: "+ getPassWord()
+"| email: "+ getEmial()
+"| mobile: "+ getMobile()
+"| status: "+ getStatus()
+"| createUserId: "+ getCreateUserId()
+"| createTime: "+ getCreateTime()
+"| deptId: "+ getDeptId();
}
}
Mybatis 全局配置文件:
<?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"></transactionManager>
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/gouma"/>
<property name="username" value="root"/>
<property name="password" value="123456"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="mapper/ActivityMapper.xml"></mapper>
</mappers>
</configuration>
Mapper 映射文件:
<?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:名称空间
id:唯一标识
resultType:返回类型
#{}:从传递的参数中取出 id 值,对应查询时传入参数
注意:
这里查询使用了别名,原因是在数据库字段与实体字段不匹配导致这些字段最后没有值;所以这里是使用别名的方式保持与实体属性名一样。
-->
<mapper namespace="mapper.ActivityMapper.xml">
<select id="selectUser" parameterType="java.lang.Long" resultType="test.UserEntity">
select user_id as userId,username,password,email,mobile,status,create_user_id as createUserId,create_time as createTime,dept_id as deptId from sys_user where user_id = #{userId}
</select>
</mapper>
SqlSession 测试类:
package test;
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 ConnectTest {
String resource = "conf/mybatis-config.xml";
public SqlSessionFactory sqlIniting() throws IOException {
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
return sqlSessionFactory;
}
public static void main(String[] args) throws IOException {
ConnectTest connect = new ConnectTest();
SqlSessionFactory sqlSessionFactory = connect.sqlIniting();
SqlSession sqlSession = sqlSessionFactory.openSession();
try {
// selectOne 第一个参数为映射sql的标签 id,这里为了避免id重复所以使用 mapper name space 加 id
// selectOne 第二个参数为查询查询的参数值(与 mapper 中的 #{userId} 相对应)
UserEntity userEntity = sqlSession.selectOne("mapper.ActivityMapper.xml.selectUser", new Long("1"));
System.out.println(" sqlSession --> "+ sqlSession);
System.out.println(" userEntity --> "+ userEntity.toString());
}catch (Exception e){
e.printStackTrace();
}finally {
// 无论 CRUD 操作是否执行成功,都要关闭 sqlSession;避免造成资源浪费。
sqlSession.close();
}
}
}
接口式编程:
相比以上的方法,接口式做了以下修改;如图:
sql映射文件中 namespace 改为 UserMapper 接口的全类名,这样的做法让映射文件与接口形成了绑定;sql id也与UserMapper接口中方法名一样。
由于映射文件以及映射文件中的SQL片段与 UserMapper 接口、UserMapper 接口的方法都形成了一个绑定关系;所以想要执行某个sql,只需通过 sqlSession getMapper 的方法获取 UserMapper 的实现(不需要程序自己实现),用 UserMapper 的实现对象调用对应 sql 的方法由 Mapper 代理去执行。