Mybatis 入门到理解篇
-
MyBatis
本教程是用maven构建项目、不会maven的看这篇文章!-----Maven教程
- 开发工具:idea
- 语言:java
- 项目结构:maven项目
- mysql数据库
本教程有 MyBatis三种开发方式:
mybatis本地调试、代理开发方式、传统开发方式!
1、入门案例
1.1、db.properties文件
- <span style="font-size:18px;">jdbc.driver=com.mysql.jdbc.Driver
- jdbc.url=jdbc:mysql://localhost:3306/mybatis?characterEncoding=UTF-8
- jdbc.username=用户名
- jdbc.password=密码</span>
1.1.1SQL语句、数据表
- /*
- SQLyog v10.2
- MySQL - 5.1.72-community : Database - mybatis
- *********************************************************************
- */
- /*Table structure for table `items` */
- CREATE TABLE `items` (
- `id` int(11) NOT NULL AUTO_INCREMENT,
- `name` varchar(32) NOT NULL COMMENT '商品名称',
- `price` float(10,1) NOT NULL COMMENT '商品定价',
- `detail` text COMMENT '商品描述',
- `pic` varchar(64) DEFAULT NULL COMMENT '商品图片',
- `createtime` datetime NOT NULL COMMENT '生产日期',
- PRIMARY KEY (`id`)
- ) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8;
- /*Table structure for table `orderdetail` */
- CREATE TABLE `orderdetail` (
- `id` int(11) NOT NULL AUTO_INCREMENT,
- `orders_id` int(11) NOT NULL COMMENT '订单id',
- `items_id` int(11) NOT NULL COMMENT '商品id',
- `items_num` int(11) DEFAULT NULL COMMENT '商品购买数量',
- PRIMARY KEY (`id`),
- KEY `FK_orderdetail_1` (`orders_id`),
- KEY `FK_orderdetail_2` (`items_id`),
- CONSTRAINT `FK_orderdetail_1` FOREIGN KEY (`orders_id`) REFERENCES `orders` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION,
- CONSTRAINT `FK_orderdetail_2` FOREIGN KEY (`items_id`) REFERENCES `items` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION
- ) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8;
- /*Table structure for table `orders` */
- CREATE TABLE `orders` (
- `id` int(11) NOT NULL AUTO_INCREMENT,
- `user_id` int(11) NOT NULL COMMENT '下单用户id',
- `number` varchar(32) NOT NULL COMMENT '订单号',
- `createtime` datetime NOT NULL COMMENT '创建订单时间',
- `note` varchar(100) DEFAULT NULL COMMENT '备注',
- PRIMARY KEY (`id`),
- KEY `FK_orders_1` (`user_id`),
- CONSTRAINT `FK_orders_id` FOREIGN KEY (`user_id`) REFERENCES `user` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION
- ) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8;
- /*Table structure for table `user` */
- CREATE TABLE `user` (
- `id` int(11) NOT NULL AUTO_INCREMENT,
- `username` varchar(32) NOT NULL COMMENT '用户名称',
- `birthday` date DEFAULT NULL COMMENT '生日',
- `sex` char(1) DEFAULT NULL COMMENT '性别',
- `address` varchar(256) DEFAULT NULL COMMENT '地址',
- PRIMARY KEY (`id`)
- ) ENGINE=InnoDB AUTO_INCREMENT=27 DEFAULT CHARSET=utf8;
插入数据:
- /*
- SQLyog v10.2
- MySQL - 5.1.72-community : Database - mybatis
- *********************************************************************
- */
- /*Data for the table `items` */
- insert into `items`(`id`,`name`,`price`,`detail`,`pic`,`createtime`) values (1,'台式机',3000.0,'该电脑质量非常好!!!!',NULL,'2016-02-03 13:22:53'),(2,'笔记本',6000.0,'笔记本性能好,质量好!!!!!',NULL,'2015-02-09 13:22:57'),(3,'背包',200.0,'名牌背包,容量大质量好!!!!',NULL,'2016-02-06 13:23:02');
- /*Data for the table `orderdetail` */
- insert into `orderdetail`(`id`,`orders_id`,`items_id`,`items_num`) values (1,3,1,1),(2,3,2,3),(3,4,3,4),(4,4,2,3);
- /*Data for the table `orders` */
- insert into `orders`(`id`,`user_id`,`number`,`createtime`,`note`) values (3,1,'1000010','2016-02-04 13:22:35',NULL),(4,1,'1000011','2016-02-03 13:22:41',NULL),(5,10,'1000012','2016-02-12 16:13:23',NULL);
- /*Data for the table `user` */
- insert into `user`(`id`,`username`,`birthday`,`sex`,`address`) values (1,'王五',NULL,'2',NULL),(10,'张三','2016-07-10','1','北京市'),(16,'张小明',NULL,'1','河南郑州'),(22,'陈小明',NULL,'1','河南郑州'),(24,'张三丰',NULL,'1','河南郑州'),(25,'陈小明',NULL,'1','河南郑州'),(26,'王五',NULL,NULL,NULL);
1.2、pom.xml文件
- <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
- <modelVersion>4.0.0</modelVersion>
- <groupId>web-test-com</groupId>
- <artifactId>MyBatis</artifactId>
- <version>0.0.1-SNAPSHOT</version>
- <packaging>war</packaging>
- <dependencies>
- <dependency>
- <groupId>junit</groupId>
- <artifactId>junit</artifactId>
- <version>4.12</version>
- <scope>provided</scope>
- </dependency>
- <dependency>
- <groupId>log4j</groupId>
- <artifactId>log4j</artifactId>
- <version>1.2.17</version>
- </dependency>
- <dependency>
- <groupId>org.mybatis</groupId>
- <artifactId>mybatis</artifactId>
- <version>3.1.1</version>
- </dependency>
- <dependency>
- <groupId>mysql</groupId>
- <artifactId>mysql-connector-java</artifactId>
- <version>5.1.38</version>
- </dependency>
- </dependencies>
- </project>
1.3、SqlMappingConfig.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">
- <!--properties中还可以配置一些属性名和属性值 -->
- <!-- <property name="jdbc.driver" value=""/> -->
- </properties>
- <!-- 全局配置参数,需要时再设置 -->
- <!-- <settings> </settings> -->
- <typeAliases>
- <!-- 别名定义 -->
- <!-- 针对单个别名定义 type:类型的路径 alias:别名 -->
- <!-- <typeAlias type="cn.czy.mybatis.po.User" alias="user"/> -->
- <typeAlias type="cn.com.czy.mybatis.pojo.User" alias="user" />
- <!-- 批量别名定义 指定包名,mybatis自动扫描包中的po类,自动定义别名,别名就是类名(首字母大写或小写都可以) -->
- <package name="cn.com.mybatis.mapper" />
- </typeAliases>
- <!-- 和spring整合后 environments配置将废除 -->
- <environments default="development">
- <environment id="development">
- <!-- 使用jdbc事务管理,事务控制由mybatis -->
- <transactionManager type="JDBC" />
- <!-- 数据库连接池,由mybatis管理 -->
- <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>
- <!--通过resource方法一次加载一个映射文件 -->
- <!--注意这里的路径和xml文件 -->
- <mapper resource="sqlMapper/user.xml" />
- <mapper resource="sqlMapper/userMapper.xml" />
- <mapper resource="sqlMapper/OrdersMapperCustom.xml"/>
- <!-- 批量加载mapper 指定mapper接口的包名,mybatis自动扫描包下边所有mapper接口进行加载 -->
- <!-- 遵循一些规范:需要将mapper接口类名和mapper.xml映射文件名称保持一致,且在一个目录 -->
- <!-- 中 上边规范的前提是:使用的是mapper代理方法
- <package name="cn.com.czy.mybatis.two.mapper" />-->
- </mappers>
- </configuration>
1.4、user.xml文件(注意在SqlMappingConfig.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">
- <!-- 在 映射文件中配置很多sql语句 -->
- <!-- 将sql语句封装到mappedStatement对象中,所以将id称为statement的id -->
- <!-- parameterType:指定输入 参数的类型,这里指定int型 #{}表示一个占位符号 -->
- <!-- #{id}:其中的id表示接收输入 的参数,参数名称就是id,如果输入 -->
- <!-- 参数是简单类型,#{}中的参数名可以任意,可以value或其它名称 -->
- <!-- resultType:指定sql输出结果 的所映射的java对象类型,select指定resultType表示将单条记录映射成的java对象。 -->
- <select id="findUserById" parameterType="int" resultType="user">
- SELECT * FROM USER WHERE id=#{value}
- </select>
- </mapper>
1.5、测试类
- package cn.com.czy.mybatis.first;
- import java.io.IOException;
- import java.io.InputStream;
- import java.util.Date;
- 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 cn.com.czy.mybatis.pojo.User;
- import org.junit.Test;
- /**
- * 《单表映射》
- * 入门程序总结:这是简单的mybatis入门程序
- * -- 1、映射(mapper)文件是user.xml -- --
- * -- 2、逻辑基本的resultType、parameterType等一下基础知识 -- --
- * -- 3、SqlSessionFactory、SqlSession的原理 -- --
- */
- public class MybatisFirst {
- public SqlSessionFactory getSqlSessionFactory() throws IOException {
- // mybatis配置文件
- String resource = "config/SqlMapConfig.xml";
- // 得到配置文件流
- InputStream inputStream = Resources.getResourceAsStream(resource);
- // 创建会话工厂,传入mybatis的配置文件信息
- SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
- return sqlSessionFactory;
- }
- // 根据id查询用户信息,得到一条记录结果
- @Test
- public void findUserByIdTest() throws IOException {
- // 通过工厂得到SqlSession
- SqlSession sqlSession = this.getSqlSessionFactory().openSession();
- // 通过SqlSession操作数据库
- // 第一个参数:映射文件中statement的id,等于=namespace+"."+statement的id
- // 第二个参数:指定和映射文件中所匹配的parameterType类型的参数
- // sqlSession.selectOne结果 是与映射文件中所匹配的resultType类型的对象
- // selectOne查询出一条记录(这种很麻烦的!!!往后看看)
- User user = sqlSession.selectOne("test.findUserById", 1);
- System.out.println(user);
- // 释放资源
- sqlSession.close();
- }
- }
1.6、selectOne和selectList的解释
selectOne表示查询出一条记录进行映射。如果使用selectOne可以实现使用selectList也可以实现(list中只有一个对象)。
selectList表示查询出一个列表(多条记录)进行映射。如果使用selectList查询多条记录,不能使用selectOne。
总结:mybatis和hibernate本质区别和应用场景?
hibernate:是一个标准ORM框架(对象关系映射)。入门门槛较高的,不需要程序写sql,sql语句自动生成了。
对sql语句进行优化、修改比较困难的。
mybatis:专注是sql本身,需要程序员自己编写sql语句,sql修改、优化比较方便。mybatis是一个不完全的ORM框架,虽然程序员自己写sql,mybatis 也可以实现映射(输入映射、输出映射)。
2.1、传统的方式写mybatis的应用程序
2.3、环境搭建
pom.xml文件
- <span style="font-size:18px;"><project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
- <modelVersion>4.0.0</modelVersion>
- <groupId>web-test-com</groupId>
- <artifactId>MyBatis</artifactId>
- <version>0.0.1-SNAPSHOT</version>
- <packaging>war</packaging>
- <dependencies>
- <dependency>
- <groupId>junit</groupId>
- <artifactId>junit</artifactId>
- <version>4.12</version>
- <scope>provided</scope>
- </dependency>
- <dependency>
- <groupId>log4j</groupId>
- <artifactId>log4j</artifactId>
- <version>1.2.17</version>
- </dependency>
- <dependency>
- <groupId>org.mybatis</groupId>
- <artifactId>mybatis</artifactId>
- <version>3.1.1</version>
- </dependency>
- <dependency>
- <groupId>mysql</groupId>
- <artifactId>mysql-connector-java</artifactId>
- <version>5.1.38</version>
- </dependency>
- </dependencies>
- </project>
- </span>
2.4、SqlMappingConfig.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">
- <!--properties中还可以配置一些属性名和属性值 -->
- <!-- <property name="jdbc.driver" value=""/> -->
- </properties>
- <!-- 全局配置参数,需要时再设置 -->
- <!-- <settings> </settings> -->
- <typeAliases>
- <!-- 别名定义 -->
- <!-- 针对单个别名定义 type:类型的路径 alias:别名 -->
- <!-- <typeAlias type="cn.czy.mybatis.po.User" alias="user"/> -->
- <typeAlias type="cn.com.czy.mybatis.pojo.User" alias="user" />
- <!-- 批量别名定义 指定包名,mybatis自动扫描包中的po类,自动定义别名,别名就是类名(首字母大写或小写都可以) -->
- <package name="cn.com.mybatis.mapper" />
- </typeAliases>
- <!-- 和spring整合后 environments配置将废除 -->
- <environments default="development">
- <environment id="development">
- <!-- 使用jdbc事务管理,事务控制由mybatis -->
- <transactionManager type="JDBC" />
- <!-- 数据库连接池,由mybatis管理 -->
- <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>
- <!--通过resource方法一次加载一个映射文件 -->
- <mapper resource="sqlMapper/user.xml" />
- <mapper resource="sqlMapper/userMapper.xml" />
- <mapper resource="sqlMapper/OrdersMapperCustom.xml"/>
- <!-- 批量加载mapper 指定mapper接口的包名,mybatis自动扫描包下边所有mapper接口进行加载 -->
- <!-- 遵循一些规范:需要将mapper接口类名和mapper.xml映射文件名称保持一致,且在一个目录 -->
- <!-- 中 上边规范的前提是:使用的是mapper代理方法
- <package name="cn.com.czy.mybatis.two.mapper" />-->
- </mappers>
- </configuration>
2.5、映射文件user.xml(注意在SqlMappingConfig.xml文件中已经引用它)
- <span style="font-size:18px;"><?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">
- <!-- namespace命名空间,作用就是对sql进行分类化管理,理解sql隔离 -->
- <!-- 注意:使用mapper代理方法开发,namespace有特殊重要的作用 -->
- <mapper namespace="test">
- <!-- 在 映射文件中配置很多sql语句 -->
- <!-- 将sql语句封装到mappedStatement对象中,所以将id称为statement的id -->
- <!-- parameterType:指定输入 参数的类型,这里指定int型 #{}表示一个占位符号 -->
- <!-- #{id}:其中的id表示接收输入 的参数,参数名称就是id,如果输入 -->
- <!-- 参数是简单类型,#{}中的参数名可以任意,可以value或其它名称 -->
- <!-- resultType:指定sql输出结果 的所映射的java对象类型,select指定resultType表示将单条记录映射成的java对象。 -->
- <select id="findUserById" parameterType="int"
- resultType="user">
- <!-- 需求:通过select执行id查询用户表的记录 -->
- SELECT * FROM USER WHERE id=#{value}
- </select>
- <!-- resultType:指定就是单条记录所映射的java对象类型 -->
- <!-- ${}:表示拼接sql串,将接收到参数的内容不加任何修饰拼接在sql中。 使用${}拼接sql,引起 sql注入 -->
- <!-- ${value}:接收输入 参数的内容,如果传入类型是简单类型,${}中只能使用value -->
- <!-- 这个mapper文件user对象已经用别名代替 -->
- <select id="findUserByName" parameterType="java.lang.String"
- resultType="user">
- <!-- 根据用户名称模糊查询用户信息,可能返回多条 -->
- SELECT * FROM USER WHERE username LIKE '%${value}%'
- </select>
- <!-- parameterType:指定输入 参数类型是pojo(包括 用户信息)-->
- <!-- #{}中指定pojo的属性名,接收到pojo对象的属性值,mybatis通过OGNL获取对象的属性值 -->
- <insert id="insertUser" parameterType="user">
- <!-- SELECT LAST_INSERT_ID():得到刚insert进去记录的主键值,只适用与自增主键 -->
- <!-- keyProperty:将查询到主键值设置到parameterType指定的对象的哪个属性 -->
- <!-- order:SELECT LAST_INSERT_ID()执行顺序,相对于insert语句来说它的执行顺序 -->
- <!-- resultType:指定SELECT LAST_INSERT_ID()的结果类型 -->
- <selectKey keyProperty="id" order="AFTER" resultType="java.lang.Integer">
- <!-- 将插入数据的主键返回,返回到user对象中 -->
- SELECT LAST_INSERT_ID()
- </selectKey>
- insert into user(username,birthday,sex,address)
- value(#{username},#{birthday},#{sex},#{address})
- <!-- 使用mysql的uuid()生成主键 执行过程: -->
- <!-- 首先通过uuid()得到主键,将主键设置到user对象的id属性中 其次在insert执行时,从user对象中取出id属性值 -->
- <!-- <selectKey keyProperty="id" order="BEFORE" resultType="java.lang.String"> -->
- <!-- SELECT uuid() </selectKey> insert into user(id,username,birthday,sex,address) -->
- <!-- value(#{id},#{username},#{birthday},#{sex},#{address}) -->
- </insert>
- <delete id="deleteUser" parameterType="java.lang.Integer">
- <!-- 删除 用户 根据id删除用户,需要输入 id值 -->
- delete from user where
- id=#{id}
- </delete>
- <!-- 需要传入用户的更新信息 parameterType指定user对象,包括 id和更新信息, -->
- <!-- 注意:id必须存在 -->
- <!-- #{id}:从输入 user对象中获取id属性值 -->
- <update id="updateUser" parameterType="user">
- <!-- 根据id更新用户 分析: 需要传入用户的id -->
- update user set
- username=#{username},birthday=#{birthday},sex=#{sex},address=#{address}
- where id=#{id}
- </update>
- </mapper>
- </span>
2.6、pojo类
- <span style="font-size:18px;">package cn.com.czy.mybatis.pojo;
- import java.util.Date;
- /**
- *
- * <p>Title: User</p>
- * <p>Description:用户pojo </p>
- */
- public class User {
- //属性名和数据库表的字段对应
- private int id;
- private String username; // 用户姓名
- private String sex; // 性别
- private Date birthday; // 生日
- private String address; // 地址
- public int getId() {
- return id;
- }
- public void setId(int 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;
- }
- @Override
- public String toString() {
- return "User [id=" + id + ", username=" + username + ", sex=" + sex
- + ", birthday=" + birthday + ", address=" + address + "]";
- }
- }
- </span>
2.7、测试类(传统的不用接口、只是简单的)
- package cn.com.czy.mybatis.first;
- import java.io.IOException;
- import java.io.InputStream;
- import java.util.Date;
- 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 cn.com.czy.mybatis.pojo.User;
- import org.junit.Test;
- /**
- * 《单表映射》
- * 入门程序总结:这是简单的mybatis入门程序
- * -- 1、映射(mapper)文件是user.xml -- --
- * -- 2、逻辑基本的resultType、parameterType等一下基础知识 -- --
- * -- 3、SqlSessionFactory、SqlSession的原理 -- --
- */
- public class MybatisFirst {
- public SqlSessionFactory getSqlSessionFactory() throws IOException {
- // mybatis配置文件
- String resource = "config/SqlMapConfig.xml";
- // 得到配置文件流
- InputStream inputStream = Resources.getResourceAsStream(resource);
- // 创建会话工厂,传入mybatis的配置文件信息
- SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
- return sqlSessionFactory;
- }
- // 根据id查询用户信息,得到一条记录结果
- @Test
- public void findUserByIdTest() throws IOException {
- // 通过工厂得到SqlSession
- SqlSession sqlSession = this.getSqlSessionFactory().openSession();
- // 通过SqlSession操作数据库
- // 第一个参数:映射文件中statement的id,等于=namespace+"."+statement的id
- // 第二个参数:指定和映射文件中所匹配的parameterType类型的参数
- // sqlSession.selectOne结果 是与映射文件中所匹配的resultType类型的对象
- // selectOne查询出一条记录
- User user = sqlSession.selectOne("test.findUserById", 1);
- System.out.println(user);
- // 释放资源
- sqlSession.close();
- }
- // 根据用户名称模糊查询用户列表
- @Test
- public void findUserByNameTest() throws IOException {
- // 通过工厂得到SqlSession
- SqlSession sqlSession = this.getSqlSessionFactory().openSession();
- // list中的user和映射文件中resultType所指定的类型一致
- List<User> list = sqlSession.selectList("test.findUserByName", "小明");
- System.out.println("信息:" + list);
- sqlSession.close();
- }
- // 添加用户信息
- @Test
- public void insertUserTest() throws IOException {
- // 通过工厂得到SqlSession
- SqlSession sqlSession = this.getSqlSessionFactory().openSession();
- // 插入用户对象
- User user = new User();
- user.setUsername("王小军");
- user.setBirthday(new Date());
- user.setSex("1");
- user.setAddress("河南郑州");
- sqlSession.insert("test.insertUser", user);
- // 提交事务
- sqlSession.commit();
- // 获取用户信息主键
- System.out.println(user.getId());
- // 关闭会话
- sqlSession.close();
- }
- // 根据id删除 用户信息
- @Test
- public void deleteUserTest() throws IOException {
- // 通过工厂得到SqlSession
- SqlSession sqlSession = this.getSqlSessionFactory().openSession();
- // 传入id删除 用户
- sqlSession.delete("test.deleteUser", 49);
- // 提交事务
- sqlSession.commit();
- // 关闭会话
- sqlSession.close();
- }
- // 更新用户信息
- @Test
- public void updateUserTest() throws IOException {
- // 通过工厂得到SqlSession
- SqlSession sqlSession = this.getSqlSessionFactory().openSession();
- // 更新用户信息
- User user = new User();
- // 必须设置id
- user.setId(41);
- user.setUsername("王大军");
- user.setBirthday(new Date());
- user.setSex("2");
- user.setAddress("河南郑州");
- sqlSession.update("test.updateUser", user);
- // 提交事务
- sqlSession.commit();
- // 关闭会话
- sqlSession.close();
- }
- }
3.1、mapper代理方法来实现(实际开发用到的)
1、pom.xml文件一样
2、SqlMappingConfig.xml一样
3、开发规范:编写
3.2、接口UserMapping.xml文件(可能有点多、挑着看就好)
(注意在SqlMappingConfig.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命名空间,作用就是对sql进行分类化管理,理解sql隔离 -->
- <!-- 注意:使用mapper代理方法开发,namespace有特殊重要的作用,namespace等于mapper接口地址 -->
- <mapper namespace="cn.com.mybatis.mapper.UserMapper">
- <!-- 定义sql片段 -->
- <!-- id:sql片段的唯 一标识 -->
- <!-- 经验:是基于单表来定义sql片段,这样话这个sql片段可重用性才高 在sql片段中不要包括 where -->
- <sql id="query_user_where">
- <if test="userCustom!=null">
- <if test="userCustom.sex!=null and userCustom.sex!=''">
- and user.sex = #{userCustom.sex}
- </if>
- <if test="userCustom.username!=null and userCustom.username!=''">
- and user.username LIKE '%${userCustom.username}%'
- </if>
- </if>
- </sql>
- <!-- 已经指定好别名! -->
- <!-- 运用sql片段 -->
- <!-- 用户信息综合查询 #{userCustom.sex}:取出pojo包装对象中性别值 -->
- <!-- ${userCustom.username}:取出pojo包装对象中用户名称 -->
- <select id="findUserList" parameterType="UserQueryVo"
- resultType="UserCustom">
- SELECT * FROM USER
- <!-- where可以自动去掉条件中的第一个and -->
- <where>
- <!-- 引用sql片段 的id,如果refid指定的id不在本mapper文件中,需要前边加namespace -->
- <include refid="query_user_where"></include>
- <!-- 在这里还要引用其它的sql片段 -->
- </where>
- </select>
- <!-- 用户信息综合查询总数 parameterType:指定输入类型和findUserList一样 resultType:输出结果类型 -->
- <select id="findUserCount" parameterType="UserQueryVo"
- resultType="int">
- SELECT count(*) FROM USER
- <!-- where可以自动去掉条件中的第一个and -->
- <where>
- <!-- 引用sql片段 的id,如果refid指定的id不在本mapper文件中,需要前边加namespace -->
- <include refid="query_user_where"></include>
- <!-- 在这里还要引用其它的sql片段 -->
- </where>
- </select>
- <!-- 在 映射文件中配置很多sql语句 -->
- <!-- 需求:通过id查询用户表的记录 -->
- <!-- 通过 select执行数据库查询 -->
- <!-- id:标识 映射文件中的 sql -->
- <!-- 将sql语句封装到mappedStatement对象中,所以将id称为statement的id -->
- <!-- parameterType:指定输入 参数的类型,这里指定int型 -->
- <!-- #{}表示一个占位符号 -->
- <!-- #{id}:其中的id表示接收输入 的参数,参数名称就是id,如果输入 参数是简单类型,#{}中的参数名可以任意,可以value或其它名称 -->
- <!-- resultType:指定sql输出结果 的所映射的java对象类型,select指定resultType表示将单条记录映射成的java对象。 -->
- <!-- mapper开发代理规范2:UserMapper 接口中的接口方法名跟id名一样 -->
- <!-- mapper开发代理规范3:UserMapper 接口中的返回类型名跟resultType类型一样 -->
- <!-- mapper开发代理规范 4:UserMapper 接口中的参数类型名跟parameterType类型一样 -->
- <select id="findUserById" parameterType="int" resultType="user">
- SELECT * FROM USER WHERE id=#{value}
- </select>
- <!-- 根据用户名称模糊查询用户信息,可能返回多条 resultType:指定就是单条记录所映射的java对象 类型 ${}:表示拼接sql串,将接收到参数的内容不加任何修饰拼接在sql中。
- 使用${}拼接sql,引起 sql注入 ${value}:接收输入 参数的内容,如果传入类型是简单类型,${}中只能使用value -->
- <select id="findUserByName" parameterType="java.lang.String"
- resultType="user">
- SELECT * FROM USER WHERE username LIKE '%${value}%'
- </select>
- <!-- 定义resultMap -->
- <!-- 将SELECT id id_,username username_ FROM USER 和User类中的属性作一个映射关系 -->
- <!-- type:resultMap最终映射的java对象类型,可以使用别名 -->
- <!-- id:对resultMap的唯一标识 -->
- <resultMap type="user" id="userResultMap">
- <!--id表示查询结果集中唯一标识 -->
- <!--column:查询出来的列名 -->
- <!--property:type指定的pojo类型中的属性名 最终resultMap对column和property作一个映射关系 (对应关系) -->
- <id column="id_" property="id" />
- <!--result:对普通名映射定义 -->
- <!--column:查询出来的列名 -->
- <!--property:type指定的pojo类型中的属性名 最终resultMap对column和property作一个映射关系 (对应关系) -->
- <result column="username_" property="username" />
- </resultMap>
- <!-- 使用resultMap进行输出映射 -->
- <!--resultMap:指定定义的resultMap的id,如果这个resultMap在其它的mapper文件,前边需要加namespace -->
- <select id="findUserByIdResultMap" parameterType="int"
- resultMap="userResultMap">
- SELECT id id_,username username_ FROM USER WHERE id=#{value}
- </select>
- </mapper>
3.3、UserMapping.java类
- package cn.com.mybatis.mapper;
- import java.util.List;
- import cn.com.czy.mybatis.pojo.User;
- /**
- * 总结:
- * 1、mapper代理方式、理解mapper开发规范
- * 2、mapper文件是usermapper.xml
- * 3、了解动态sql、别名、sql代码片、
- * 4、了解 resultMap
- *
- * <p>
- * Title: UserMapper
- * </p>
- * <p>
- * Description: mapper接口,相当 于dao接口,用户管理
- * </p>
- */
- public interface UserMapper {
- // 根据id查询用户信息
- public User findUserById(int id) throws Exception;
- // 根据用户名列查询用户列表
- public List<User> findUserByName(String name) throws Exception;
- // 根据id查询用户信息,使用resultMap输出
- public User findUserByIdResultMap(int id) throws Exception;
- // 用户信息综合查询
- public List<UserCustom> findUserList(UserQueryVo userQueryVo) throws Exception;
- // 用户信息综合查询总数
- public int findUserCount(UserQueryVo userQueryVo) throws Exception;
- // 插入用户
- public void insertUser(User user) throws Exception;
- // 删除用户
- public void deleteUser(int id) throws Exception;
- }
3.3、包装类、继承类(这些只是为了以后更好的拓展罢了)
UserMapping的子类
- package cn.com.mybatis.mapper;
- import cn.com.czy.mybatis.pojo.User;
- /**
- * 总结:
- * 1、mapper代理方式、理解mapper开发规范
- * 2、mapper文件是usermapper.xml
- * 3、了解动态sql、别名、sql代码片、
- * 4、了解 resultMap
- *
- * <p>Title: UserCustom</p>
- * <p>Description: 用户的扩展类</p>
- */
- public class UserCustom extends User{
- //可以扩展用户的信息
- }
UserMapping的包装类
- package cn.com.mybatis.mapper;
- /**
- * 总结:
- * 1、mapper代理方式、理解mapper开发规范
- * 2、mapper文件是usermapper.xml
- * 3、了解动态sql、别名、sql代码片、
- * 4、了解 resultMap
- *
- * <p>Title: UserQueryVo</p>
- * <p>Description:包装类型 </p>
- */
- public class UserQueryVo {
- //在这里包装所需要的查询条件
- //用户查询条件
- private UserCustom userCustom;
- public UserCustom getUserCustom() {
- return userCustom;
- }
- public void setUserCustom(UserCustom userCustom) {
- this.userCustom = userCustom;
- }
- //可以包装其它的查询条件,订单、商品
- //....
- }
3.5测试类
- package cn.com.mybatis.mapper;
- import java.io.InputStream;
- 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.com.czy.mybatis.pojo.User;
- /*
- *
- * 总结:
- * 1、mapper代理方式、理解mapper开发规范
- * 2、mapper文件是usermapper.xml
- * 3、了解动态sql、别名、sql代码片、
- * 4、了解 resultMap
- *
- */
- public class UserMapperTest {
- private SqlSessionFactory sqlSessionFactory;
- // 此方法是在执行testFindUserById之前执行
- @Before
- public void setUp() throws Exception {
- // mybatis配置文件
- String resource = "config/SqlMapConfig.xml";
- // 得到配置文件流
- InputStream inputStream = Resources.getResourceAsStream(resource);
- // 创建会话工厂,传入mybatis的配置文件信息
- sqlSessionFactory = new SqlSessionFactoryBuilder()
- .build(inputStream);
- }
- //用户信息的综合 查询
- @Test
- public void testFindUserList() throws Exception {
- SqlSession sqlSession = sqlSessionFactory.openSession();
- //创建UserMapper对象,mybatis自动生成mapper代理对象
- UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
- //创建包装对象,设置查询条件
- UserQueryVo userQueryVo = new UserQueryVo();
- UserCustom userCustom = new UserCustom();
- userCustom.setSex("1");
- userCustom.setUsername("郑游");
- userQueryVo.setUserCustom(userCustom);
- //调用userMapper的方法
- List<UserCustom> list = userMapper.findUserList(userQueryVo);
- System.out.println(list);
- }
- @Test
- public void testFindUserCount() throws Exception {
- SqlSession sqlSession = sqlSessionFactory.openSession();
- //创建UserMapper对象,mybatis自动生成mapper代理对象
- UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
- //创建包装对象,设置查询条件
- UserQueryVo userQueryVo = new UserQueryVo();
- UserCustom userCustom = new UserCustom();
- userCustom.setSex("1");
- userCustom.setUsername("郑游");
- userQueryVo.setUserCustom(userCustom);
- //调用userMapper的方法
- int count = userMapper.findUserCount(userQueryVo);
- System.out.println(count);
- }
- @Test
- public void testFindUserById() throws Exception {
- SqlSession sqlSession = sqlSessionFactory.openSession();
- //创建UserMapper对象,mybatis自动生成mapper代理对象
- UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
- //调用userMapper的方法
- User user = userMapper.findUserById(1);
- System.out.println(user);
- }
- @Test
- public void testFindUserByName() throws Exception {
- SqlSession sqlSession = sqlSessionFactory.openSession();
- //创建UserMapper对象,mybatis自动生成mapper代理对象
- UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
- //调用userMapper的方法
- List<User> list = userMapper.findUserByName("小明");
- sqlSession.close();
- System.out.println(list);
- }
- @Test
- public void testFindUserByIdResultMap() throws Exception {
- SqlSession sqlSession = sqlSessionFactory.openSession();
- //创建UserMapper对象,mybatis自动生成mapper代理对象
- UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
- //调用userMapper的方法
- User user = userMapper.findUserByIdResultMap(1);
- System.out.println(user);
- }
- }
推荐教程
Mybatis 入门到理解篇的更多相关文章
- Mybatis入门看这一篇就够了
什么是MyBatis MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为 ...
- Mybatis入门篇之结果映射,你射准了吗?
目录 前言 什么是结果映射? 如何映射? 别名映射 驼峰映射 配置文件开启驼峰映射 配置类中开启驼峰映射 resultMap映射 总结 高级结果映射 关联(association) 例子 关联的嵌套 ...
- mybatis入门基础(二)----原始dao的开发和mapper代理开发
承接上一篇 mybatis入门基础(一) 看过上一篇的朋友,肯定可以看出,里面的MybatisService中存在大量的重复代码,看起来不是很清楚,但第一次那样写,是为了解mybatis的执行步骤,先 ...
- Spring+SpringMVC+MyBatis+easyUI整合进阶篇(十五)阶段总结
作者:13 GitHub:https://github.com/ZHENFENG13 版权声明:本文为原创文章,未经允许不得转载. 一 每个阶段在结尾时都会有一个阶段总结,在<SSM整合基础篇& ...
- 写给新手看的 MyBatis 入门
目录 MyBatis 使用前的准备 什么是 MyBatis 使用Maven 进行 MyBatis 开发环境搭建 MyBatis 入门 项目整体结构一览 MyBatis 的简单生命周期 1.获取 Sql ...
- Mybatis入门案例中设计模式的简单分析
Talk is cheap, show me the code! public class TestMybatis { public static void main(String[] args) t ...
- Python 正则表达式入门(中级篇)
Python 正则表达式入门(中级篇) 初级篇链接:http://www.cnblogs.com/chuxiuhong/p/5885073.html 上一篇我们说在这一篇里,我们会介绍子表达式,向前向 ...
- Python 正则表达式入门(初级篇)
Python 正则表达式入门(初级篇) 本文主要为没有使用正则表达式经验的新手入门所写. 转载请写明出处 引子 首先说 正则表达式是什么? 正则表达式,又称正规表示式.正规表示法.正规表达式.规则表达 ...
- MyBatis入门基础(一)
一:对原生态JDBC问题的总结 新项目要使用mybatis作为持久层框架,由于本人之前一直使用的Hibernate,对mybatis的用法实在欠缺,最近几天计划把mybatis学习一哈,特将学习笔记记 ...
随机推荐
- [AngularFire 2] Push, remove, update
import { Injectable } from '@angular/core'; import {RealtimeService} from "../shared"; imp ...
- Windows跨进程设置文本和发送消息
进程内设置文本,可以调用SetWindowText,跨进程这个会无效,应当如下:::SendMessage(hWnd, WM_SETTEXT, NULL, (LPARAM)文本内容); 注意这里不能使 ...
- 【rlz03】十六进制转十进制
Time Limit: 3 second Memory Limit: 2 MB 问题描述 输入一个十六进制数,编程转换为十进制数. 整数部分不会超过65535,十六进制的小数部分不会超过2位. Sam ...
- 如何在 Linux 中统计一个进程的线程数
编译自:http://ask.xmodulo.com/number-of-threads-process-linux.html作者: Dan Nanni原创:LCTT https://linux.cn ...
- POJ 1751 Highways (ZOJ 2048 ) MST
http://poj.org/problem?id=1751 http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=2048 题目大 ...
- 使用Apache FtpServer搭建FTP服务器 [FlashFXP]
<server xmlns="http://mina.apache.org/ftpserver/spring/v1" xmlns:xsi="http://www.w ...
- [React] Update Component State in React With Ramda Lenses
In this lesson, we'll refactor a React component to use Ramda lenses to update our component state. ...
- php实现栈的压入、弹出序列(**)(算法步骤)(画图)
php实现栈的压入.弹出序列(**)(算法步骤)(画图) 一.总结 1.算法步骤:一定要把算法步骤写下来,要不然太浪费时间了,尤其是思维不清晰的时候,尤其是题目有难度的时候,不然的话也非常容易出现低级 ...
- JavaScript 正則表達式
一.简单介绍 1.什么是正則表達式 正則表達式本身就是一种语言,这在其他语言是通用的. 正則表達式(regular expression)描写叙述了一种字符串匹配的模式,能够用来检查一个串是否含有某种 ...
- Android的NDK开发(5)————Android JNI层实现文件的read、write与seek操作
1. 在Android的Java层实现文件的读写操作是非常简单的,可以参看之前写的博文:http://blog.csdn.net/conowen/article/details/7296121 在JN ...