初次使用Mybatis

目录


mybatis简介

导入jar包

创建数据库以及数据库表

创建实体类

创建mapper.xml文件

配置mybatis

测试mybatis

三种查询方式

selectOne

selectList

selectMap


mybatis简介

  MyBatis 是支持普通 SQL 查询,存储过程和高级映射的优秀持久层框架。MyBatis 消除了几乎所有的 JDBC 代码和参数的手工设置以及结果集的检索。MyBatis 使用简单的 XML 或注解用于配置和原始映射,将接口和 Java 的 POJOs(Plain Old Java Objects,普通的 Java 对象)映射成数据库中的记录。——摘抄自mybatis官网

  

导入jar包

  需要导入两个最基本的jar包,分别是mybatis的jar包,以及数据库驱动包。

mysql-connector-java-5.1.39-bin.jar
mybatis-3.2.7.jar

  如果要记录日志,还需要导入日志包,比如log4j..

创建数据库以及数据库表

  创建测试专用库mybatis,并创建一个Person表:

CREATE DATABASE mybatis;

USE mybatis; 

CREATE TABLE `person` (
`id` int(11) primary key auto_increment,
`name` varchar(30) DEFAULT NULL,
`age` int(11) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; INSERT INTO person VALUES (1, 'aaaa', 88);

    

创建实体类

  为了演示方便,这里创建一个Person类,类名和数据库中的person表名对应,并且Person类中的属性名和person表中的字段名相同(一一对应)。

  实体类都在cn.ganlixin.pojo包下面:

package cn.ganlixin.pojo;

import java.io.Serializable;

public class Person implements Serializable{

	private int id;
private String name;
private int age; public Person() { } public Person(int id, String name, int age) {
super();
this.id = id;
this.name = name;
this.age = age;
} 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 int getAge() {
return age;
} public void setAge(int age) {
this.age = age;
} @Override
public String toString() {
return "Person [id=" + id + ", name=" + name + ", age=" + age + "]";
}
}

  

创建mapper.xml文件

  前面的介绍中已经说了:MyBatis 使用简单的 XML 或注解用于配置和原始映射,将接口和 Java 的 POJOs(Plain Old Java Objects,普通的 Java 对象)映射成数据库中的记录。

  所以此时我们需要创建一个mapper文件,文件名规范:实体类名+Mapper.xml,当然也可以命名为其他规范。

  上面的Person类,对应的mapper文件是PersonMapper.xml,位于cn.ganlixin.mapper包下面。

<?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="cn.ganlixin.mapper.PersonMapper"> <select id="selectPersonById" parameterType="int" resultType="cn.ganlixin.pojo.Person">
select * from person where id=#{id}
</select> </mapper>

  介绍一下上面的xml内容:

1、第一部分是dtd声明,不加的话,写xml标签的时候没有提示。

2、每个mapper映射文件,*标签都是mapper,namespace的规范是packageName.ClassName。

3、select标签表示这是一个查询操作,另外还有insert、update、delete标签。

id属性,可以理解为方法名,通过namespace.id可以调用这个id的方法,执行标签定义的sql。

parameterType属性,表示传入的参数类型,关于参数类型设置,可以参考:

resultType属性,表示结果集中每一行记录的类型,注意,如果没有配置别名<alias>,需要使用全路径。

sql中的#{id}表示接受参数名为id的值。

  

配置mybatis

  实体类和映射文件已经写好之后,当我们运行测试代码的时候,mybatis会运用反射,扫描映射文件,并解析映射文件,让映射文件和实体类之间产生联系,所以现在应该配置mybatis了。

  创建一个xml文件,文件名随意,文件可以放在项目的根目录下,也可以放专门存放配置文件的目录下,这里将配置文件命名为mybatis.xml,并且放在projectRoot/src/conf目录下。

  配置mybatis无非就两点:

  1、配置数据库连接信息

  2、配置mybatis要扫描哪些映射文件。

<?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="development">
<environment id="development">
<transactionManager type="JDBC"></transactionManager>
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"></property>
<property name="url" value="jdbc:mysql://localhost:3306/mybatis"></property>
<property name="username" value="root"></property>
<property name="password" value="root"></property>
</dataSource>
</environment>
</environments> <mappers>
<mapper resource="cn/ganlixin/mapper/PersonMapper.xml"></mapper>
</mappers>
</configuration>

  解释一下上面的mybatis的配置文件:

  1、首先是dtd,注意配置文件的dtd和映射文件的dtd不同。

  2、configuration标签内容就是配置mybatis。

  3、environments标签下面可以有多个environment,每一个environment就是一套数据库配置,并且每一个environment都用一个id来标识自己。environments标签使用default来配置哪一个environment配置有效。

  4、transactionManager的type属性配置事务管理的类型,有两种:

    i、一种是JDBC,使用JDBC原生的事务控制管理,JDBC默认没有开启事务(会自动提交),但是mybatis会将JDBC的事务自动开启,即不会自动提交。

    ii、另一种是MANAGED,使用Spring的时候就是设置为MANAGED。

  5、dataSource标签内容就是配置数据库连接信息。其中dataSource的type可以设置为POOLED、UNPOOLED、JNDI。

  6、mappers标签就是针对上面写的映射文件,只有在这里面使用mapper标签指定的映射文件才会被扫描。

测试mybatis

package cn.ganlixin.test;

import java.io.IOException;
import java.io.InputStream; import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder; import cn.ganlixin.pojo.Person; public class TestMybatis {
public static void main(String[] args) { try {
// 加載mybatis配置文件
String resource = "conf/mybatis.xml";
InputStream inputStream = Resources.getResourceAsStream(resource); // 利用配置文件,创建sqlSessionFactory
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); // 利用sqlSessionFactory来获取数据库连接
SqlSession session = sqlSessionFactory.openSession(); // 指定要调用的方法(映射文件中的namespace加上包含SQl语句的标签的id。
String method = "cn.ganlixin.mapper.PersonMapper.selectPersonById"; // 调用方法
Person p = (Person) session.selectOne(method, 1);
System.out.println(p); // 断开数据库连接
session.close(); } catch (IOException e) {
e.printStackTrace();
}
}
}

  

