入门概述
Mybatis框架
1.入门
1.1简述mybatis
mybatis是一个持久成框架,简化了我们与数据库的交互。使我们只需要关注sql语句本身,而不需要花费精力取处理加载驱动、创建连接、创建statement等繁杂的过程。
1.2了解mybatis
- mybatis通过xml或注解的方式将要执行的各种statement配置起来.
- 通过对象和statement中的sql的动态参数进行映射生成最终的sql语句
- mybatis框架执行sql并将结果映射为java对象并返回。
- 是通过ORM思想实现了结果集的封装。
1.3回顾JDBC
- 注册驱动
- 获取数据库连接对象
- 定义Mysql语句
- 获取执行Mysql
- 执行
- 处理结果
- 释放资源
import java.sql.*;
/**
*添加一条记录
*/
public class JDBCdemo03 {
public static void main(String[] args) {
Connection conn =null;
Statement statement=null;
try {
//注册驱动
Class.forName("com.mysql.cj.jdbc.Driver");
//定义sql
String sql = "insert into cat(name ,age ,id ) values ('汤姆',18,1003)";
//获取数据库连接对象
try {
conn= DriverManager.getConnection("jdbc:mysql://localhost:3306/hello?serverTimezone=UTC", "root", "990801lxq");
//获取sql执行对象
statement = conn.createStatement();
//执行sql
int i = statement.executeUpdate(sql);
if(i>0){
System.out.println("添加成功"+"/t"+"共有"+i+"语句受到影响");
}else {
System.out.println("添加失败");
}
} catch (SQLException e) {
e.printStackTrace();
}
} catch (ClassNotFoundException e) {
e.printStackTrace();
}finally {
if(conn != null){
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(statement !=null){
try {
statement.cancel();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
}
1.4搭建环境
- 创建表
CREATE TABLE `user` (
`id` int(20) NOT NULL,
`name` varchar(30) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
`pwd` varchar(30) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;
-- ----------------------------
-- Records of user
-- ----------------------------
INSERT INTO `user` VALUES (1, '汤姆', '12354');
INSERT INTO `user` VALUES (2, '乔恩', '123');
INSERT INTO `user` VALUES (3, '张三', '123');
INSERT INTO `user` VALUES (5, '类鳄类', '12345');
-
新建maven项目
-
导入依赖
- 主要的依赖
<!-- mysql依赖--> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.47</version> </dependency> <!-- https://mvnrepository.com/artifact/org.mybatis/mybatis --> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.4.6</version> </depe
- 可以增加的依赖
<!-- junit--> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.11</version> </dependency> <!-- log4j--> <!-- https://mvnrepository.com/artifact/log4j/log4j --> <dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>1.2.17</version> </dependency>
- 找不到配置文件的依赖
<build> <resources> <resource> <directory>src/main/java</directory> <includes> <include>**/*.properties</include> <include>**/*.xml</include> </includes> <filtering>false</filtering> </resource> <resource> <directory>src/main/resources</directory> <includes> <include>**/*.properties</include> <include>**/*.xml</include> </includes> <filtering>false</filtering> </resource> </resources> </build>
-
配置环境mybatis-config.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核心配置文件-->
<configuration>
<!-- 环境配置 环境可以有多套 default="环境id"-->
<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/mybatis?useSSL=true&useUnicode=true&characterEncoding=UTF-8"/>
<property name="username" value="root"/>
<property name="password" value="990801lxq"/>
</dataSource>
</environment>
</environments>
</configuration>
- 编写pojo
package cn.guoke.pojo;
import lombok.Data;
@Data
public class User {
private int id;
private String name;
private String pwd;
}
这个是需要get set 方法的 为了省事使用了lombok
lombok的坐标
<!-- https://mvnrepository.com/artifact/org.projectlombok/lombok -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.10</version>
<scope>provided</scope>
</dependency>
- 编写UserMapper接口
package cn.guoke.dao;
import cn.guoke.pojo.User;
import java.util.List;
public interface UserMapper {
//获取所有的user
List<User> getUserList();
}
-
编写对应的UserMapper.xml
<?xml version="1.0" encoding="UTF8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="cn.guoke.dao.UserMapper"> <select id="getUserList" resultType="cn.guoke.pojo.User"> select * from User where 1=1 </select> </mapper>
- namespace 对应UserMapper的接口
- namespace对应接口中编写的方法、
- resultType返回值类型
-
在编写完UserMapper.xml后我们要在mybatis-config.xml对其经行映射
<mappers> <mapper resource="cn/guoke/dao/UserMapper.xml"/> </mappers>
有四种映射的方式:
- resource:使用相对于类路径的资源引用
- url:使用完全限定资源定位符(URL
- class:使用映射器接口实现类的完全限定类名
- name:将包内的映射器接口实现全部注册为映射器
这样我们的环境就搭建完成了
2.CRUD
我们要使用mybatis需要一个SqlSessionFactory 实例。
每个基于 MyBatis 的应用都是以一个 SqlSessionFactory 的实例为核心的。
SqlSessionFactory 的实例可以通过 SqlSessionFactoryBuilder 获得。
而 SqlSessionFactoryBuilder 则可以从 XML 配置文件或一个预先配置的 Configuration 实例来构建出 SqlSessionFactory 实例。
2.1直接获取SqlSessionFactory
package cn.guoke.dao;
import cn.guoke.pojo.User;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Test;
import java.io.InputStream;
import java.util.List;
public class UserMapperTest {
@Test
public void test01() throws Exception {
/**
* 1.读取配置文件
* 2.创建SqlSessionFactory 工厂
* 3.使用工厂产生SqlSession对象
* 4.使用SqlSession创建Dao接口的代理对象
* 5.使用代理对象执行方法
* 6.释放资源
*/
//1.
InputStream input = Resources.getResourceAsStream("mybatis-config.xml");
//2.
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
SqlSessionFactory factory = builder.build(input);
//3.
SqlSession sqlSession = factory.openSession();
//4
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
//5.
List<User> userList = mapper.getUserList();
for (User user : userList) {
System.out.println(user);
}
//6.
sqlSession.close();
input.close();
}
}
2.2编写工具类
我们看到每次测试的时候我们都需要获取一个SqlSession
我们可以编写一个工具类,来方便测试
package cn.guoke.utils;
import cn.guoke.dao.UserMapper;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.mapping.SqlSource;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionException;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import java.io.IOException;
import java.io.InputStream;
public class SqlSessionUtils {
private static SqlSessionFactory factory;
static {
try {
InputStream input = Resources.getResourceAsStream("mybatis-config.xml");
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
factory = builder.build(input);
} catch (IOException e) {
e.printStackTrace();
}
}
public static SqlSession getSqlSession(){
return factory.openSession();
}
}
测试:
@Test
public void test2(){
SqlSession sqlSession = SqlSessionUtils.getSqlSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
List<User> userList = mapper.getUserList();
for (User user : userList) {
System.out.println(user);
}
sqlSession.close();
}
2.3 CRUD使用xml实现
- 在UserMapper中增加CRUD的方法
package cn.guoke.dao;
import cn.guoke.pojo.User;
import java.util.List;
public interface UserMapper {
//获取所有的user
List<User> getUserList();
//根据ID查询用户
User getUserID(int id);
//增加一个用户
int addUser(User user);
//修改一个用户
int intoUser(int id);
//删除一个用户
int delUser(int id);
}
-
编写UserMapper.xml
<?xml version="1.0" encoding="UTF8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="cn.guoke.dao.UserMapper"> <select id="getUserList" resultType="cn.guoke.pojo.User"> select * from User where 1=1 </select> <select id="getUserID" resultType="cn.guoke.pojo.User" parameterType="int"> select * from USER where id=#{id} </select> <insert id="addUser" parameterType="cn.guoke.pojo.User"> insert into mybatis.user (id,name,pwd) value (#{id},#{name},#{pwd}); </insert> <update id="intoUser" parameterType="cn.guoke.pojo.User"> update user set name=#{name},pwd=#{pwd} where id=#{id}; </update> <delete id="delUser" parameterType="int"> delete from user where id = #{id} </delete> </mapper>
-
parameterType 传递参数的数据类型
- #{id} 用来传递参数
2.4使用注解看配置
- 配置mappers
<mappers>
<mapper class="guoke.dao.UserMapper"/>
</mappers>
- 使用注解
package guoke.dao;
import guoke.pojo.User;
import org.apache.ibatis.annotations.Select;
import java.util.List;
public interface UserMapper {
//获取所有的user
@Select("select * from User")
List<User> getUserList();
}
2.5模糊查询
- 在接口中增加一个发法
//模糊查询
List<User> getUserByName(String name);
- 测试
public void test4(){
SqlSession sqlSession = SqlSessionUtils.getSqlSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
List<User> userByName = mapper.getUserByName("%张%");
for (User user : userByName) {
System.out.println(user);
}
sqlSession.close();
}
除去上述方法,含可以在xml中配置
<select id="getUserByName" resultType="cn.guoke.pojo.User" parameterType="String">
select * from USER where name like '%${value}%'
</select>
2.6使用聚合函数
和上述一样定义接口返回就可以了
3.mybatis参数
3.1parameterType
- 传递简单类型
- 传递pojo对象
- 传递pojo包装对象
3.2resultType
- 简单类型
- pojo对象
- pojo列表
3.3resultMap
<resultMap id="UserMap" type="cn.guoke.pojo.User">
<!-- 主键使用id-->
<id property="user" column="id"></id>
<!-- 其他字段-->
<result property="username" column="name"/>
</resultMap>