MyBatis01 MyBatis基础知识【搞清楚原理】
1 MyBatis是什么
mybatis是一个持久层的框架,它对jdbc做了封装;是apache下的顶级项目
mybatis让程序将主要精力放在sql上,通过mybatis提供的映射方式,自由灵活生成(半自动化,大部分需要程序员编写sql)满足需要sql语句
mybatis可以将向 preparedStatement中的输入参数自动进行输入映射,将查询结果集灵活映射成java对象。(输出映射)
2 如何使用MyBatis
2.1 导包
mybatis : mybatis包
mysql : MySQL数据库驱动包
junit : 单元测试包
2.2 添加myBatis的配置文件
配置文件中需要配置的内容
environment配置
jdbc事务管理
数据库连接池
指定映射文件
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 <?xml version="1.0" encoding="UTF-8" ?> 2 <!DOCTYPE configuration PUBLIC "-//ibatis.apache.org//DTD Config 3.0//EN" 3 "http://ibatis.apache.org/dtd/ibatis-3-config.dtd"> 4 <configuration> 5 <!-- 和spring整合后,environment配置将被废除 --> 6 <environments default="environment"> 7 <environment id="environment"> 8 <!-- 使用jdbc事务管理,事务控制由mybatis实现 --> 9 <transactionManager type="JDBC" /> 10 <!-- 数据库连接池,由mybatis进行管理 --> 11 <dataSource type="POOLED"> 12 <property name="driver" value="com.mysql.jdbc.Driver" /> 13 <property name="url" 14 value="jdbc:mysql://127.0.0.1:3306/xiangxu" /> 15 <property name="username" value="root" /> 16 <property name="password" value="182838" /> 17 </dataSource> 18 </environment> 19 </environments> 20 21 <!-- 指定映射文件的位置(即:加载映射文件) --> 22 <mappers> 23 <mapper resource="cn/xiangxu/telecom/login/entity/AdminMapper.xml" /> <!-- 注意:包名的 . 全部换成 / --> 24 </mappers> 25 26 </configuration>
2.3 写实体类
要求:实体类的属性名要与表的字段名一致
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 package cn.xiangxu.telecom.login.entity; 2 3 import java.io.Serializable; 4 5 public class Admin implements Serializable { 6 private Integer id; 7 private String name; 8 private String password; 9 private String gender; 10 11 public Integer getId() { 12 return id; 13 } 14 public void setId(Integer id) { 15 this.id = id; 16 } 17 public String getName() { 18 return name; 19 } 20 public void setName(String name) { 21 this.name = name; 22 } 23 public String getPassword() { 24 return password; 25 } 26 public void setPassword(String password) { 27 this.password = password; 28 } 29 public String getGender() { 30 return gender; 31 } 32 public void setGender(String gender) { 33 this.gender = gender; 34 } 35 36 public String toString() { 37 return "Admin [id=" + id + ", name=" + name + ", password=" + password + ", gender=" + gender + "]"; 38 } 39 40 }
2.4 写实体类的映射文件
映射文件主要内容是要执行的sql
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 <?xml version="1.0" encoding="UTF-8" ?> 2 <!DOCTYPE mapper PUBLIC "-//ibatis.apache.org//DTD Mapper 3.0//EN" 3 "http://ibatis.apache.org/dtd/ibatis-3-mapper.dtd"> 4 5 <mapper namespace="login"> 6 <insert id="insert" parameterType="cn.xiangxu.telecom.login.entity.Admin"> 7 <!-- 注意:parameterType的属性值一定要写上类名(基本类型除外) --> 8 INSERT INTO admin 9 (name, password, gender) 10 VALUES(#{name}, #{password}, #{gender}) 11 </insert> 12 13 <select id="findAll" resultType="cn.xiangxu.telecom.login.entity.Admin"> 14 SELECT * FROM admin 15 </select> 16 </mapper>
2.5 使用myBatis提供的api来访问数据库
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 package test; 2 3 import java.io.Serializable; 4 import java.util.List; 5 6 import org.apache.ibatis.session.SqlSession; 7 import org.apache.ibatis.session.SqlSessionFactory; 8 import org.apache.ibatis.session.SqlSessionFactoryBuilder; 9 import org.junit.Before; 10 import org.junit.Test; 11 12 import cn.xiangxu.telecom.login.entity.Admin; 13 14 public class TestCase implements Serializable { 15 private SqlSession sqlSession; 16 @Before 17 public void init() { 18 // 获得SqlSession对象 19 SqlSessionFactoryBuilder ssfb = new SqlSessionFactoryBuilder(); 20 SqlSessionFactory ssf = ssfb.build(TestCase.class.getClassLoader().getResourceAsStream("SqlMapConfig.xml")); 21 // SqlSession是执行sql的容器 22 sqlSession = ssf.openSession(); 23 /* 24 * 注意: 25 * getResourceAsStream 将文件找到并变成输入流 26 */ 27 } 28 29 @Test 30 // 测试插入数据 31 public void test01() { 32 Admin admin = new Admin(); 33 admin.setName("warrior"); 34 admin.setPassword("182838"); 35 admin.setGender("Man"); 36 sqlSession.insert("login.insert", admin); 37 38 sqlSession.commit(); 39 sqlSession.close(); 40 } 41 42 @Test 43 // 测试查询所有数据 44 public void test02() { 45 List<Admin> lists = sqlSession.selectList("login.findAll"); 46 for(Admin admin : lists) { 47 System.out.println(admin); 48 } 49 sqlSession.close(); 50 } 51 }
3 MyBatis工作原理
4 查询结果放回Map类型
mybatis会将查询到的记录先转换成对应的Map 对象(以字段名作为key,以字段值作为value。 一条记录对应一个Map)。然后再将Map中的数据 存放到对应的实体对象里面。
如果想要结果返回Map类型,仅仅需要修改resultType的属性值就可以啦
5 解决实体类的属性与表的字段名不一致
5.1 使用别名实现
在sql语句中使用别名,别名和实体类的字段名保持一致
5.2 使用resultMap元素实现
本博客源码下载:点击前往