三种查询方式

  mybatis提供了三种方式来获取结果集的格式:

  1、selectOne用来获取sql语句执行完毕后得到单一的值;

  2、selectList用来获取sql语句执行完毕后的到一个List结果集,多条记录。

  3、selectMap用来获取sql执行之后,某一个字段为key,每一条记录为value,put到一个map中。

  在测试selectList和selectMap之前,先修改一下PersonMapper.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="cn.ganlixin.mapper.PersonMapper"> <select id="selectPersonById" parameterType="int" resultType="cn.ganlixin.pojo.Person">
select * from person where id=#{id}
</select> <select id="selectAllPerson" parameterType="int" resultType="cn.ganlixin.pojo.Person">
select * from person
</select>
</mapper>

  

  selectOne

    selectOne的用法上面已经展示了,就不在重复说了。

  selectList

package cn.ganlixin.test;

import java.io.IOException;
import java.io.InputStream;
import java.util.List; import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder; import cn.ganlixin.pojo.Person; public class TestMybatis {
public static void main(String[] args) { try {
String resource = "conf/mybatis.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
SqlSession session = sqlSessionFactory.openSession(); // 注意selectList要使用List来接收,可以直接指定泛型
String method = "cn.ganlixin.mapper.PersonMapper.selectAllPerson";
List<Person> list = session.selectList(method);
for (Person p : list) {
System.out.println(p);
}
session.close(); } catch (IOException e) {
e.printStackTrace();
}
}
}

  

  selectMap

package cn.ganlixin.test;

import java.io.IOException;
import java.io.InputStream;
import java.util.Map; import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder; import cn.ganlixin.pojo.Person;
import jdk.management.resource.internal.inst.SocketOutputStreamRMHooks; public class TestMybatis {
public static void main(String[] args) { try {
String resource = "conf/mybatis.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
SqlSession session = sqlSessionFactory.openSession(); // 注意selectMap需要指定第二个参数,表示使用每一条记录中的那个属性(字段)作为map的key
String method = "cn.ganlixin.mapper.PersonMapper.selectAllPerson";
Map<String, Person> map = session.selectMap(method, "name");
for (String name : map.keySet()) {
System.out.println(name + " ==> " + map.get(name));
}
//aaaa ==> Person [id=1, name=aaaa, age=88]
//bbbb ==> Person [id=2, name=bbbb, age=99]
session.close(); } catch (IOException e) {
e.printStackTrace();
}
}
}

  

上一篇:Java中的抽象的类


下一篇:第13篇英语翻译