Mybatis --- 入门简介
2018-02-27 21:54
453 查看
一、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编程中对结果的解析处理过程。
三、入门案例
pom.xml
SqlMapConfig.xml配置文件
User实体类
UserMapper接口
UserMapper接口映射文件UserMapper.xml
db.properties数据库资源文件
log4j.properties日志资源文件
UserMapperTest测试类
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编程中对结果的解析处理过程。
三、入门案例
pom.xml
<dependencies> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.2.8</version> </dependency> <dependency> <groupId>asm</groupId> <artifactId>asm</artifactId> <version>3.3.1</version> </dependency> <dependency> <groupId>cglib</groupId> <artifactId>cglib</artifactId> <version>2.2</version> </dependency> <dependency> <groupId>commons-logging</groupId> <artifactId>commons-logging</artifactId> <version>1.1.3</version> </dependency> <dependency> <groupId>org.javassist</groupId> <artifactId>javassist</artifactId> <version>3.17.1-GA</version> </dependency> <dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>1.2.17</version> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> <version>1.7.5</version> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-log4j12</artifactId> <version>1.7.5</version> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.27</version> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> </dependency> </dependencies>
SqlMapConfig.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> <!-- 配置属性 先加载内部属性,再加载外部属性,如果有同名属性会覆盖。 --> <properties resource="db.properties"> <property name="jdbc.driver" value="com.mysql.jdbc.Driver"/> <property name="jdbc.url" value="jdbc:mysql://localhost:3306/mybatis?characterEncoding=utf-8"/> <property name="jdbc.username" value="root"/> </properties> <!-- 配置pojo别名 --> <typeAliases> <!-- <typeAlias type="cn.mybatis.po.User" alias="user"/> --> <!-- 扫描包的形式创建别名,别名就是类名,不区分大小写 --> <package name="cn.mybatis.po"/> </typeAliases> <!-- 和spring整合后 environments配置将废除--> <environments default="development"> <environment id="development"> <!-- 使用jdbc事务管理--> <transactionManager type="JDBC" /> <!-- 数据库连接池--> <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> <!-- 加载mapper文件 --> <mappers> <!-- resource基于classpath查找 --> <!--<mapper resource="sqlmap/user.xml"/>--> <!-- <mapper resource="mapper/mapper.xml"/> --> <!-- 根据接口名称加载mapper文件 要求:1、mapper映射文件和接口在同一个目录下 2、mapper映射文件的名称和接口名称一致。 3、class就是接口的权限定名 --> <!-- <mapper class="cn.mybatis.mapper.UserMapper"/> --> <!-- 使用扫描包的形式加载mapper文件 --> <package name="cn.mybatis.mapper"/> </mappers> </configuration>
User实体类
package cn.mybatis.po; import java.util.Date; import java.util.List; public class User { private Integer id; private String username;// 用户姓名 private String sex;// 性别 private Date birthday;// 生日 private String address;// 地址 private List<Orders> orders; public List<Orders> getOrders() { return orders; } public void setOrders(List<Orders> orders) { this.orders = orders; } public Integer getId() { return id; } @Override public String toString() { return "User [id=" + id + ", username=" + username + ", sex=" + sex + ", birthday=" + birthday + ", address=" + address + "]"; } public void setId(Integer id) { this.id = id; } public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getSex() { return sex; } public void setSex(String sex) { this.sex = sex; } public Date getBirthday() { return birthday; } public void setBirthday(Date birthday) { this.birthday = birthday; } public String getAddress() { return address; } public void setAddress(String address) { this.address = address; } }
UserMapper接口
package cn.mybatis.mapper; import cn.mybatis.po.QueryVo; import cn.mybatis.po.User; import java.util.List; public interface UserMapper { User getUserById(int id); List<User> getUserByName(String username); void insertUser(User user); User getUserByQueryVo(QueryVo queryVo); Integer getUserCount(); List<User> findUserList(User user); List<User> findUserByIds(QueryVo queryVo); }
UserMapper接口映射文件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"> <!-- #{}作用就是占位符,相当于jdbc的“?” parameterType:查询的参数类型 resultType:查询结果的数据类型,如果时候pojo应该给全路径。 --> <!-- mapper代理的开发规则: 1、namespace必须时候接口的全限定名 2、Statementid必须和接口的方法名称一致 3、接口方法的参数类型要和parameterType要一致 4、接口方法的返回值类型要和resultType一致 --> <mapper namespace="cn.mybatis.mapper.UserMapper"> <!-- 别名不区分大小写 --> <select id="getUserById" parameterType="int" resultType="USer"> SELECT * FROM `user` WHERE id=#{id}; </select> <!-- 如果查询结果返回list, resultType设置为list中一个元素的数据类型 ${}字符串拼接指令 --> <select id="getUserByName" parameterType="string" resultType="cn.mybatis.po.User"> SELECT * FROM `user` WHERE username LIKE '%${value}%' </select> <!-- 参数时候pojo时,#{}中的名称就是pojo的属性 --> <insert id="insertUser" parameterType="cn.mybatis.po.User"> <!-- keyProperty:对于pojo的主键属性 resultType:对应主键的数据类型 order:是在insert语句执行之前或者之后。 如果使用uuid做主键,应该先生成主键然后插入数据,此时应该使用Before --> <selectKey keyProperty="id" resultType="int" order="AFTER"> SELECT LAST_INSERT_ID() </selectKey> INSERT into user (username,birthday,sex,address) values (#{username}, #{birthday}, #{sex}, #{address}) </insert> <select id="getUserByQueryVo" parameterType="queryvo" resultType="user"> SELECT * FROM `user` WHERE id=#{user.id}; </select> <!-- 查询用户表中的记录数 --> <select id="getUserCount" resultType="int"> SELECT count(*) FROM `user` </select> <sql id="find_user_list_where"> <where> <if test="id!=null"> and id=#{id} </if> <if test="username != null and username != ''"> and username like '%${username}%' </if> </where> </sql> <sql id="user_field_list"> id,username,birthday,sex,address </sql> <select id="findUserList" parameterType="user" resultType="user"> select <include refid="user_field_list"/> from user <include refid="find_user_list_where"/> </select> <!-- 动态sql foreach测试 --> <select id="findUserByIds" parameterType="queryvo" resultType="user"> SELECT <include refid="user_field_list"/> FROM `user` <where> <!-- and id in(1,10,20,21,31) --> <foreach collection="ids" item="id" open="and id in(" close=")" separator=","> #{id} </foreach> </where> </select> </mapper>
db.properties数据库资源文件
jdbc.driver=com.mysql.jdbc.Driver jdbc.url=jdbc:mysql://localhost:3306/mybatis?characterEncoding=utf-8 jdbc.username=root jdbc.password=root
log4j.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
UserMapperTest测试类
package cn.mybatis.mapper; import static org.junit.Assert.*; import java.io.InputStream; import java.util.ArrayList; import java.util.List; 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 cn.mybatis.po.QueryVo; import cn.mybatis.po.User; public class UserMapperTest { private SqlSessionFactory sqlSessionFactory = null; @Before public void init() throws Exception { // 第一步:创建一个SQLSessionFactoryBuilder对象。 SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder(); // 第二步:加载配置文件。 InputStream inputStream = Resources.getResourceAsStream("SqlMapConfig.xml"); // 第三步:创建SQLSessionFactory对象 sqlSessionFactory = sqlSessionFactoryBuilder.build(inputStream); } @Test public void testGetUserById() { //和spring整合后省略 SqlSession sqlSession = sqlSessionFactory.openSession(); //获得代理对象 UserMapper userMapper = sqlSession.getMapper(UserMapper.class); User user = userMapper.getUserById(10); System.out.println(user); //和spring整合后省略 sqlSession.close(); } @Test public void testGetUserByName() { SqlSession sqlSession = sqlSessionFactory.openSession(); UserMapper userMapper = sqlSession.getMapper(UserMapper.class); List<User> list = userMapper.getUserByName("张"); for (User user : list) { System.out.println(user); } sqlSession.close(); } @Test public void testgetUserByQueryVo() { SqlSession sqlSession = sqlSessionFactory.openSession(); //获得mapper代理对象 UserMapper userMapper = sqlSession.getMapper(UserMapper.class); //创建一个QueryVo对象 QueryVo queryVo = new QueryVo(); User user = new User(); user.setId(10); queryVo.setUser(user); //执行查询 User result = userMapper.getUserByQueryVo(queryVo); System.out.println(result); sqlSession.close(); } @Test public void testgetUserCount() { SqlSession sqlSession = sqlSessionFactory.openSession(); //获得mapper代理对象 UserMapper userMapper = sqlSession.getMapper(UserMapper.class); //执行查询 int count = userMapper.getUserCount(); System.out.println(count); sqlSession.close(); } @Test public void testFindUserList() { SqlSession sqlSession = sqlSessionFactory.openSession(); //获得mapper代理对象 UserMapper userMapper = sqlSession.getMapper(UserMapper.class); //设置查询条件 User user = new User(); //user.setId(10); user.setUsername("张"); //执行查询 List<User> userList = userMapper.findUserList(user); for (User user2 : userList) { System.out.println(user2); } sqlSession.close(); } @Test public void testFindUserByIds() { SqlSession sqlSession = sqlSessionFactory.openSession(); //获得mapper代理对象 UserMapper userMapper = sqlSession.getMapper(UserMapper.class); //设置查询条件 QueryVo queryVo = new QueryVo(); List<Integer> ids = new ArrayList<Integer>(); ids.add(1); ids.add(10); ids.add(16); ids.add(22); queryVo.setIds(ids); //执行查询 List<User> userList = userMapper.findUserByIds(queryVo); for (User user2 : userList) { System.out.println(user2); } sqlSession.close(); } }
相关文章推荐
- mybatis入门及mybatis原理简介
- Mybatis入门之简介
- mybatis学习笔记,简介及快速入门
- mybatis系列-简介以及入门(一)
- MyBatis入门(一) -- 简介
- 【Mybatis】(一)简介及入门
- mybatis入门基础(一)JDBC的简介以及Mybatis的入门程序
- Mybatis-01-简介及入门
- 【MyBatis】第一章:MyBatis的简介和入门使用
- mybatis-spring 学习笔记之简介与入门
- MyBatis入门实例简介
- Mybatis快速入门(一)--入门简介
- Mybatis入门到精通-Mybatis简介
- MyBatis入门实例简介
- MyBatis入门(四)
- WTK使用简介——使用入门
- mybatis从入门到精通
- MQ入门简介
- 【无线安全实践入门】常见攻击手段与常用攻击工具简介
- mybatis3.X入门学习demo