Bootstrap

MyBatis——执行SQL语句的三种配置方式

简介

官方网站中的简介

MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。
MyBatis 可以使用简单的 XML 或注解来配置和映射原生类型、接口和 Java 的 POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。

使用MyBatis可以实现SQL语句和Java代码解耦,对代码的后期维护更有利。

准备

  1. 创建一张表
create table user_info(
  id char(36) primary key,
  user_name varchar(15) unique,
  password  varchar(15) not null
)
  1. 添加数数据
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;

结果

  1. 创建一个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语句写在了一起,虽然使用注解配置,方式简单,但是增加了代码的耦合度,不推荐使用
;