目录
一.介绍
MyBatis是一个基于Java的持久层框架,提供的持久层框架包括SQL Maps和Data Access Objects(DAO)。
持久层:存储在硬盘中,不会断电消失的数据。
SQL Maps:指的是数据库中的数据和Java数据的映射关系。也就是MyBatis封装JDBC的过程。
框架本质就是 jar包+配置文件。
1.MyBatis的特性
1.支持定制化SQL,存储过程以及高级映射的持久层框架
定制化SQL:SQL语句需要自己去写。
存储过程:是MySQL高级学习的内容
普通映射:利用JDBC访问数据库的过程中,自己封装了JDBC工具类,每当把数据从数据库中查询出来后,都会根据反射将它对应Java中的实体类对象,要求是字段名必须跟类的属性名保持一致,否则是映射不了的。
高级映射:实体类中的属性,通过SQL是查询不到的,比如一对多的关系,多对一的关系,这是表和表之间的关系,那么对应的Java中的实体类之间也需要有关系。用SQL查询出来的数据无法对应某个实体或实体的集合。
2.避免手动设置参数和获取结果集
3.可以使用简单的XML或注解用于配置和原始映射,将接口和Java的POJO映射成数据库中的记录。
sql语句可以写到xml文件中,或写在注解中。
4.是一个半自动的ORM(Object Relation Mapping)框架
JDBC就是手动,所有的过程都要自己去写。
半自动就是封装了部分的功能,像sql还是需要自己写,也可以自己处理映射关系
ORM:对象关系映射,对象指的是Java实体对象,关系指的是关系型数据库,其实就是将Java中的实体类对象和关系型数据库中的数据创建映射关系。
二.初识MyBatis的增删改查
目录结构
1.预备步骤
Step1:创建maven工程
Step2:在pom.xml中添加mybatis相关的依赖
<dependencies> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.5.7</version> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> <scope>test</scope> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.27</version> </dependency> </dependencies>
Step3:在resources下面创建mybatis-config.xml文件(核心配置文件)
核心配置文件详解-配置关于mybatis的相关信息。
在ssm整合后,可以没有这个配置文件,核心配置文件中所配置的内容可以交给spring管理。
<?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> <!-- 引入资源文件--> <properties resource="jdbc.properties"/> <!--设置类型别名--> <typeAliases> <!-- 用一个别名User,来代替全类名pojo.User,这个别名不区分大小写 如果不写alias属性,那么就会分配一个默认的别名,这个默认的别名就是类名且不区分大小写 所以写了个User和不写效果一样 --> <!-- <typeAlias type="pojo.User" alias="User"></typeAlias>--> <!-- 以包为单位,给包下所有的类设置默认别名,这里给pojo下面所有的包都设置了默认别名且不区分大小写,这个比较常用--> <package name="pojo"/> </typeAliases> <!-- 配置链接数据库的环境 不管有多少个环境,也只能选择其中一个使用,default表示默认使用哪个环境 --> <environments default="development"> <!-- 配置某个具体的环境每一个environment标签都是一个连接具体数据库的环境 id:表示连接数据库环境的一个唯一标识,不能重复 --> <environment id="development"> <!-- 设置事务管理器的类型,JDBC类型需要手动提交事务 JDBC:表示当前环境中,执行SQL时,使用的是JDBC中原生的事务管理方式,原生指的是 提交就是commit,回滚就是rollback,事务的提交和回滚需要手动处理 MANAGED:被管理,例如被Spring事务 --> <transactionManager type="JDBC"/> <!-- dataSource:配置数据源 type:POOLED 设置数据源的类型,表示使用数据库连接池来缓存数据库连接 type:UNPOOLED 表示不使用数据库连接池来缓存数据库连接 type:JNDI 表示上下文中的数据源 ssm整合之后就不需要设置数据源了, spring提供数据源 --> <dataSource type="POOLED"> <property name="driver" value="${jdbc.driver}"/> <property name="url" value="${jdbc.url}"/> <property name="username" value="${jdbc.username}"/> <property name="password" value="${jdbc.password}"/> </dataSource> </environment> </environments> <!-- 引入映射文件--> <mappers> <!-- resources下面的不叫包(和包的图像不同),是具体的资源,包是装Java类的,所以这里要以路径的方式引入--> <!-- <mapper resource="mappers/UserMapper.xml"/>--> <!-- 以包为单位引入映射文件时需要满足两点 1.mapper接口所在的包要和映射文件所在的包一致,即包名要一样 2.mapper接口要和映射文件的名字一致 --> <package name="mapper"/> </mappers> </configuration>
Step4:创建数据库mybatis和表t_user
Step5:创建pojo类对应t_user表
属性要和字段名相同,如果字段名有_,那么属性名就用驼峰命名法,查询字段时时用别名查询。
public class User { //保证属性名和字段名一致 private Integer id; private String username; private String password; private Integer age; private String sex; private String email; public User() { } public User(Integer id, String username, String password, Integer age, String sex, String email) { this.id = id; this.username = username; this.password = password; this.age = age; this.sex = sex; 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 getSex() { return sex; } public void setSex(String sex) { this.sex = sex; } public String getEmail() { return email; } public void setEmail(String email) { this.email = email; } @Override public String toString() { return "User{" + "id=" + id + ", username='" + username + '\'' + ", password='" + password + '\'' + ", age=" + age + ", sex='" + sex + '\'' + ", email='" + email + '\'' + '}'; } }
Step6:创建mapper接口
现在在数据库中有了表,在Java中有了对应的对象。在Java中定义方法去操作表中的数据,就需要mapper来实现。
mapper就是JDBC中的DAO,一个mapper对应一个表。
//当调用接口中的方法,它会自动去匹配一个方法并且执行 public interface UserMapper { /* MyBatis面向接口编程的两个一致 1.mapper接口的映射文件的namespace要和mapper接口的全类名保持一致 2.映射文件中sql语句的id要和mapper接口中的方法名一致 表-实体类-mapper接口-mapper映射文件 一一对应 */ }
Step7:创建mapper的配置文件UserMapper.xml
就像是mapper接口的实现类,来写具体方法内的sql语句。
<?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="mapper.UserMapper"> </mapper>
Step8:在测试类中通过一系列步骤拿到mapper对象来执行mapper里面的方法
public class MyBatisTest { @Test public void testMyBatis() throws IOException { //加载核心配置文件 InputStream resourceAsStream = Resources.getResourceAsStream("mybatis-config.xml"); //获取sqlSessionFactoryBuilder SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder(); //获取sqlSessionFactory对象 SqlSessionFactory factory = builder.build(resourceAsStream); //获取SqlSession,sqlSession代表Java程序和数据库之间的会话。就像HttpSession是Java程序和浏览器之间的会话 //SqlSession默认不自动提交事务,若需要自动提交事务可以在openSession方法中设置为true SqlSession sqlSession = factory.openSession(true);//设置true可以自动提交事务 //获取mapper接口对象,这个方法的底层用到了代理模式,在底层为接口创建了实现类。 UserMapper mapper = sqlSession.getMapper(UserMapper.class); //测试功能,通过mapper调用接口中的方法 }
2.最简单的增删改查操作
1)插入数据
Step1:在UserMapper接口中添加方法
//添加用户信息 int insertUser();
Step2:在UserMapper.xml中添加配置
<!-- int insertUser();--> <insert id="insertUser"> insert into t_user values(null,'admin','123',23,'男','123@qq.com') </insert>
Step3:在测试类中测试
int result = mapper.insertUser(); //sqlSession.commit();//手动提交事务,如果前面openSession中设置了true可以省略该句 System.out.println(result);
2)更新数据
Step1:
//修改用户信息 void updateUser();
Step2:
<!-- void updateUser();--> <update id="updateUser"> update t_user set username = '张三' where id = 12; </update>
3)删除数据
Step1:
//删除用户信息 void deleteUser();
Step2:
<!-- void deleteUser();--> <delete id="deleteUser"> delete from t_user where id=12; </delete>
4)查询数据
Step1:
User getUserById(); //查询所有用户信息 List<User> getAllUser();
Step2:
<!-- User getUserById();--> <!-- resultType:设置默认映射关系,自动将查询出的结果表的字段名来作为属性名来给对象赋值,如果匹配到就赋值,匹配不到就不赋值将查询出来的结果转换成设置好的结果类型,再将结果作为返回值返回到这个方法--> <!-- resultMap:设置自定义的映射关系,处理字段名和属性名不一致的情况,还有一对多和多对一的关系--> <select id="getUserById" resultType="pojo.User"> select * from t_user where id=13; </select> <!-- List<User> getAllUser();--> <select id="getAllUser" resultType="pojo.User"> select * from t_user; </select>
3.功能优化
1.自动提交
int result = mapper.insertUser();
sqlSession.commit();
/*
因为核心配置文件<transactionManager type="JDBC"/>设置为tyep,所以需要手动提交事务
在执行sql后提交
*/
2.日志功能
1.在pom.xml中添加依赖
<!-- 日志信息--> <dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>1.2.12</version> </dependency>
2.在resources下面创建log4j.xml
<?xml version="1.0" encoding&