最近在研究一些框架,刚好用到了MyBatis 顺便记录一下吧。
什么是 MyBatis ?
MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解来配置和映射原生信息,将接口和 Java 的 POJOs(Plain Old Java Objects,普通的 Java对象)映射成数据库中的记录。
上面是官方的介绍,说白了就是用它来操作数据库 以前都是用JDBC直接操作的,现在MyBatis 又进行了一些封装处理使我们可以省去不少操作。
下面我我使用的开发工具为IntelliJ IDEA ,网上的教程多数是eclipse 或IntelliJ IDEA 使用的Maven,这里我只用的是Gardle 。关于IntelliJ IDEA 和Gardle 我就不多说了直接建项目入手。
新建一个项目
我这里建立了一个空项目
然后在空项目中建立一个,点击项目处新建如下:
这里选择什么看自己的需求,我目前只是建立一个java 程序来测试:
下面填写信息
然后项目名和项目存放的路径:
创建完之后项目中什么都没有需要我们手动创建
现在里面建一个src 文件
然后在src里面创建main文件
然后里面建立对应的java文件或kotlin文件,在里面建立包命名就可以了。
下面看我们应用的包,在build.gradle
dependencies {
compile 'org.mybatis.generator:mybatis-generator-core:1.3.5'
compile 'mysql:mysql-connector-java:5.1.40' /*指定数据库,这里用的是mysql*/
compile 'tk.mybatis:mapper:3.3.9'
compile 'org.mybatis:mybatis:3.2.6'
}
项目的build.gradle里面我引用阿里的镜像地址:
repositories {
maven{ url "http://maven.aliyun.com/nexus/content/groups/public/"}
mavenCentral()
jcenter()
}
我这里还用到了kotlin 所用有相应的引用
dependencies {
classpath group: 'org.springframework.boot', name: 'spring-boot-gradle-plugin', version: SPRING_BOOT_VERSION
classpath group: 'org.jetbrains.kotlin', name: 'kotlin-gradle-plugin', version: KOTLIN_VERSION
classpath group: 'org.jetbrains.dokka', name: 'dokka-gradle-plugin', version: DOKKA_VERSION
}
然后我们开始写我们的配置文件了,首先要在main文件下建一个文件resources
IntelliJ IDEA 中必须把所有的.xml文件都放在resources文件下,否则会不识别,所以这里注意一下
在resources 新建一个generatorConfig.xml 文件,里面做相应的配置:
映射文件mappers 这里我在 resources中建了BlogMapper.xml的文件里面做一些处理
上面可以看到是一个查询语句,没错,MyBatis的查询是在这里面做的然后我们建立对应的接口类:
/**
* 接口
*/
public interface BlogMapper {
Blog selectBlog(Integer id);
}
上面是和BlogMapper.xml 中对应写的查询方法,再建立一个帮助类,这里我直接贴出来:
/**
* 工具类
* 从 从 SqlSessionFactory 中获取 SqlSession
*/
public class MyBatisUtil {
private static SqlSessionFactory sqlSessionFactory = null;
static {
// String resource = "org/mybatis/example/Configuration.xml";
Reader reader = null;
try {
// 读取.xml的配置
reader = Resources.getResourceAsReader("generatorConfig.xml");
sqlSessionFactory =new SqlSessionFactoryBuilder().build(reader);
} catch (IOException e) {
e.printStackTrace();
}
}
private MyBatisUtil(){
}
public static SqlSession getSqlSessionFactory(){
return sqlSessionFactory.openSession();
}
}
上面我们可以看出读取了.xml中的配置连接数据库,我这里数据库是已经建好的
表明
然后建立对应的实体类:
public class Blog {
private int id;
private String name;
private String codeId;
public String getCodeId() {
return codeId;
}
public void setCodeId(String codeId) {
this.codeId = codeId;
}
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 class BlogTest {
/**
* 查询id
*/
@Test
public void testSelectBlog(){
SqlSession sqlSessionFactory = MyBatisUtil.getSqlSessionFactory();
BlogMapper mapper = sqlSessionFactory.getMapper(BlogMapper.class);
Blog blog = mapper.selectBlog(1);
System.out.println("数据库名="+blog.toString());
sqlSessionFactory.close();
}
}
我们发现打印出来的有一个属性没有值?
发现原来是实体类中的名字和数据库中的字段名不符合,一个是codeId,一个是code_id,有些时候我们并不能把他们写的一模一样,有可能是几个单词组合起来的,所以java命名是驼峰式的,数据库是-分开的,这里我们就要处理一下了。
大家都知道SQL中有个别名的方法,那需要我们把所有的字段都出来,字段少了还可以,多了就比较麻烦了:
别名
利用as给个别字段起个别名,在MyBatis中我们还有一个方法resultMap,我们只需要指定需要改变的字段就可以:
然后在对应的地方引用就可以了:
改之前:resultType="Blog"
改之后:resultType="blogResultMap"
简单的查询语句已经完成了,今天就到这里了,明天继续…