1.1 什么是Mybatis
- 一款优秀的持久层框架
- 支持定制化SQL,存储过程以及高级映射
- 避免几乎所有的JDBC代码和手动设置参数以及获取结果集
- 可以使用简单的XML或注解来配置和映射原生类型,接口和Java的POJO(Plain Ordinary Java Objects,普通的 Java对象)为数据库中的记录
- MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBatis 。2013年11月迁移到Github
如何获得Mybatis?
-
maven仓库
<dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.5.5</version> </dependency>
-
Github
-
中文文档
1.2 持久化
数据持久化
- 持久化就是将程序的数据在持久状态和瞬时状态转化的过程
- 内存:断电即失
- 数据库(JDBC),io文件持久化
- 生活举例:冷藏,罐头
为什么需要持久化?
- 有一些对象,不能让他丢掉
- 内存太贵了
1.3 持久层
Dao层,Service层,Controller层…
- 完成持久化工作的代码块
- 层界限十分明显
1.4 为什么需要Mybatis?
- 将数据存入数据库中
- 方便
- 传统的JDBC代码太复杂。简化,框架,自动化
- 优点:
- 简单易学
- 灵活
- SQL和代码的分离,提高了可维护性
- 提供映射标签,支持对象与数据库的ORM字段关系映射
- 提供对象关系映射标签,支持对象关系组建维护
- 提供xml标签,支持编写动态sql
2.第一个Mybatis程序
2.1 搭建环境
搭建数据库
新建项目
1.新建一个普通的maven项目
2.删除src目录
3.导入maven依赖
<!--导入依赖 -->
<dependencies>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.24</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.5</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.projectlombok/lombok -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.12</version>
</dependency>
</dependencies>
2.2 创建一个模块
-
编写mybatis的核心配置文件
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE configuration PUBLIC "-//mabatis.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 name="url" value="jdbc:mysql://localhost:3306/mybatis?useSSL=true&useUnicode=true&characterEncoding=UTF-8"/> <property name="username" value="root"/> <property name="password" value="root"/> </dataSource> </environment> </environments> <mappers> <mapper resource="com/yy/dao/UserMapper.xml"/> </mappers> </configuration>
-
编写mybatis工具类
/**sqlSessionFactory -->sqlSession * @author YY */ public class MybatisUtils { public static SqlSessionFactory sqlSessionFactory; static { try { //使用Mybatis第一步:获取sqlSessionFactory对象 String resource ="mybatis-config.xml"; InputStream inputStream = Resources.getResourceAsStream(resource); sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); } catch (IOException e) { e.printStackTrace(); } } /** * 既然有了sqlSessionFactory,我们就看可以从中获得SqlSession的实例了 * SqlSession完全包含面向数据库执行SQL命令所需的所有方法 * @return */ public static SqlSession getSqlSession(){ return sqlSessionFactory.openSession(); } }
2.3 编写代码
-
实体类
public class User { private int id; private String name; private String password; public User(int id, String name, String password) { this.id = id; this.name = name; this.password = password; } public int getId() { return id; } public String getName() { return name; } public String getPassword() { return password; } public void setId(int id) { this.id = id; } public void setName(String name) { this.name = name; } public void setPassword(String password) { this.password = password; } @Override public String toString() { return "User{" + "id=" + id + ", name='" + name + '\'' + ", password='" + password + '\'' + '}'; } }
-
Dao接口
public interface UserDao { List<User> getUserList(); User getUserById(int id); int addUser2(Map<String,Object> map); int addUser(User user); int updataUser(User user); int deleteUser(int id); List<User>getUserLike(String value); }
-
接口实现类由原来的UserDaoImpl转变为一个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="com.yy.dao.UserDao"> <select id="getUserList" resultType="com.yy.pojo.User"> select * from mybatis.user </select> </mapper>
2.4 测试
核心配置文件中注册mappers
-
junit测试
@Test public void test(){ //第一步获得sqlSession对象 SqlSession sqlSession = null; try { sqlSession = MybatisUtils.getSqlSession(); //方式一:getMapper UserDao userDao = sqlSession.getMapper(UserDao.class); List<User> userList=userDao.getUserList(); for (User user:userList) { System.out.println(user); } }catch (Exception e){ e.printStackTrace(); }finally { //关闭SqlSession sqlSession.close(); } }
3.CRUD
3.1 namespace
namespace中的包名要和Dao/mapper接口的包名一致
3.2 select
选择,查询语句
- id:对应的namespace中的方法名
- resultType:SQL语句执行的返回值
- parameterType:参数类型
<select id="getUserById" resultType="com.yy.pojo.User">
select *from user where id=#{id}
</select>
3.3 Insert
<insert id="addUser" parameterType="com.yy.pojo.User" >
insert into user (id,name,pwd) values(#{id},#{name},#{password});
</insert>
3.4 update
<update id="updataUser" parameterType="com.yy.pojo.User">
update user set name=#{name},pwd=#{password} where id =#{id}
</update>
3.5 Delete
<delete id="deleteUser" parameterType="int">
delete from user where id =#{id}
</delete>
3.6 万能的Map
假如实体类,或数据库中的表,字段或者参数过多,应当考虑使用Map
int addUser2(Map<String,Object> map);
<insert id="addUser2" parameterType="map">
insert into user (id,name,pwd) values(#{userid},#{username},#{password});
</insert>
@Test
public void addUser2(){
SqlSession sqlSession = MybatisUtils.getSqlSession();
UserDao mapper = sqlSession.getMapper(UserDao.class);
Map<String, Object> map = new HashMap<String, Object>();
map.put("userid",5);
map.put("username","tony");
map.put("password","8745");
mapper.addUser2(map);
sqlSession.commit();
sqlSession.close();
}
Map传递参数,直接在SQL中取出key即可 【parameterType=”map】
对象传递参数,直接在SQL中取出对象的属性即可 【parameterType=“Object”】
只有一个基本类型参数的情况下,可以直接在SQL中取到
多个参数用Map,或注解
3.8 模糊查询
模糊查询怎么写?
1.Java代码执行的时候,传递通配符 % %
List<User> t = mapper.getUserLike("%t%");
2.在SQL拼接中使用通配符
select * from user where name like "%" #{value} "%"