Mybatis介绍
MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBatis 。
2013年11月迁移到Github。MyBatis是一个优秀的持久层框架,它对jdbc的操作数据库的过程进行封装,使开发者只需要关注 SQL 本身,而不需要花费精力去处理例如注册驱动、创建connection、创建statement、手动设置参数、结果集检索等jdbc繁杂的过程代码。Mybatis通过xml或注解的方式将要执行的各种statement(statement、preparedStatemnt、CallableStatement)配置起来,并通过java对象和statement中的sql进行映射生成最终执行的sql语句,最后由mybatis框架执行sql并将结果映射成java对象并返回。
Mybatis框架
框架介绍
1、 mybatis配置
SqlMapConfig.xml,此文件作为mybatis的全局配置文件,配置了mybatis的运行环境等信息。
mapper.xml文件即sql映射文件,文件中配置了操作数据库的sql语句。此文件需要在SqlMapConfig.xml中加载。
2、 通过mybatis环境等配置信息构造SqlSessionFactory即会话工厂
3、 由会话工厂创建sqlSession即会话,操作数据库需要通过sqlSession进行。
4、 mybatis底层自定义了Executor执行器接口操作数据库,Executor接口有两个实现,一个是基本执行器、一个是缓存执行器。
5、 Mapped Statement也是mybatis一个底层封装对象,它包装了mybatis配置信息及sql映射信息等。mapper.xml文件中一个sql对应一个Mapped Statement对象,sql的id即是Mapped statement的id。
6、 Mapped Statement对sql执行输入参数进行定义,包括HashMap、基本类型、pojo,Executor通过Mapped Statement在执行sql前将输入的java对象映射至sql中,输入参数映射就是jdbc编程中对
preparedStatement设置参数。
7、 Mapped Statement对sql执行输出结果进行定义,包括HashMap、基本类型、pojo,Executor通过Mapped Statement在执行sql后将输出结果映射至java对象中,输出结果映射过程相当于jdbc编程
中对结果的解析处理过程。
利用IDEA创建Mybatis的入门案例
8个步骤
- 创建maven工程,什么都不选就ok,并导入坐标;
1 <packaging>jar</packaging> 2 <dependencies> 3 <dependency> 4 <groupId>org.mybatis</groupId> 5 <artifactId>mybatis</artifactId> 6 <version>3.4.5</version> 7 </dependency> 8 <dependency> 9 <groupId>mysql</groupId> 10 <artifactId>mysql-connector-java</artifactId> 11 <version>5.1.6</version> 12 </dependency> 13 <dependency> 14 <groupId>log4j</groupId> 15 <artifactId>log4j</artifactId> 16 <version>1.2.12</version> 17 </dependency> 18 19 <dependency> 20 <groupId>junit</groupId> 21 <artifactId>junit</artifactId> 22 <version>4.10</version> 23 </dependency> 24 </dependencies>
- 编写User实体类
1 public class User implements Serializable { 2 private int id; 3 private String username;// 用户姓名 4 private String sex;// 性别 5 private Date birthday;// 生日 6 private String address;// 地址 7 8 public int getId() { 9 return id; 10 } 11 12 public void setId(int id) { 13 this.id = id; 14 } 15 16 public String getUsername() { 17 return username; 18 } 19 20 public void setUsername(String username) { 21 this.username = username; 22 } 23 24 public String getSex() { 25 return sex; 26 } 27 28 public void setSex(String sex) { 29 this.sex = sex; 30 } 31 32 public Date getBirthday() { 33 return birthday; 34 } 35 36 public void setBirthday(Date birthday) { 37 this.birthday = birthday; 38 } 39 40 public String getAddress() { 41 return address; 42 } 43 44 public void setAddress(String address) { 45 this.address = address; 46 } 47 48 @Override 49 public String toString() { 50 return "User [id=" + id + ", username=" + username + ", sex=" + sex 51 + ", birthday=" + birthday + ", address=" + address + "]"; 52 } 53 54 }
3.在resources文件夹中,创建Mybatis的主配置文件SqlMapConfig.xml。它是mybatis核
心配置文件,配置文件内容为数据源、事务管理。
配置环境:
- 配置mysql的环境:
- 配置事务的类型;
- 配置连接池:配置连接数据库的4个基本信息
- 指定映射配置文件的位置:
1 <?xml version="1.0" encoding="UTF-8"?> 2 <!DOCTYPE configuration 3 PUBLIC "-//mybatis.org//DTD Config 3.0//EN" 4 "http://mybatis.org/dtd/mybatis-3-config.dtd"> 5 6 <configuration> 7 <!-- 配置环境--> 8 <environments default="mysql"> 9 <!--配置mysql的环境--> 10 <environment id="mysql"> 11 <!--配置事务的类型--> 12 <transactionManager type="JDBC"></transactionManager> 13 <!--配置连接池--> 14 <dataSource type="POOLED"> 15 <!--配置连接数据库的4个基本信息--> 16 <property name="driver" value="com.mysql.jdbc.Driver"/> 17 <property name="url" value="jdbc:mysql://192.168.214.128:3306/mybatis"/> 18 <property name="username" value="root"/> 19 <property name="password" value="ben123"/> 20 </dataSource> 21 </environment> 22 </environments> 23 24 <!--指定映射配置文件的位置,映射配置文件指的是每个dao独立的配置文件--> 25 <mappers> 26 <mapper resource="com/ben/dao/IUserDao.xml"/> 27 </mappers> 28 </configuration>
- 在resources文件夹中导入log4j.properties文件
1 <?xml version="1.0" encoding="UTF-8" ?> 2 3 <!DOCTYPE log4j:configuration SYSTEM 4 "http://logging.apache.org/log4j/1.2/apidocs/org/apache/log4j/xml/doc-files/log4j.dtd"> 5 <log4j:configuration debug="true"> 6 <appender name="log.console" class="org.apache.log4j.ConsoleAppender"> 7 <layout class="org.apache.log4j.PatternLayout"> 8 <param name="ConversionPattern" value="%d{yyyy-MM-dd HH:mm:ss,SSS} %5p (%C{1}:%M) - %m%n" /> 9 </layout> 10 </appender> 11 <!-- --> 12 <logger name="org.apache.ibatis"> 13 <level value="info" /> 14 <appender-ref ref="log.console" /> 15 </logger> 16 17 <logger name="cn.kgc"> 18 <level value="debug" /> 19 <appender-ref ref="log.console" /> 20 </logger> 21 </log4j:configuration>
5.编写映射文件 IUserDao.xml ,位置在目录resource->sqlmap->User.xml
1 <?xml version="1.0" encoding="UTF-8" ?> 2 <!DOCTYPE mapper 3 PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" 4 "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> 5 <!-- namespace:命名空间,用于隔离sql,还有一个很重要的作用,后面会讲 --> 6 <mapper namespace="test"> 7 </mapper>
6.加载映射文件,将User.xml添加在SqlMapConfig.xml下
1 <mappers> 2 <mapper resource="sqlmao/User.xml"/> 3 </mappers>
- 编写测试类:在test->java目录下创建测试类com.ben.test.MybatisTest。实现业务需求,共7步,其中2,3步可以合在一起。
1 1. 加载核心配置文件SqlMapConfig.xml 2 2. 创建SqlSessionFactoryBuilder对象 3 3. 创建SqlSessionFactory对象(2,3可以写一起) 4 4. 创建SqlSession对象 5 5. 执行SqlSession对象执行查询,获取结果User 6 6. 打印结果 7 7. 释放资源
package com.ben.test; import com.ben.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.Test; import java.io.IOException; import java.io.InputStream; import java.util.Date; import java.util.List; /** * @ClassName: MybatisTest * @author: benjamin * @version: 1.0 * @description: TODO * @createTime: 2019/07/13/11:50 */ public class MybatisTest { public static void main(String[] args) { } //通过Id查询一个用户 @Test public void testSearchById() throws IOException { //1.读取配置文件 InputStream in = Resources.getResourceAsStream("SqlMapConfig.xml"); //2.创建SqlSessionFactory工厂 SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(in); //3.使用工厂生产SqlSession对象 SqlSession session = sqlSessionFactory.openSession(); //4.执行Sql语句 User user = session.selectOne("test.findUserById", 10); //5. 打印结果 System.out.println(user); //6.释放资源 session.close(); in.close(); } //根据用户名模糊查询用户列表 @Test public void testFindUserByUsername() throws IOException { //1.读取配置文件 InputStream in = Resources.getResourceAsStream("SqlMapConfig.xml"); //2.创建SqlSessionFactory工厂 SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(in); //3.使用工厂生产SqlSession对象 SqlSession session = sqlSessionFactory.openSession(); //4.执行Sql语句 List<User> list = session.selectList("test.findUserByUsername", "王"); //5. 打印结果 for (User user:list) { System.out.println(user); } //6.释放资源 session.close(); in.close(); } //添加用户 @Test public void testInsertUser() throws IOException { //1.读取配置文件 InputStream in = Resources.getResourceAsStream("SqlMapConfig.xml"); //2.创建SqlSessionFactory工厂 SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(in); //3.使用工厂生产SqlSession对象 SqlSession sqlSession = sqlSessionFactory.openSession(); //4.执行Sql语句 User user = new User(); user.setUsername("小强"); user.setBirthday(new Date()); user.setAddress("sadfsafsafs"); user.setSex("2"); int i = sqlSession.insert("test.insertUser", user); sqlSession.commit(); //5. 打印结果 // 刚保存用户,此时用户ID需要返回。执行完上面insert程序后,此时就能知道用户的ID是多少 // 需要在User.xml文件中配置 System.out.println("插入id:"+user.getId());//插入id:30 //6.释放资源 sqlSession.close(); in.close(); } //更新用户 @Test public void testUpdateUserById() throws IOException { //1.读取配置文件 InputStream in = Resources.getResourceAsStream("SqlMapConfig.xml"); //2.创建SqlSessionFactory工厂 SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(in); //3.使用工厂生产SqlSession对象 SqlSession sqlSession = sqlSessionFactory.openSession(); //4.执行Sql语句 User user = new User(); user.setId(27); user.setUsername("小小"); user.setBirthday(new Date()); user.setAddress("西安市"); user.setSex("1"); int i = sqlSession.insert("test.updateUserById", user); sqlSession.commit(); //5. 打印结果 System.out.println(user.getId()); //6.释放资源 sqlSession.close(); in.close(); } //删除用户 @Test public void testDeleteUserById() throws IOException { //1.读取配置文件 InputStream in = Resources.getResourceAsStream("SqlMapConfig.xml"); //2.创建SqlSessionFactory工厂 SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(in); //3.使用工厂生产SqlSession对象 SqlSession sqlSession = sqlSessionFactory.openSession(); //4.执行Sql语句 int i = sqlSession.insert("test.deleteUserById", 32); sqlSession.commit(); //5. 打印结果 System.out.println(i); //6.释放资源 sqlSession.close(); in.close(); } }
- 配置映射配置文件User.xml
1 <?xml version="1.0" encoding="UTF-8" ?> 2 <!DOCTYPE mapper 3 PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" 4 "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> 5 <!--namespace:用来区别不同的类的名字 --> 6 <mapper namespace="test"> 7 8 <!-- 通过Id查询一个用户 --> 9 <select id="findUserById" parameterType="Integer" resultType="com.ben.domain.User"> 10 select * from user where id = #{v} 11 </select> 12 13 <!-- 根据用户名模糊查询用户列表 --> 14 <!-- select * from user where username like '%${value}%'--> 15 <!-- select * from user where username like "%"#{value}"%"--> 16 <select id="findUserByUsername" parameterType="String" resultType="com.ben.domain.User"> 17 select * from user where username like #{username} 18 </select> 19 <!-- 添加用户 --> 20 <insert id="insertUser" parameterType="com.ben.domain.User"> 21 <selectKey keyProperty="id" resultType="Integer" order="AFTER"> 22 select LAST_INSERT_ID() 23 </selectKey> 24 insert into user (username,birthday,address,sex) values(#{username},#{birthday},#{address},#{sex}) 25 </insert> 26 <!-- 更新用户 --> 27 <update id="updateUserById" parameterType="com.ben.domain.User"> 28 update user 29 set username = #{username},sex = #{sex},birthday = #{birthday},address = #{address} 30 where id = #{id} 31 </update> 32 <!-- 删除用户 --> 33 <delete id="deleteUserById" parameterType="Integer"> 34 delete from user 35 where id = #{vvvvv} 36 </delete> 37 </mapper>
mybatis官网:http://www.mybatis.org/mybatis-3/zh/sqlmap-xml.html