简介
1.1、什么是Mybaits
- Mybaits 是一款优秀的持久层框架
- 它支持定制化SQL、存储过程以及高级映射。
- Mybaits 避免了几乎所有的JDBC代码和手动设置参数以及获取结果集。
- Mybaits 可以使用简单的XML或注解来配置和映射原生类型、接口和Java的POJO(Plain Old Java Objects,普通老式Java对象)为数据库中的记录。
- Mybaits 本是apache的一个开源项目iBaits,2010年这个项目由apache software foundation 迁移到了google code,并改名为Mybaits。
- 2013年11月迁移到GitHub。
如何获得Mybaits?
- maven仓库:
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.5</version>
</dependency>
- GitHub:
https://github.com/mybatis/mybatis-3
- 中文文档:
https://mybatis.org/mybatis-3/zh/index.html
1.2、持久化
数据持久化
- 持久化就是将程序的数据在持久状态和瞬时状态转化的过程
- 内存:断电即失
- 数据库(jdbc),io文件持久化。
- 生活:冷藏、罐头。
为什么需要持久化?
- 有一些对象。不能让他丢掉。
- 内存太贵了
1.3、持久层
Dao层,Service层,Controller层…
- 完成持久化工作的代码块
- 层界限十分明显
1.4、为什么需要Mybaits?
- 帮助程序员将数据存入到数据库中。
- 方便
- 传统的JDBC代码太复杂了。简化。框架。自动化。
- 优点:
- 简单易学
- 灵活
- sql和代码分离,提高了可维护性
- 提供映射标签,支持对象与数据库的orm字段关系映射
- 提供对象关系映射标签,支持对象关系组建维护
- 提供xml标签,支持编写动态sql
最重要的一点:使用的人多!
2、第一个Mybaits程序
思路:搭建环境–>导入Mybaits–>编写代码–>测试!
2.1、环境搭建
新建项目
- 创建maven工程并导入依赖坐标
<dependencies>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.5</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.44</version>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.12</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.10</version>
</dependency>
</dependencies>
2.2、创建一个模块
- 编写Mybaits的核心配置文件
SqlMapConfig.xml
或者mybaits-config
名称随意
<?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>
<!--配置类的别名-->
<typeAliases>
<package name="com.chif.domain"></package>
</typeAliases>
<!-- 配置环境 -->
<environments default="mysql">
<!-- 配置mysql的环境 -->
<environment id="mysql">
<!-- 配置事务的类型 -->
<transactionManager type="JDBC"></transactionManager>
<!-- 配置数据源(连接池) -->
<dataSource type="POOLED">
<!-- 配置链接数据库的4个基本信息 -->
<property name="driver" value="com.mysql.jdbc.Driver" />
<property name="url" value="jdbc:mysql://localhost:3306/test" />
<property name="username" value="root" />
<property name="password" value="105105" />
</dataSource>
</environment>
</environments>
<!-- 指定映射配置文件的位置,映射配置文件值指的是每个dao独立的配置文件
如果使用注解来配置,此处应该使用class属性指定被注解的dao全限定类名
<mappers>
<package name="com.chif.dao"/>
</mappers>
-->
</configuration>
- 编写mybaits工具类
package com.chif.utils;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.*;
import java.io.IOException;
import java.io.InputStream;
public class MybaitsUtils {
private static SqlSessionFactory sqlSessionFactory;
static {
try {
//1.获取sqlSessionFactory对象
String resource="SqlMapConfig.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
} catch (IOException e) {
e.printStackTrace();
}
}
//2.获取sqlSession
public static SqlSession getSqlSession(){
SqlSession sqlSession = sqlSessionFactory.openSession();
return sqlSession;
}
}
2.3、编写代码
- 实体类 User
- dao接口
package com.chif.dao;
import com.chif.domain.User;
import java.util.List;
/**
* 用户的持久层接口
*/
public interface UserDao {
/**
* 查询所有
*/
//@Select("select * from user;")
public List<User> findAll();
}
- 编写映射配置文件(
代替接口的实现类
)
UserMapper.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="com.chif.dao.UserDao">
<!-- 配置查询所有 -->
<select id="findAll" resultType="com.chif.domain.User">
select * from user;
</select>
</mapper>
- 在核心配置文件中指定映射配置文件的位置
<!-- 指定映射配置文件的位置,映射配置文件值指的是每个dao独立的配置文件
如果使用注解来配置,此处应该使用class属性指定被注解的dao全限定类名
-->
<mappers>
<mapper class="com.chif.dao.UserDao"/>
</mappers>
- 测试
package com.chif.dao;
import com.chif.pojo.User;
import com.chif.utils.MybaitsUtils;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;
import java.util.List;
public class UserDaoTest {
@Test
public void test(){
//1.获取SqlSession对象
SqlSession sqlSession = MybaitsUtils.getSqlSession();
//2.执行sql
//方式一
UserDao userDao = sqlSession.getMapper(UserDao.class);
List<User> userList = userDao.findAll();
//方式二
// List<User> userList = sqlSession.selectList("com.chif.dao.UserDao.findAll");
for (User user : userList) {
System.out.println(user);
}
//3.关闭SqlSession
sqlSession.close();
}
}
- 注意事项:
-
创建UserDao.xml 和 Userdao.java,名称是为了和之前的习惯保持一致
在Mybaits中把持久层的操作接口名称和映射文件也叫做:Mapper
所以:UserDao和UserMapper是一样的。 -
在idea中创建目录的时候,目录和包是不一样的
包在创建时:com.chif.dao 是三级结构
目录在创建时:com.chif.dao 是一级结构 -
mybatis的映射配置文件必须和dao接口的包结构相同
-
映射配置文件的mapper标签namespace属性的取值必须是dao接口的全限定类名
-
映射配置文件的操作配置(select),id属性的取值必须是dao接口的方法名。
-
当遵从了以上后三点时,在开发中就无须再写dao的实现类。
-
UserMapper.xml映射文件
CRUD
1、namespace
namespace中的包名要和 Dao/mapper接口的包名一致,可以理解为绑定接口
2、select
选择、查询语句:
-
id:就是对应的namespace中的方法名;
-
resultType:Sql语句执行的返回值
-
parameterType:参数类型
1.编写接口
/** * 根据id查询用户 */ public User getUserById(int id);
2.编写对应mapper中的sql语句
<!--根据id查询用户--> <select id="getUserById" parameterType="int" resultType="com.chif.pojo.User"> select * from user where id=#{id} </select>
3.测试
@Test public void testFindById(){ //1.获取sqlSession对象 SqlSession sqlSession = MybaitsUtils.getSqlSession(); UserMapper mapper = sqlSession.getMapper(UserMapper.class); User user = mapper.getUserById(45); System.out.println(user); //2.关闭 sqlSession.close(); }
3、Insert
<!--增加用户-->
<insert id="addUser" parameterType="com.chif.pojo.User">
insert into user(username) values(#{username})
</insert>
4、update
<!--修改用户-->
<update id="updateUser" parameterType="com.chif.pojo.User">
update user set username=#{username} where id=#{id}
</update>
5、delete
<!--删除用户-->
<delete id="deleteUser" parameterType="int">
delete from user where id=#{id}
</delete>
6、注意事项
-
增删改需要提交事务!
-
以上是基于代理dao的CRUD操作
7、万能Map
接口
/**
* 增加用户
*/
public int addUser2(Map<String,Object> map);
配置
<!--增加用户-map-->
<insert id="addUser2" parameterType="map">
insert into user(username) values(#{name})
</insert>
测试
@Test
public void testAddUser2(){
//1.获取sqlsession
SqlSession sqlSession = MybaitsUtils.getSqlSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
Map<String,Object> map=new HashMap<String, Object>();
map.put("name","老刘");
int falg = mapper.addUser2(map);
if (falg==1){
System.out.println("插入成功"+falg);
}
//2.提交事务
sqlSession.commit();
//3.关闭
sqlSession.close();
}
mybatis中接口参数使用map类型的好处
-
不用指定每个参数的名称.
-
可以传递任意数量和任意类型的参数,而不用对每个参数进行命名和申明,非常利于扩展,在需要时不用额外动Java代码在xml中可以更灵活的获取参数,不用受前端参数变化的影响
parameterType="map"
-
对象传递参数,在sql中取出对象的属性。
parameterType="com.chif.pojo.User"
-
只有一个基本类型参数的情况下,可以直接在sql中取到。
parameterType="int"可以省略不写
-
多个参数用Map或者注解
8、模糊查询
两种方法
1.java代码执行的时候,传递通配符%%
mapper.getUserLike("%老%");
2.在sql拼接中使用通配符
select * from user where username like "%"#{value}"%"