目录
一、简介
1.什么是Mybatis
MyBatis是一种开源的、轻量级的Java持久层框架,它通过XML或注解的方式将数据库访问操作映射为Java对象的方法调用。
2.Mybatis的发展史
MyBatis是一种基于Java的持久层框架,用于将数据库操作与应用程序解耦。其发展历史可以追溯到2001年,当时它被称为iBATIS。以下是MyBatis的发展史:
1. iBATIS:iBATIS由Clinton Begin在2001年创建。它最初是一个专注于数据库访问的框架,旨在通过将SQL查询与Java对象映射来简化数据库操作。
2. Apache iBATIS:在2002年,iBATIS成为Apache Software Foundation的一部分,并更名为Apache iBATIS。这个时候,iBATIS开始得到广泛的关注和使用,并逐渐成为Java开发者的首选持久层框架之一。
3. MyBatis:在2010年,iBATIS的开发团队决定将iBATIS改名为MyBatis。这个决定是为了避免与其他类似名称的项目混淆,并为项目带来更广泛的认可。
4. MyBatis 3:MyBatis 3版本于2011年发布。这个版本对框架进行了全面重写,引入了许多新功能和改进,包括动态SQL和注解支持。MyBatis 3在设计和性能上都有了很大的提升,使得它成为更加强大和灵活的持久层框架。
5. MyBatis 3.5:最新版本的MyBatis是3.5系列。在这个版本中,MyBatis进一步改进了性能和功能,包括新增了批量操作的支持、更好的错误处理能力以及更高级的动态SQL功能等。
通过不断地演进和改进,MyBatis在过去几年中一直保持着活跃的开发和更新,成为Java开发者中的首选框架之一。它的简单易用、灵活性强以及对SQL的优化等特点,使得它在各种规模的项目中都有着广泛的应用。
3.Mybatis的特点
MyBatis的主要特点包括:
简单:MyBatis采用简洁的配置和映射,使得开发人员只需关注SQL语句本身,而无需关注过多的框架细节。
灵活:MyBatis支持使用XML或注解方式进行SQL映射,开发人员可以根据实际需求选择合适的方式。
易于集成:MyBatis可以与Spring等常见的Java框架无缝集成,提供了方便的整合方式。
高效:MyBatis通过对象关系映射(ORM)技术,将数据库操作转化为Java对象的方法调用,提高了数据库访问的效率。
可定制化:MyBatis提供了丰富的插件机制,可以根据需要扩展和定制框架的功能。
二、Mybatis的配置
1.导入jar包
方便测试导入 包
2.配置文件
2.1在根目录下新建properties日志文件
在日志文件中写入如下代码(不创建会报错)
# Global logging configuration
log4j.rootLogger=DEBUG, stdout
# Console output...
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n
mybatis默认使用log4j作为输出日志信息。
2.2在根目录下新建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>
<!-- 和spring整合后 environments配置将废除-->
<environments default="development">
<environment id="development">
<!-- 使用jdbc事务管理-->
<transactionManager type="JDBC" />
<!-- 数据库连接池-->
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver" />
<property name="url" value="jdbc:mysql://localhost:3306/db_555?characterEncoding=utf-8" />
//数据库账号
<property name="username" value="root" />
//数据库密码
<property name="password" value="123456" />
</dataSource>
</environment>
</environments>
</configuration>
三、Mybatis对数据的增删改查
1.准备工作
需要创建一个User类和User.xml的配置文件
1.1新建用户类和配置文件
User.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="test">
</mapper>
mybatis框架需要加载映射文件,将User.xml添加在SqlMapConfig.xml,如下
<mappers>
<mapper resource="User.xml"></mapper>
</mappers>
2. 查询用户
id:方法名。parameterType:定义输入到sql中的映射类型,#{id}表示使用preparedstatement设置占位符号并将输入变量id传到sql。resultType:定义结果映射类型(全类名)。
2.1普通查询
<?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="test">
<!--通过id来查询用户-->
<select id="findUserById" parameterType="int" resultType="com.ba.domain.User">
select * from user where id = #{id}
</select>
<!--查询所有用户-->
<select id="findUser" resultType="com.ba.domain.User">
select * from user;
</mapper>
测试类
package com.ba.test;
import com.ba.domain.Student;
import com.ba.domain.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.Before;
import org.junit.Test;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
public class TestDemo {
SqlSessionFactory ssf = null;
@Before
public void creatFactory(){
try {
InputStream input = Resources.getResourceAsStream("SqlMapConfig.xml");
ssf = new SqlSessionFactoryBuilder().build(input);
} catch (IOException e) {
e.printStackTrace();
}
}
@Test
public void test(){
SqlSession sqlSession = ssf.openSession();
//查询全部用户
List<User> users = sqlSession.selectList("test.findUser");
for (User user : users) {
System.out.println(user);
}
System.out.println("=============================================");
//通过id查询用户
User user = (User) sqlSession.selectOne("test.findUserById", 6);
System.out.println(user);
}
}
运行结果
2.2模糊查询
配置文件(注意:如果是取简单数量类型的参数,括号中的值必须为value)
<!--模糊查询-->
<!--${value}%是查询第一个字-->
<!--%${value}%是查询包含这个字所有用户-->
<select id="findUserLike" parameterType="String" resultType="com.ba.domain.User">
select * from user where username like "${value}%"
</select>
#{}和${}
#{}表示一个占位符号,通过#{}可以实现preparedStatement向占位符中设置值,自动进行java类型和jdbc类型转换,#{}可以有效防止sql注入。 #{}可以接收简单类型值或pojo属性值。 如果parameterType传输单个简单类型值,#{}括号中可以是value或其它名称。一般用在=之后。
${}表示拼接sql串,通过${}可以将parameterType 传入的内容拼接在sql中且不进行jdbc类型转换, ${}可以接收简单类型值或pojo属性值,如果parameterType传输单个简单类型值,${}括号中只能是value。一般用在like之后。
测试类
package com.ba.test;
import com.ba.domain.Student;
import com.ba.domain.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.Before;
import org.junit.Test;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
public class TestDemo {
SqlSessionFactory ssf = null;
@Before
public void creatFactory(){
try {
InputStream input = Resources.getResourceAsStream("SqlMapConfig.xml");
ssf = new SqlSessionFactoryBuilder().build(input);
} catch (IOException e) {
e.printStackTrace();
}
}
@Test
public void test(){
SqlSession sqlSession = ssf.openSession();
List<User> users = sqlSession.selectList("test.findUserLike", "王");
for (User user : users) {
System.out.println(user);
}
}
}
运行结果
3.添加用户
配置文件
<insert id="addUser" parameterType="com.ba.domain.User">
<!-- selectKey将主键返回,需要再返回 -->
<selectKey keyProperty="id" order="AFTER" resultType="int">
select last_insert_id()
</selectKey>
insert into user(username,password,gender,hobby,address,remark) values(#{username},#{password},#{gender},#{hobby},#{address},#{remark})
</insert>
测试类
package com.ba.test;
import com.ba.domain.Student;
import com.ba.domain.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.Before;
import org.junit.Test;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
public class TestDemo {
SqlSessionFactory ssf = null;
@Before
public void creatFactory(){
try {
InputStream input = Resources.getResourceAsStream("SqlMapConfig.xml");
ssf = new SqlSessionFactoryBuilder().build(input);
} catch (IOException e) {
e.printStackTrace();
}
}
@Test
public void test1(){
SqlSession sqlSession = ssf.openSession();
User user = new User("尼古丁","123456","男","篮球","成都","000");
sqlSession.insert("test.addUser",user);
sqlSession.commit();
sqlSession.close();
}
}
运行结果
4.删除用户
配置文件
<!--通过id删除用户-->
<delete id="deleteUserById" parameterType="int">
delete from user where id = #{id}
</delete>
测试类
package com.ba.test;
import com.ba.domain.Student;
import com.ba.domain.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.Before;
import org.junit.Test;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
public class TestDemo {
SqlSessionFactory ssf = null;
@Before
public void creatFactory(){
try {
InputStream input = Resources.getResourceAsStream("SqlMapConfig.xml");
ssf = new SqlSessionFactoryBuilder().build(input);
} catch (IOException e) {
e.printStackTrace();
}
}
@Test
public void test(){
SqlSession sqlSession = ssf.openSession();
sqlSession.delete("test.deleteUserById",15);
sqlSession.commit();
sqlSession.close();
}
}
运行结果
5.修改用户
配置文件
<!--通过id修改用户-->
<update id="updateUser" parameterType="com.ba.domain.User">
update user set username=#{username},password=#{password},gender=#{gender},hobby=#{hobby},address=#{address},remark=#{remark} where id=#{id}
</update>
测试类
package com.ba.test;
import com.ba.domain.Student;
import com.ba.domain.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.Before;
import org.junit.Test;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
public class TestDemo {
SqlSessionFactory ssf = null;
@Before
public void creatFactory(){
try {
InputStream input = Resources.getResourceAsStream("SqlMapConfig.xml");
ssf = new SqlSessionFactoryBuilder().build(input);
} catch (IOException e) {
e.printStackTrace();
}
}
@Test
public void test(){
SqlSession sqlSession = ssf.openSession();
User user = new User();
user.setId(10);
user.setUsername("小黑");
user.setPassword("123");
user.setGender("女");
user.setHobby("唱歌");
user.setAddress("北京");
user.setRemark("12233");
sqlSession.update("test.updateUser",user);
sqlSession.commit();
sqlSession.close();
}
}
运行结果
运行前
运行后