Mybatis是什么?
- 在使用mybatis之前,需要先知道mybatis是什么?MyBatis 是支持定制化 SQL、存储过程以及高级映射的优秀的持久层框架。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以对配置和原生Map使用简单的 XML 或注解,将接口和 Java 的 POJOs(Plain Old Java Objects,普通的 Java对象)映射成数据库中的记录。(摘自w3school)。简单来说,mybatis就是用来简化连接、操作数据库操作的,以往我们用java连接数据库需要些大量的代码,使用mybatis只要配置好就可以使用。
Mybatis环境搭建方法
第一步:
- 使用mybatis框架只要导入mybatis核心jar包就可以使用:mybatis-xxx.jar(选择版本自行下载);
- 如果使用 Maven 来构建项目,则需将下面的 dependency 代码置于 pom.xml 文件中:
<dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>x.x.x</version></dependency>
- 因为是对数据库进行操作,需要导入相应的数据库连接的jar包,这里使用的是mysql。Java 连接 MySQL 需要驱动包,最新版下载地址为:http://dev.mysql.com/downloads/connector/j/,解压后得到jar库文件,然后在对应的项目中导入该库文件。
- 如果需要日志,还可导入相应的日志包,如log4j,slf4j等,在mybatis的配置文件中开启使用。
第二步:
- 创建实体类com.xxx.pojo.People
package com.czxy.pojo;
public class People {
private int id;
private String name;
private int age;
public People() {
super();
}
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 "People [id=" + id + ", name=" + name + ", age=" + age + "]";
}
}
- 编写mybatis全局配置文件mybatis.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">
<!-- 文件头,可在mybatis官网获得 -->
<configuration>
<!-- 这里写详细配置,配置顺序不可以互换,将鼠标放置到 <configuration>上方查看配置顺序-->
</configuration>
- 数据库环境配置:
<!-- 下面的default名随便起 -->
<!-- 取值default 引用environmen的id,当前所使用的环境 -->
<environments default="default">
<!-- 声明可以使用的环境 -->
<environment id="default">
<!-- JDBC事物类型默认为自动提交,在java代码中设置 conn.setAutoCommit(false)则为不自动提交 -->
<!-- 使用原生JDBC事务 -->
<transactionManager type="JDBC"></transactionManager>
<!-- 使用数据库连接池 -->
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver" />
<property name="url" value="jdbc:mysql://localhost:3306/数据库名称" />
<property name="username" value="用户名" />
<property name="password" value="密码" />
</dataSource>
</environment>
</environments>
- 映射器配置,指明对数据库操作的xml配置所在的包:
<mappers>
<!-- 写全路径 -->
<mapper resource="包名/xxx.xml" />
<!-- 如: -->
<mapper resource="com/xxx/mapper/PeopleMapper.xml" />
</mappers>
- 以上是基础配置,在整合ssm框架时不需要写
- 还可以添加其他配置,方便操作。
- 别名配置:(别名配置有三种:
- 一、系统内置别名:把类名全小写,查看文档了解;
- 二、给某个类起别名:添加标签给常用的属性起简短的别名
- 三、直接给某个包下所有类起别名,别名是类名 )
- 如:
- 别名配置:(别名配置有三种:
<typeAliases>
<!-- 给某包下某类起别名: -->
<typeAlias type="com.xxx.pojo.People" alias="peo"/>
<!-- 给某包下所有类起别名,别名是类名: -->
<package name="com.xxx.pojo"/>
</typeAliases>
- setting设置(如:开启日志,其余的设置在官网查看):
<settings>
<!-- mybatis开始log4j支持的功能 -->
<setting name="logImpl" value="LOG4J"/>
</settings>
以上是常用的一些设置,其余的可以在mybatis官网查看。
第三步:
- 在com.xxx.mapper包下新建 实体类名+Mapper.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">
<!-- 文件头,可在mybatis官网获得 -->
<!-- 可以将namespace理解为:包名+类名,但可以随便起名,不同体现在方法上 -->
<mapper namespace="a.b">
<!-- 这里写数据库相关操作,如:select,delete等 -->
</mapper>
- select标签用法:
- id为方法名
- parameterType:定义参数类型
- resultType:定义返回值类型
- 如果方法返回值是list,在resultType中写list的泛型,因为
- mybatis对jdbc封装,一行一行读取数据
- 在这里体现使用别名和不使用别名的区别(使用别名很简单)
<mapper namespace="a.b">
<!-- java方法中:public void selById(int id) -->
<!-- 不使用别名 -->
<select id="selById" resultType="com.xxx.pojo.People" parameterType="int">
select * from people where id=#{0}
<!-- =#{0}代表:selById(int id)的第一个参数,下标从0开始 -->
</select>
<select id="test" resultType="com.xxx.pojo.People" parameterType="int">
<![CDATA[select * from people where id<#{0}]]>
</select>
<!-- 使用别名 -->
<select id="page" resultType="peo" parameterType="map">
select * from people limit #{pageStart},#{pageSize}
</select>
<select id="page1" resultType="People" parameterType="map">
select * from people limit #{pageStart},#{pageSize}
</select>
<insert id="ins" parameterType="People">
insert into people values(default,#{name},#{age})
</insertt>
</mapper>
第四步:
- 编写测试类,将测试类都放在com.xxx.test包下
public class test {
public static void main(String[] args) throws IOException {
InputStream inputStream = Resources.getResourceAsStream("mybatis.xml");
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(inputStream);
SqlSession session = factory.openSession();
<!-- session的第一种方式,查找一个 -->
// People p = session.selectOne("a.b.selById",1);
// People p1 = session.selectOne("a.b.test",2);
// System.out.println(p.toString());
// System.out.println(p1.toString());
<!-- session的第二种方式,查找返回list -->
// int pageSize = 2;
// int pageNumber = 2;
//
// Map<String, Object> map = new HashMap<>();
// map.put("pageSize", pageSize);
// map.put("pageStart", pageSize*(pageNumber-1));
//
// List<People> p2 = session.selectList("a.b.page",map);
// System.out.println(p2);
People p = new People();
p.setName("新增name");
p.setAge(18);
int index = session.insert("a.b.ins", p);
if(index > 0) {
System.out.println("成功");
}else {
System.out.println("失败");
}
session.commit();
session.close();
}
}
以上是mybatis的简单实现步骤
parameterType属性
- 在XXXMapper.xml中等标签的parameterType可以控制参数类型,参数由外面提供
- 在Mapper.xml中通过#{0}获取参数
- 使用索引,从0开始,第一个参数
- 也可以使用#{param1},第一个参数
- 如果只有一个参数,mubatis对#{基本数据类型或String}里面的内容没有要求,只要写内容即可
- 如果参数是对象#{属性名}
- 如果参数是map写成#{key}
- Map或对象可以传多个参数
#{}和${}的区别
-
#{}获取参数的内容,支持索引获取,param1获取指定位置的参数,并且sql使用?占位符
-
${}字符串拼接,不适用“?”,默认找${内容的get或set方法},如果写数字,就是一个数字;
-
如果在xml文件中出现“<”、“>”,双引号 等特殊字符时可以使用XML文件转义标签(XML自身的)
- <![CDATA[内容]]>,如:
<select id="test" resultType="com.czxy.pojo.People" parameterType="int">
<! [CDATA [ select * from people where id < #{0} ] ]>
</select>
mybatis实现mysql分页
-
方法:select * from people limit 1, 2;表示:查询从第二行开始
(1下标代表第二行),往后查两行,包括这一行本身- 占位符?不允许在关键字前后进行数学运算,需要在代码中计算完成后传递到mapper.xml中
- 在java代码中计算
int pageSize = 2;
int pageNumber = 2;
Map<String, Object> map = new HashMap<>();
map.put("pageSize", pageSize);
map.put("pageStart", pageSize*(pageNumber-1));
List<People> p2 = session.selectList("a.b.page",map);
System.out.println(p2);
- 在mapper.xml中的代码:
<select id="page" resultType="com.xxx.pojo.People" parameterType="map">
select * from people limit #{pageStart},#{pageSize}
</select>
MyBatis接口绑定方案和多参数传递
- 作用:实现创建一个接口后把mapper.xml由mybatis生成接口的实现类,通过调用接口对象就可以获取mapper.xml中编写的sql。
- mybatis和spring整合时使用的是这个方案
- 实现步骤:
- 创建一个接口,接口和mapper文件在同一个包下
- 接口包名和接口名(接口全路径)要与mapper.xml的namespace相同,接下来mybatis自己操作
- 接口中方法名和mapper.xml标签的id属性相同;
- 在mybatis.xml中使用进行扫描接口和mapper.xml;
<mappers>
<package name="com.xxx.mapper"/>
</mappers>
- 代码实现步骤:
- 新建PeopleMapper接口类
public interface LogMapper {
List<People> selAll();
/**
* mybatis把参数转换为map,其中@Param("key") 参数变量为"value"
* @param pageStart
* @param pageSize
* @return
*/
List<People> selByPage(@Param("pageSize") String pageSize, @Param("pageStart") String pageStart);
}
-
- 测试
public static void main(String[] args) throws IOException {
InputStream inputStream = Resources.getResourceAsStream("mybatis.xml");
// 使用工厂类
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(inputStream);
SqlSession session = factory.openSession();
// PeopleMapper peopleMapper = session.getMapper(PeopleMapper.class);
// List<People> list = peopleMapper.selAll();
// for(People people : list) {
// System.out.println(people .toString());
// }
PeopleMapper peopleMapper = session.getMapper(PeopleMapper.class);
int pageSize = 2;
int pageNumber = 2;
Map<String, Object> map = new HashMap<>();
map.put("pageSize", pageSize);
map.put("pageStart", pageSize*(pageNumber-1));
List<People> p2 = session.selectList("a.b.page",map);
System.out.println(p2);
}
有兴趣的伙伴可以在mybatis官网进一步进行学习。