MyBatis入门程序
目录
- 1. 下载 Mybatis 核心包
- 2. 创建工程,引入 MyBatis 核心包及依赖包
- 3. 创建 customer 表,建立与表对应的 domain
- 使用 lombok,开启注解
- 创建 Customer 类
- 4. 创建 MyBatis 核心配置文件 SqlMappingConfig.xml
- 5. 创建表对象的关系映射 Mapping 文件编写 sql 语句
- 6. 在核心配置文件当中引入 Mapping
- 7. 创建工厂,执行 sql 语句
- 抽取工具类
- MyBatis 查询所有用户
- MyBatis 整体架构
- 总结
- parameterType
- resultType
- selectOne
- selectList
1. 下载 Mybatis 核心包
MyBatis官网
MyBatis-github下载地址
2. 创建工程,引入 MyBatis 核心包及依赖包
这里为了方便学习,我们利用 Idea 创建一个普通的 Java 工程,后期再整合成 Web 工程。
创建完工程后,新建一个 lib 文件夹用来存放jar包。将 MyBatis 所需的jar包都放到 lib 文件夹中。
然后选中所有jar包,右键选择 add as library,将jar包添加到工程中,jar包前面出现箭头则添加完成。
3. 创建 customer 表,建立与表对应的 domain
首先进入数据库的图形化工具,然后创建一个 叫 mybatis 的数据库,字符集设为 utf-8;
在 mybatis 数据库中,创建一个表,建表语句如下:
/*
Navicat MySQL Data TransferSource Server : itlike
Source Server Version : 50720
Source Host : localhost:3306
Source Database : mybatisTarget Server Type : MYSQL
Target Server Version : 50720
File Encoding : 65001Date: 2018-12-04 14:13:49
*/SET FOREIGN_KEY_CHECKS=0;-- ----------------------------
-- Table structure for customer
-- ----------------------------
DROP TABLE IF EXISTS `customer`;
CREATE TABLE `customer` (`cust_id` int(11) NOT NULL AUTO_INCREMENT,`cust_name` varchar(255) DEFAULT NULL,`cust_profession` varchar(255) DEFAULT NULL,`cust_phone` varchar(255) DEFAULT NULL,`email` varchar(255) DEFAULT NULL,PRIMARY KEY (`cust_id`)
) ENGINE=InnoDB AUTO_INCREMENT=11 DEFAULT CHARSET=utf8;-- ----------------------------
-- Records of customer
-- ----------------------------
INSERT INTO `customer` VALUES ('1', '鲁班', '射手', '13499887733', '12341241@qq.com');
INSERT INTO `customer` VALUES ('2', '李白', '刺客', '18977665521', 'libai@163.com');
INSERT INTO `customer` VALUES ('3', '阿轲', '刺客', '18977665997', 'aike@qq.com');
INSERT INTO `customer` VALUES ('4', '德玛西亚', '肉盾', '13700997665', 'demaxiya.126.com6');
INSERT INTO `customer` VALUES ('5', '亚索', '战士', '13586878987', 'yasuo@qq.com');
INSERT INTO `customer` VALUES ('6', '奶妈', '辅助', '13398909089', 'nama@qq.com');
INSERT INTO `customer` VALUES ('7', '剑圣', '刺客', '13398909088', 'jiansheng@163.com');
INSERT INTO `customer` VALUES ('8', '盖伦', '肉盾', '15923242231', 'gailun@126.com');
INSERT INTO `customer` VALUES ('9', '锤石', '辅助', '13398908900', '8888@163.com');
INSERT INTO `customer` VALUES ('10', '阿木木', '辅助', '13398908928', '13398908928@qq.com');
建表如图:
使用 lombok,开启注解
使用 lombok 可以使用注解功能,注解可以减少代码量。
首先要导入 lombok 的jar包,要使用注解必须在设置里勾选支持注解,如下图:
创建 Customer 类
@Setter@Getter //使用注解生成 get 与 set 方法
public class Customer {private Integer cust_id;private String cust_name;private String cust_profession;private String cust_phone;private String email;@Overridepublic String toString() {return "Customer{" +"cust_id=" + cust_id +", cust_name='" + cust_name + '\'' +", cust_profession='" + cust_profession + '\'' +", cust_phone='" + cust_phone + '\'' +", email='" + email + '\'' +'}';}
}
4. 创建 MyBatis 核心配置文件 SqlMappingConfig.xml
在 src 文件下,创建一个 SqlMappingConfig.xml 文件,里面写入配置代码:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configurationPUBLIC "-//mybatis.org//DTD Config 3.0//EN""http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration><!-- spring整合后 environments配置将废除 使用spring中的连接池 --><environments default="development"><environment id="development"><!-- 使用jdbc事务管理 --><transactionManager type="JDBC" /><!-- 数据库连接池 --><dataSource type="POOLED"><property name="driver" value="com.mysql.jdbc.Driver" /><property name="url"value="jdbc:mysql://localhost:3306/mybatis?characterEncoding=utf-8" /><property name="username" value="root" /><property name="password" value="1234" /></dataSource></environment></environments>
</configuration>
5. 创建表对象的关系映射 Mapping 文件编写 sql 语句
在 domain 包下创建一个与 domain 类名相同的 xml 文件,此处为 Customer.xml,在里面写入编写 sql 语句:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="myTest"><!--根据cust_id查询客户--><select id="queryCustomerById" parameterType="Int" resultType="com.itlike.domain.Customer">SELECT * FROM `customer` WHERE cust_id = #{cust_id}</select>
</mapper>
6. 在核心配置文件当中引入 Mapping
核心配置文件 SqlMappingConfig.xml 中,加载映射文件:
<!--加载映射文件-->
<mappers><mapper resource="com/myxq/domain/Customer.xml"></mapper>
</mappers>
7. 创建工厂,执行 sql 语句
创建一个测试类 MyTest.java,位于 com.itlike.test 包中,利用单元测试运行代码:
public class MyTest {@Testpublic void test() throws IOException {// 1.sqlSessionFactoryBuilder 加载配置文件SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();// 2.读取配置文件InputStream resourceAsStream = Resources.getResourceAsStream("sqlMappingConfig.xml");// 3.获取session工厂SqlSessionFactory sessionFactory = sqlSessionFactoryBuilder.build(resourceAsStream);// 4.获取会话 ---JDBC 连接SqlSession sqlSession = sessionFactory.openSession();// 5.执行sql// selectOne 查询一条记录,如果查询多条记录会抛出异常Customer customer = sqlSession.selectOne("queryCustomerById", 1); // 查询 ID 为1 的数据System.out.println(customer);// 6.关闭sessionsqlSession.close();}}
运行结果:成功从数据库中查询到单个用户的数据。
Customer{cust_id=2, cust_name='李白', cust_profession='刺客', cust_phone='18977665521', email='libai@163.com'}
抽取工具类
在 MyBatis 中有些资源只需要加载一次,并且每次做查询时都是大量相同的代码,因此我们可以抽取出一个工具类,专门用来加载资源。
创建一个 MybatisUtils.java 文件作为工具类:
// 抽取工具类
public class MybatisUtils {public static final SqlSessionFactory sessionFactory;static { // 由于这些东西只需要加载一次,所以放入 static 代码块中// 1.获取 SqlSessionFactoryBuilderSqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();// 2.加载映射文件InputStream resourceAsStream = null;try {resourceAsStream = Resources.getResourceAsStream("sqlMappingConfig.xml");} catch (IOException e) {e.printStackTrace();}// 3.获取 sessionFactorysessionFactory = sqlSessionFactoryBuilder.build(resourceAsStream);}public static SqlSession openSession(){return sessionFactory.openSession();}}
抽取出工具类之后,之前的代码就变得十分简洁了。
测试类 MyTest.java
public class MyTest {@Testpublic void test() {// 调用Mybatis工具类SqlSession sqlSession = MybatisUtils.openSession();// 5.sql 查询Customer customer = sqlSession.selectOne("queryCustomerById", 1);System.out.println(customer);// 6.关闭会话sqlSession.close();}
}
MyBatis 查询所有用户
上面的测试代码中查询了 id 为 1 的用户,这次我们来实现查询所有用户:
在 MyBatis 中,sql 语句都是写在表对象的关系映射中的,我们在 Customer.xml 中添加以下语句:
<!--查询所有的客户,不需要参数-->
<select id="queryAllCustomer" resultType="com.itlike.domain.Customer">
SELECT * FROM `customer`
</select>
然后来到测试类 MyTest.java 中:
public void test2(){// 调用工具类SqlSession sqlSession = MybatisUtils.openSession();// 查询 sql// selectList() 查询一条或多记录,返回 List 集合List<Customer> queryAllCustomer = sqlSession.selectList("queryAllCustomer");for (Customer customer : queryAllCustomer) {System.out.println(customer);}
}
运行结果:表中所有数据都被查出。
Customer{cust_id=1, cust_name='鲁班', cust_profession='射手', cust_phone='13499887733', email='12341241@qq.com'}
Customer{cust_id=2, cust_name='李白', cust_profession='刺客', cust_phone='18977665521', email='libai@163.com'}
Customer{cust_id=3, cust_name='阿轲', cust_profession='刺客', cust_phone='18977665997', email='aike@qq.com'}
Customer{cust_id=4, cust_name='德玛西亚', cust_profession='肉盾', cust_phone='13700997665', email='demaxiya.126.com6'}
Customer{cust_id=5, cust_name='亚索', cust_profession='战士', cust_phone='13586878987', email='yasuo@qq.com'}
Customer{cust_id=6, cust_name='奶妈', cust_profession='辅助', cust_phone='13398909089', email='nama@qq.com'}
Customer{cust_id=7, cust_name='剑圣', cust_profession='刺客', cust_phone='13398909088', email='jiansheng@163.com'}
Customer{cust_id=8, cust_name='盖伦', cust_profession='肉盾', cust_phone='15923242231', email='gailun@126.com'}
Customer{cust_id=9, cust_name='锤石', cust_profession='辅助', cust_phone='13398908900', email='8888@163.com'}
Customer{cust_id=10, cust_name='阿木木', cust_profession='辅助', cust_phone='13398908928', email='13398908928@qq.com'}
MyBatis 整体架构
总结
parameterType
指定输入参数类型,mybatis 通过 ognl 从输入对象中获取参数值拼接在 sql 中。
resultType
指定输出结果类型,mybatis 将 sql 查询结果的一行记录数据映射为 resultType 指定类型的对象。如果有多条数据,则分别进行映射,并把对象放到容器List中。
selectOne
查询一条记录,如果使用 selectOne 查询多条记录则抛出异常。
selectList
可以查询一条或多条记录,返回一个 List 集合。