本教程有 MyBatis三种开发方式:
mybatis本地调试、代理开发方式、传统开发方式!
1.1、db.properties文件
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/mybatis?characterEncoding=UTF-8
jdbc.username=用户名
jdbc.password=密码
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文件
4.0.0 web-test-com MyBatis 0.0.1-SNAPSHOT war
<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>
1.3、SqlMappingConfig.xml文件
<!-- 加载属性文件 --> <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>
1.4、user.xml文件(注意在SqlMappingConfig.xml文件中已经引用它)
<!-- 在 映射文件中配置很多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>
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();
}
}
selectOne表示查询出一条记录进行映射。如果使用selectOne可以实现使用selectList也可以实现(list中只有一个对象)。
selectList表示查询出一个列表(多条记录)进行映射。如果使用selectList查询多条记录,不能使用selectOne。
hibernate:是一个标准ORM框架(对象关系映射)。入门门槛较高的,不需要程序写sql,sql语句自动生成了。
对sql语句进行优化、修改比较困难的。
mybatis:专注是sql本身,需要程序员自己编写sql语句,sql修改、优化比较方便。mybatis是一个不完全的ORM框架,虽然程序员自己写sql,mybatis 也可以实现映射(输入映射、输出映射)。
2.1、传统的方式写mybatis的应用程序
2.3、环境搭建
pom.xml文件
4.0.0 web-test-com MyBatis 0.0.1-SNAPSHOT war
<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>
<!-- 加载属性文件 --> <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>
<!-- 在 映射文件中配置很多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>
Title: User
Description:用户pojo
package cn.com.czy.mybatis.pojo;
import java.util.Date;
/**
*
Title: User
Description:用户pojo
//属性名和数据库表的字段对应
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 + “]”;
}
}
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();
}
}
1、pom.xml文件一样
2、SqlMappingConfig.xml一样
3、开发规范:编写mapper接口需要遵循一些开发规范,mybatis可以自动生成mapper接口实现类代理对象。
3.2、接口UserMapping.xml文件(可能有点多、挑着看就好)
(注意在SqlMappingConfig.xml文件中已经引用它)
<!-- 定义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>
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
Title: UserMapper
Description: mapper接口,相当 于dao接口,用户管理
// 根据id查询用户信息
public User findUserById(int id) throws Exception;
// 根据用户名列查询用户列表
public List
// 根据id查询用户信息,使用resultMap输出
public User findUserByIdResultMap(int id) throws Exception;
// 用户信息综合查询
public List
// 用户信息综合查询总数
public int findUserCount(UserQueryVo userQueryVo) throws Exception;
// 插入用户
public void insertUser(User user) throws Exception;
// 删除用户
public void deleteUser(int id) throws Exception;
}
3.3、包装类、继承类(这些只是为了以后更好的拓展罢了)
UserMapping的子类
Title: UserCustom
Description: 用户的扩展类
package cn.com.mybatis.mapper;
import cn.com.czy.mybatis.pojo.User;
/**
总结:
1、mapper代理方式、理解mapper开发规范
2、mapper文件是usermapper.xml
3、了解动态sql、别名、sql代码片、
4、了解 resultMap
Title: UserCustom
Description: 用户的扩展类
//可以扩展用户的信息
}
UserMapping的包装类
Title: UserQueryVo
Description:包装类型
package cn.com.mybatis.mapper;
/**
总结:
1、mapper代理方式、理解mapper开发规范
2、mapper文件是usermapper.xml
3、了解动态sql、别名、sql代码片、
4、了解 resultMap
Title: UserQueryVo
Description:包装类型
//在这里包装所需要的查询条件
//用户查询条件
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;
/*
*
*/
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);
}
}
Maven官方中文教程
Mybatis的mapper.xml文件详解
SSM框架教程
下一篇
linux上安装jdk