Mybatis快速入门

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官网进一步进行学习。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值