Mybatis入门例子
来源:互联网 发布:微信第三方源码 编辑:程序博客网 时间:2024/04/29 06:18
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.Driverjdbc.url=jdbc:mysql://localhost:3306/mybatis?characterEncoding=UTF-8jdbc.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 configurationPUBLIC "-//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 mapperPUBLIC "-//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查询用户信息,得到一条记录结果@Testpublic void findUserByIdTest() throws IOException {// 通过工厂得到SqlSessionSqlSession 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 configurationPUBLIC "-//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 mapperPUBLIC "-//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 whereid=#{id}</delete><!-- 需要传入用户的更新信息 parameterType指定user对象,包括 id和更新信息, --><!-- 注意:id必须存在 --><!-- #{id}:从输入 user对象中获取id属性值 --><update id="updateUser" parameterType="user"><!-- 根据id更新用户 分析: 需要传入用户的id -->update user setusername=#{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;}@Overridepublic String toString() {return "User [id=" + id + ", username=" + username + ", sex=" + sex+ ", birthday=" + birthday + ", address=" + address + "]";}}</span>
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查询用户信息,得到一条记录结果@Testpublic void findUserByIdTest() throws IOException {// 通过工厂得到SqlSessionSqlSession 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();}// 根据用户名称模糊查询用户列表@Testpublic void findUserByNameTest() throws IOException {// 通过工厂得到SqlSessionSqlSession sqlSession = this.getSqlSessionFactory().openSession();// list中的user和映射文件中resultType所指定的类型一致List<User> list = sqlSession.selectList("test.findUserByName", "小明");System.out.println("信息:" + list);sqlSession.close();}// 添加用户信息@Testpublic void insertUserTest() throws IOException {// 通过工厂得到SqlSessionSqlSession 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删除 用户信息@Testpublic void deleteUserTest() throws IOException {// 通过工厂得到SqlSessionSqlSession sqlSession = this.getSqlSessionFactory().openSession();// 传入id删除 用户sqlSession.delete("test.deleteUser", 49);// 提交事务sqlSession.commit();// 关闭会话sqlSession.close();}// 更新用户信息@Testpublic void updateUserTest() throws IOException {// 通过工厂得到SqlSessionSqlSession sqlSession = this.getSqlSessionFactory().openSession();// 更新用户信息User user = new User();// 必须设置iduser.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、开发规范:编写mapper接口需要遵循一些开发规范,mybatis可以自动生成mapper接口实现类代理对象。
3.2、接口UserMapping.xml文件(可能有点多、挑着看就好)
(注意在SqlMappingConfig.xml文件中已经引用它)
<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE mapperPUBLIC "-//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之前执行@Beforepublic void setUp() throws Exception {// mybatis配置文件String resource = "config/SqlMapConfig.xml";// 得到配置文件流InputStream inputStream = Resources.getResourceAsStream(resource);// 创建会话工厂,传入mybatis的配置文件信息sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);}//用户信息的综合 查询@Testpublic 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);}@Testpublic 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);}@Testpublic 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);}@Testpublic 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);}@Testpublic 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);}}
推荐教程
Maven官方中文教程
Mybatis的mapper.xml文件详解
SSM框架教程
- mybatis 入门例子
- mybatis 详细入门例子
- mybatis 详细入门例子
- mybatis 详细入门例子
- Mybatis入门例子
- Mybatis入门例子
- Mybatis入门例子
- Mybatis 入门学习,简单例子
- Mybatis笔记之一 --入门例子
- Mybatis入门简单例子详解
- Mybatis入门笔记--简单例子
- 【MyBatis】第一个入门例子
- Mybatis学习笔记(一)入门例子
- springboot+mybatis的简单的入门例子
- mybatis入门例子之BindingException异常
- MyBatis学习(一) 入门+例子
- 一双跑鞋的mybatis(一)---mybatis入门例子
- mybatis 例子
- HTML+CSS基础 table中的tr中的td标签中的align属性设置文本居中,左对齐,右对齐
- 目标检测论文回顾
- SQL手工注入测试
- android 中的广播 ,系统广播和自定义广播
- HTML+CSS基础 table中的tr中的td标签中的valign属性设置文本靠上,中间,靠下
- Mybatis入门例子
- 消息推送系统——(一)概念与原理
- HTML+CSS基础 改变form-input-type-reset按钮(重置按钮)显示的文本
- 重建二叉树
- 【Seen看世界】:像高智商人群看齐
- 《Clean Code》代码的整洁之道----并发编程
- HTML+CSS基础 改变form-input-type-submit按钮(提交按钮)显示的文本
- HTML+CSS基础 新手用软件,编译器什么写代码
- oracle 归档日志查看方法--logminer