简介
MyBatis是一款持久层框架。MyBatis可以使用简单的XML或注解来配置和映射原生信息,将接口和Java的POJOs(Plain Old Java Objects,普通的java对象)映射成数据库中的记录。
一、
1.准备
(1)创建普通java项目即可
(2)添加依赖的jar包
mybatis-3.4.5.jar
mysql-connector-java-5.1.45-bin.jar
(3)创建数据库和表
create database mybatis;
use mybatis;
create table users(id int primary key auto_increment, name varchar(20), age int);
insert into users(name, age) values('aaaa', 9);
insert into users(name, age) values('bbbb', 8);
2.添加Mybatis的配置文件conf.xml
在src下新建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.jdbc.Driver" />
<property name="url" value="jdbc:mysql://localhost:3306/mybatis" />
<property name="username" value="root" />
<property name="password" value="xx" />
</dataSource>
</environment>
</environments>
</configuration>
3.建立domain包,在domain包下建立实体类User,User类代码如下:
package com.mybatis.domain;
public class User {
private int id;
private String name;
private int age;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String toString() {
return "User [id=" + id + ", name=" + name + ", age=" + age + "]";
}
}
4.新建mapping包,用于存放sql映射文件。在mapping下创建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">
<mapper namespace="com.mybatis.mapping.UserMapper">
<select id="getUser" parameterType="int" resultType="com.mybatis.domain.User">
select * from users where age = #{age}
</select>
</mapper>
5.在conf.xml中注册UserMapper文件
<?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.jdbc.Driver" />
<property name="url" value="jdbc:mysql://localhost:3306/mybatis" />
<property name="username" value="root" />
<property name="password" value="123465" />
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="com/mybatis/mapping/UserMapper.xml" />
</mappers>
</configuration>
6.在domain包下创建Test类编写测试代码
package com.mybatis.domain;
import java.io.IOException;
import java.io.InputStream;
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 com.mybatis.mapping.UserMapper;
public class Test {
public static void main(String[] args) {
//mybatis的配置文件
String resource = "conf.xml";
//使用类加载器加载mybatis的配置文件
InputStream is = null;
try {
is = Resources.getResourceAsStream(resource);
} catch (IOException e) {
e.printStackTrace();
}
//构建sqlSession的工厂
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);
SqlSession session = sqlSessionFactory.openSession();
try {
User user = session.selectOne("com.mybatis.mapping.UserMapper.getUser", 9);
System.out.println(user);
} finally {
session.close();
}
}
}
7.执行Test,得到结果
-------------------------------------------------------------
二、
在MyBatis的官方教程中,还有一种推荐写法:
BlogMapper mapper = session.getMapper(BlogMapper.class);
Blog blog = mapper.selectBlog(101);
这种方法有很多优势,首先它不是基于字符串常量的,就会更安全;其次,如果你的 IDE 有代码补全功能,那么你可以在有了已映射 SQL 语句的基础之上利用这个功能。
-------------------------------------------------------------
三、实现这种方式,需要在mapping中建立一个接口UserMapper
UserMapper代码如下:
package com.mybatis.mapping;
import com.mybatis.domain.User;
public interface UserMapper {
public User findUserById(int age);
}
修改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.mybatis.mapping.UserMapper">
<!--
<select id="getUser" parameterType="int" resultType="com.mybatis.domain.User">
select * from users where age = #{age}
</select>
-->
<select id="findUserById" parameterType="int" resultType="com.mybatis.domain.User">
select * from users where age = #{age}
</select>
</mapper>
测试类Test就可以用这种方式了:
package com.mybatis.domain;
import java.io.IOException;
import java.io.InputStream;
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 com.mybatis.mapping.UserMapper;
public class Test {
public static void main(String[] args) {
//mybatis的配置文件
String resource = "conf.xml";
//使用类加载器加载mybatis的配置文件
InputStream is = null;
try {
is = Resources.getResourceAsStream(resource);
} catch (IOException e) {
e.printStackTrace();
}
//构建sqlSession的工厂
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);
SqlSession session = sqlSessionFactory.openSession();
try {
UserMapper userMapper = session.getMapper(UserMapper.class);
User user = userMapper.findUserById(9);
//User user = session.selectOne("com.mybatis.mapping.userMapper.getUser", 9);
System.out.println(user);
} finally {
session.close();
}
}
}
另外,xml配置中注册mapper的方式也可以改为:
<mappers>
<!-- <mapper resource="com/mybatis/mapping/UserMapper.xml" /> -->
<mapper class="com.mybatis.mapping.UserMapper" />
</mappers>
注意:如果有重复的age值,运行会出现以下错误,建议使用id值查找!
Expected one result (or null) to be returned by selectOne(), but found: 2
四、配置文件说明
1、配置文件conf.xml是mybatis用来建立sessionFactory,里面主要包含了数据库连接相关内容,还有java类所对应的别名。比如,<typeAlias alias="User" type="com.mybatis.domain.User" />,这个别名非常重要,在具体的类的映射中,比如UserMapper.xml中resultType就是对应这个,要保持一直。(上面没有用到)
2、conf.xml里面的<mapper resource="com/mybatis/domain/UserMapper.xml" />是包含要映射的类的xml配置文件。
3、在UserMapper.xml文件里面主要是定义各种SQL语句,以及这些语句的参数,以及要返回的类型。
4、引用资源文件时,用斜杠/,比如"com/mybatis/domain/UserMapper.xml"。
引用类路径时用点.并且没有后缀,比如"com.mybatis.domain.User"。
本文参考了下面的文章:
https://www.cnblogs.com/jeffen/p/6211186.html
https://www.cnblogs.com/jway1101/p/5773263.html