创建一个mapper.xml文件
其中mapper标签的 namespace 内填入映射文件的全类名(既本文件路径 包名+文件名)
sql标签中,id是此查询语句的标识,resultType是返回的数据类型,paramenterType是传入的数据类型 需要注意的是,如果如果传入的是实体类,则需要填入此实体类的包名+类名,并且,Mybatis只支持传入一个参数。
sql语句内容
在Mybatis中的slq语句不需分号,且待输入的内容用 #{ } 或 ${value} 来替代。
#{ } 中的{ }可以输入任意内容,#{xxx}会被处理成带单引号的文本,例如传入数据abc,则会被处理成 ‘abc’ 。注意,若传入的是实体类,则需要严格区分大小写。
${value} 中{ }只可填入value,并且不会被自动加上单引号,需要手动添加,如 ’ ${value} ’ 。
<?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.test.entity.personMapper">
<select id="queryPersonById" resultType="com.test.entity.Person" parameterType="int">
select * from person where id = #{id}
</select>
</mapper>
创建一个conf.xml文件
此文件需要在mappers中填入mapper.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="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">//连接池方式
<!-- 配置数据库信息 -->
<property name="driver" value="com.mysql.jdbc.Driver"/> //数据库驱动
<property name="url" value="jdbc:mysql://localhost:3306/temp?useSSL=false"/> //连接地址
<property name="username" value="root"/> //数据库账户
<property name="password" value="000000"/> //数据库密码
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="com/test/mapper/personMapper.xml"/> //mapper.xml文件位置
</mappers>
</configuration>
使用Mybatis
Mybatis以字符流的方式读取配置文件,步骤如下
首先,Resources.getResourceAsReader(“conf.xml”)得到reader ,
并用SqlSessionFactoryBuilder().build(reader)命令生成工厂sessionFactory,
使用sessionFactory的openSession()命令得到session,
得到的session即相当于JDCB的connection。
基础方式实现CURD
写statement文本,即选择对应的mapper+对应的sql语句的id,namespace.id。写好statement之后,使用selectOne(如果结果集只有一条的话)命令,参数1填入statement,参数2填入需要传入的参数,没有则不填,最后用对应的数据类型来接收。结束不要忘记close()。
public class TestMyBatis {
public static void main(String[] args) throws IOException {
queryPerson();
}
public static void queryPerson() throws IOException {
//加载MyBatis配置文件
Reader reader = Resources.getResourceAsReader("conf.xml");
SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(reader);
//session 相当于 JDBC的 connection
SqlSession session = sessionFactory.openSession();
String statement = "com.test.entity.personMapper.queryPersonById";
Person person = session.selectOne(statement,1);
System.out.println(person);
session.close();
}
}
使用动态代理方式实现CURD
与基础方式不同的是,动态代理方式需要写好一个接口,使其省略掉了statement的书写,可根据约定,直接定位出SQL语句。
匹配的过程
1.有了接口后,Mybatis可以通过接口名称找到对应的mapper.xml文件,所以需要保证mapper的namespace=接口全类名(包名+类名)
2.根据接口的方法名,找到mapper中对应的sql的id,接口的传入、接收数据类型均需与id的接收、返回值相对应。
创建接口:
package com.test.mapper;
import java.util.List;
import com.test.entity.Person;
public interface PersonMapper {
Person queryPersonById(int id);
void deletePersonById(int id);
void insertPerson(Person person);
void updatePersonById(Person person);
List<Person> queryAllPersonById();//对应的mapper返回类型是Person,不需List<Person>,数组等同理
List<Person> queryAllPersonSortById(String a);
}
修改mapper.xml的namesapce=接口的全类名
<mapper namespace="com.test.mapper.PersonMapper">
使用:
与基础方式相似,删除statement与使用的selectOne等命令。先使用session.getMapper方法,传入mapper.class得到返回的数据后,使用其中的函数即可
//基础方式的
String statement = "com.test.entity.personMapper.queryPersonById";
Person person = session.selectOne(statement,1);
//动态代理方式
PersonMapper personMapper = session.getMapper(PersonMapper.class);
Person person = personMapper.queryPersonById(1);