简介
- MyBatis官网地址:http://www.mybatis.org/mybatis-3/
官方网站中的简介
MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。
MyBatis 可以使用简单的 XML 或注解来配置和映射原生类型、接口和 Java 的 POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。
使用MyBatis可以实现SQL语句和Java代码解耦,对代码的后期维护更有利。
准备
- 创建一张表
create table user_info(
id char(36) primary key,
user_name varchar(15) unique,
password varchar(15) not null
)
- 添加数数据
insert into user_info (id, user_name, password)
values ('3ddcf637-15a8-49d9-a378-b3fa2f2f9c65', 'admin', '123456');
insert into user_info (id, user_name, password)
values ('7eb9deed-ec87-416e-abb3-1a5a2ce819de', 'user1', '000000');
commit;
- 创建一个Java项目导入MyBatis所需要的jar包
下载 jar包https://github.com/mybatis/mybatis-3/releases
使用
创建一个config-mybatis.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="dev">
<environment id="dev">
<transactionManager type="JDBC"></transactionManager>
<dataSource type="POOLED">
<!--连接数据的配置信息-->
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/test"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
</dataSource>
</environment>
</environments>
<!--待添加代码-->
</configuration>
第一种方法
- 只使用xml配置文件
创建userinfo.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.learn.userinfo">
<select id="selectUserNameById" resultType="java.lang.String">
SELECT user_name FROM user_info WHERE id = '3ddcf637-15a8-49d9-a378-b3fa2f2f9c65'
</select>
</mapper>
在config-mybatis.xml文件的待添加代码 注释下面添加
<mappers>
<mapper resource="./userinfo.xml"/>
</mappers>
测试类
public class Demo1 {
public static void main(String[] args) {
try {
InputStream inputStream = Resources.getResourceAsStream("config-mybatis.xml");
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
SqlSession sqlSession = sqlSessionFactory.openSession();
//在selectOne方法中传入namespace + id的字符串拼接
Object name = sqlSession.selectOne("com.learn.userinfo.selectUserNameById");
System.out.println(name);
sqlSession.commit();
sqlSession.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
第二种方法
- 接口配合xml配置文件
创建一个userinfo包,并在包下创建一个IUserInfoDao的接口
public interface IUserInfoDao {
//方法名要和userinfo.xml中的对应
String selectUserNameById();
}
测试类
public class Demo1 {
public static void main(String[] args) {
try {
InputStream inputStream = Resources.getResourceAsStream("config-mybatis.xml");
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
SqlSession sqlSession = sqlSessionFactory.openSession();
//返回一个代理类
IUserInfoDao userInfoDao = sqlSession.getMapper(IUserInfoDao.class);
System.out.println(userInfoDao.getClass().getName());
String name = userInfoDao.selectUserNameById();
System.out.println(name);
sqlSession.commit();
sqlSession.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
结果
把代理打印出来可以看出来,这里使用了JDK的动态代理
并且这种方法可以查询到数据
第三种方法
- 使用注解的方法
在config-mybatis.xml更改配置
<mappers>
<!-- <mapper resource="./userinfo.xml"/> -->
<mapper class="com.learn.userinfo.IUserInfoDao"/>
</mappers>
并在IUserInfoDao接口中添加注解@Select
public interface IUserInfoDao {
@Select("SELECT user_name FROM user_info WHERE id = '3ddcf637-15a8-49d9-a378-b3fa2f2f9c65'")
String selectUserNameById();
}
运行测试类
public class Demo1 {
public static void main(String[] args) {
try {
InputStream inputStream = Resources.getResourceAsStream("config-mybatis.xml");
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
SqlSession sqlSession = sqlSessionFactory.openSession();
IUserInfoDao userInfoDao = sqlSession.getMapper(IUserInfoDao.class);
System.out.println(userInfoDao.getClass().getName());
String name = userInfoDao.selectUserNameById();
System.out.println(name);
sqlSession.commit();
sqlSession.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
- 这种方法又把java和sql语句写在了一起,虽然使用注解配置,方式简单,但是增加了代码的耦合度,不推荐使用