MyBatis
MyBatis简介
MyBatis历史
- MyBatis最初是Apache的一个开源项目iBatis, 2010年6月这个项目由Apache Software Foundation迁移到了Google Code。随着开发团队转投Google Code旗下,iBatis3.x正式更名为MyBatis。代码于2013年11月迁移到Github
- iBatis一词来源于“internet”和“abatis”的组合,是一个基于Java的持久层框架。iBatis提供的持久层框架包括SQL Maps和Data Access Objects(DAO)
MyBatis特性
- MyBatis 是支持定制化 SQL、存储过程以及高级映射的优秀的持久层框架
- MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集
- MyBatis可以使用简单的XML或注解用于配置和原始映射,将接口和Java的POJO(Plain Old Java Objects,普通的Java对象)映射成数据库中的记录
- MyBatis 是一个 半自动的ORM(Object Relation Mapping)框架
MyBatis下载
搭建MyBatis
准备工作
- IDEA
- Maven
- Mysql
- sqlyog
- mybatis
创建Maven工程
-
创建项目命名SSM
-
创建模块命名为MyBatis_HelloWorld
-
打包方式设置为jar
<packaging>jar</packaging>
-
引入依赖
<dependencies>
<!-- Mybatis核心 -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.7</version>
</dependency>
<!-- junit测试 -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
<!-- MySQL驱动 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.3</version>
<!--因为我的maver库李MySQL版本为5.1.3所以我的版本号为5.1.3 根据自身版本修改-->
</dependency>
</dependencies>
创建数据库
打开sqlyog创建数据库ssm并创建表t_user
CREATE TABLE `t_user` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`username` varchar(20) DEFAULT NULL,
`password` varchar(20) DEFAULT NULL,
`age` int(11) DEFAULT NULL,
`gender` char(1) DEFAULT NULL,
`emall` varchar(50) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
创建实体类
- 实体类创建到src的main目录中的java目录中
- 创建User实体类并提供构造器与Get Set 方法
private Integer id;
private String username;
private String password;
private Integer age;
private String gender;
private String email;
public User() {
}
public User(Integer id, String username, String password, Integer age, String gender, String email) {
this.id = id;
this.username = username;
this.password = password;
this.age = age;
this.gender = gender;
this.email = email;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public String getGender() {
return gender;
}
public void setGender(String gender) {
this.gender = gender;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
创建MyBatis的核心配置文件
创建mapper接口
MyBatis中的mapper接口相当于以前的dao。但是区别在于,mapper仅仅是接口,我们不需要提供实现类。
public interface UserMapper {
int insertUser();
}
创建MyBatis的映射文件
在resources目录下创建mappers目录在mappers目录下创建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.seven.mybatis.mapper.UserMapper">
<!-- mapper接口要和映射文件保持两个一致
1.mapper接口的全类名和映射文件的namespace一致
2.mapper接口的方法名要和映射文件的sql的id保持一致
-->
<!-- int insertUser();-->
<insert id="insertUser">
insert into t_user values (null,'admin','123456',23,'男','2289938711@qq.com')
</insert>
</mapper>
创建测试类
如果报错的话就是没有把mybatis添加到库里面
package com.seven.mybatis;
import com.seven.mybatis.mapper.UserMapper;
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.IOException;
import java.io.InputStream;
/**
* @name hk
* @time 2022-08-31-17:59
*/
public class MyBatisTest {
@Test
public void test() throws IOException {
//获取核心配置文件的输入流
InputStream is = Resources.getResourceAsStream("mybatis-config.xml");
//获取SqlSessionFactoryBuilder对象
SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
//获取SqlSessionFactory对象
SqlSessionFactory build = sqlSessionFactoryBuilder.build(is);
//获取SQL的会话对象SqlSession,是MyBatis提供的操作数据库的对象
SqlSession sqlSession = build.openSession();
//获取UserMapper代理实现类对象
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
int i = mapper.insertUser();
System.out.println(i);
sqlSession.close();
}
}
查看sqlyog是否添加成功
2022/8/31 20:11:00
优化MyBatis框架
//获取核心配置文件的输入流
InputStream is = Resources.getResourceAsStream("mybatis-config.xml");
//获取SqlSessionFactoryBuilder对象
SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
//获取SqlSessionFactory对象
SqlSessionFactory build = sqlSessionFactoryBuilder.build(is);
//获取SQL的会话对象SqlSession()不会自动提交事务,是MyBatis提供的操作数据库的对象
//SqlSession sqlSession = build.openSession();
//获取SQL的会话对象SqlSession(true)会自动提交事务,是MyBatis提供的操作数据库的对象
SqlSession sqlSession = build.openSession(true);
//获取UserMapper代理实现类对象
//UserMapper mapper = sqlSession.getMapper(UserMapper.class);
//提供sql以及唯一标识找到sql并执行,唯一标识是namespace.sqlId
int i = sqlSession.insert("com.seven.mybatis.mapper.UserMapper.insertUser");
//int i = mapper.insertUser();
System.out.println(i);
//提交事务
//sqlSession.commit();
sqlSession.close();
添加log4j日志文件
-
在pom.xml里添加配置
<!-- log4j日志 -->
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
</dependencies>
-
在resources里创建log4j.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">
<appender name="STDOUT" class="org.apache.log4j.ConsoleAppender">
<param name="Encoding" value="UTF-8" />
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%-5p %d{MM-dd HH:mm:ss,SSS} %m (%F:%L) \n" />
</layout>
</appender>
<logger name="java.sql">
<level value="debug" />
</logger>
<logger name="org.apache.ibatis">
<level value="info" />
</logger>
<root>
<level value="debug" />
<appender-ref ref="STDOUT" />
</root>
</log4j:configuration>
封装获取Session
package com.seven.mybatis.utils;
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 java.io.IOException;
import java.io.InputStream;
/**
* @name hk
* @time 2022-09-01-15:59
*/
public class SqlSessionUtil {
public static SqlSession getSqlSession(){
SqlSession sqlSession =null;
try {
//获取核心配置文件的输入流
InputStream is = Resources.getResourceAsStream("mybatis-config.xml");
//获取SqlSessionFactoryBuilder对象
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
//获取SqlSessionFactory对象
SqlSessionFactory build = builder.build(is);
//获取SqlSession对象
sqlSession = build.openSession(true);
} catch (IOException e) {
e.printStackTrace();
}
return sqlSession;
}
}
测试修改用户
<!-- void upDateUser();-->
<update id="upDateUser">
update t_user set gender = '女' where id =2
</update>
public void upData(){
SqlSession sqlSession = SqlSessionUtil.getSqlSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
mapper.upDateUser();
sqlSession.close();
}
测试删除用户
<!-- void deleteUser();-->
<delete id="deleteUser">
delete from t_user where id =3
</delete>
public void delete(){
SqlSession session = SqlSessionUtil.getSqlSession();
UserMapper mapper = session.getMapper(UserMapper.class);
mapper.deleteUser();
session.close();
}
测试查询用户
-
<!-- User getUserById();-->
<!--
resultType:设置结果类型,即查询到的数据要转换成的Java类型
resultMap:自定义映射,处理多对一或一对多的映射关系
-->
<select id="getUserById" resultType="com.seven.mybatis.pojo.User">
select * from t_user where id= 1
</select>
-
public void getUserById(){
SqlSession session = SqlSessionUtil.getSqlSession();
UserMapper mapper = session.getMapper(UserMapper.class);
User userById = mapper.getUserById();
System.out.println(userById);
session.close();
}
-
-
-
<!-- List<User> getAllUser(); -->
<select id="getAllUser" resultType="com.seven.mybatis.pojo.User">
select * from t_user
</select>
-
public void getAllUser(){
SqlSession session = SqlSessionUtil.getSqlSession();
UserMapper mapper = session.getMapper(UserMapper.class);
List<User> allUser = mapper.getAllUser();
allUser.forEach(System.out::println);
session.close();
}
-
MyBatis核心配置文件
<typeAliases>
<!--
typeAlias:设置某个具体的类型的别名
属性:
type:需要设置别名的类型的全类名
alias:设置此类型的别名,且别名不区分大小写。若不设置此属性,该类型拥有默认的别名,即类名
-->
<!--<typeAlias type="com.seven.mybatis.bean.User"></typeAlias>-->
<!--<typeAlias type="com.seven.mybatis.bean.User" alias="user">
</typeAlias>-->
<!--以包为单位,设置改包下所有的类型都拥有默认的别名,即类名且不区分大小写-->
<package name="com.seven.mybatis.bean"/>
</typeAliases>
<environments default="development">
<!--
environment:设置具体的连接数据库的环境信息
属性:
id:设置环境的唯一标识,可通过environments标签中的default设置某一个环境的id,表示默认使用的环境
-->
<environment id="development">
<!--
transactionManager:设置事务管理方式
属性:
type:设置事务管理方式,type="JDBC|MANAGED"
type="JDBC":设置当前环境的事务管理都必须手动处理
type="MANAGED":设置事务被管理,例如spring中的AOP
-->
<transactionManager type="JDBC"/>
<properties resource="jdbc.properties"></properties>
<!-- 引用配置文件 -->
<!--
dataSource:设置数据源
属性:
type:设置数据源的类型,type="POOLED|UNPOOLED|JNDI"
type="POOLED":使用数据库连接池,即会将创建的连接进行缓存,下次使用可以从缓存中直接获取,不需要重新创建
type="UNPOOLED":不使用数据库连接池,即每次使用连接都需要重新创建
type="JNDI":调用上下文中的数据源
-->
<dataSource type="POOLED">
<!--设置驱动类的全类名-->
<property name="driver" value="${jdbc.driver}"/>
<!--设置连接数据库的连接地址-->
<property name="url" value="${jdbc.url}"/>
<!--设置连接数据库的用户名-->
<property name="username" value="${jdbc.uname}"/>
<!--设置连接数据库的密码-->
<property name="password" value="${jdbc.password}"/>
<mappers>
<!-- 以具体的xml为单位引入核心配置文件 -->
<!-- <mapper resource="com.seven.mybatis.mapper.UserMapper.xml"/>-->
<!--
以包为单位,将包下所有的映射文件引入核心配置文件
注意:
1. 此方式必须保证mapper接口和mapper映射文件必须在相同的包下
2. mapper接口要和mapper映射文件的名字一致
-->
<package name="com.seven.mybatis.mapper"></package>
</mappers>
不好意思!开学比较忙马上更新9.22
MyBatis获取
- #{}获取 #{}的本质就是占位符赋值 (自动加单引号)
- ${}获取${}的本质就是字符串拼接(需要手动添加单引号)
若mapper接口方法的参数为多个字面量类型
此时mybatis会把参数放到map集合中,以两种方式存储
- arg1,arg2...为键,以参数为值。
- param1,param2...为键,以参数为值。
因此只需要通过#{}和${}访问map集合的键,就可以获取相对应的值,一定要注意${}的单引号问题。
若mapper接口方法的参数为map集合类型的参数
只需通过#{}和${}访问map集合的键,就可以获得相对应的值,一定要注意${}的单引号问题。
若mapper接口方法的参数为实体类类型的参数
只需要通过#{}和${}访问实体类中的属性名,就可以获得相对应的属性值,一定要注意${}的单引号问题。
可以在mapper接口方法的参数上设置@param注解
此时mybatis会把这些参数放到map中,以两种方式进行存储。
- 以@param注解的value属性值为键,以参数为值。
- 以param1,param2...为键,以参数为值。
只需要通过#{}和${}访问map集合的键,就可以获取相应的值,一定要注意${}的单引号问题
MyBatis查询
-
根据ID获取User对象
/**
* 通过id获取用户数据
* @param id
* @return
*/
User getUserById(@Param("id") Integer id);
<!-- User getUserById(@Param("id") Integer id); -->
<select id="getUserById" resultType="User">
select * from t_user where id = #{id}
</select>
-
查询所有t_user表的数据
/**
* 获取所有用户数据
* @return
*
* 如果获取表中所有的数据需要list集合接收
*
*/
List<User> getAllUser();
/**
* 获取所有用户数据
* @return
* 如果用实体类对象接收则会报错 报错信息为
* org.apache.ibatis.exceptions.TooManyResultsException: Expected one result (or null)
* to be returned by selectOne(), but found: 5
* 期望返回一个结果发现返回5条数据
*/
User getAllUser();
<!-- List<User> getAllUser(); -->
<select id="getAllUser" resultType="User">
select * from t_user
</select>
<!-- User getAllUser(); -->
<select id="getAllUser" resultType="User">
select * from t_user
</select>
-
利用map集合获取数据
/**
* 用map集合获取数据
* @param id
* @return
* 以字段名为键 以字段的值为值 如果某一字段值为null 则不会放到map集合中
*/
Map<String,Object> getAllUserByMap(@Param("id") Integer id);
<!-- Map<String,Object> getAllUserByMap(@Param("id") Integer id); -->
<select id="getAllUserByMap" resultType="map">
select * from t_user where id =#{id}
</select>
-
利用map集合获取全部数据
/**
* 用map集合获取数据mapKey为键 以获取到的数据为值
* @return
*/
@MapKey("id")
Map<String,Object> getAllUserByMaps();
<!-- Map<String,Object> getAllUserByMaps(); -->
<select id="getAllUserByMaps" resultType="map">
select * from t_user
</select>
2022年9月25日 星期日 23:20:55
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)