您的位置:首页 > 其它

Mybatis学习教程—— Mybatis入门实例

2017-02-28 09:58 429 查看

MyBatis

MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBatis 。2013年11月迁移到Github。iBATIS一词来源于“internet”和“abatis”的组合,是一个基于Java的持久层框架。iBATIS提供的持久层框架包括SQL
Maps和Data Access Objects(DAO)。

本教程是用maven构建项目、不会maven的开这个文章!-----Maven教程

开发工具:idea
语言:java
项目结构:maven项目
看注释学习!!!
mysql数据库

1.1、先来个简单的、入门程序!





目录结构(怕一些因为文件路径错误、所有不要原版不动拷贝、要理解!)

1.1、db.properties文件

[java] view
plain copy

print?





<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语句、数据表

[java] view
plain copy

print?





/*

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;

插入数据:

[java] view
plain copy

print?





/*

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文件

[java] view
plain copy

print?





<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文件

[java] view
plain copy

print?





<?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文件中已经引用它)

[java] view
plain copy

print?





<?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、测试类

[java] view
plain copy

print?





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的应用程序

[b]2.3、环境搭建[/b]

pom.xml文件



[java] view
plain copy

print?





<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文件(学会看注释、你就入门了!!!别说我只贴代码不给解释!!!)

[java] view
plain copy

print?





<?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文件中已经引用它)

[java] view
plain copy

print?





<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>

[b]2.6、pojo类[/b]

[java] view
plain copy

print?





<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>

[b]2.7、测试类(传统的不用接口、只是简单的)[/b]

[java] view
plain copy

print?





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、开发规范:

我们编写mapper接口需要遵循一些开发规范,mybatis可以自动生成mapper接口实现类代理对象。

3.2、接口UserMapping.xml文件(可能有点多、你挑着看就好了、学会查询就会别的!!!)

(注意在SqlMappingConfig.xml文件中已经引用它)

[java] view
plain copy

print?





<?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类


[java] view
plain copy

print?





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的子类

[java] view
plain copy

print?





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的包装类

[java] view
plain copy

print?





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测试类

[java] view
plain copy

print?





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);

}

}

来自:http://blog.csdn.net/javawebrookie/article/details/52654526
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息