目录
前言
学习了 Java web创建、springMVC实现简单登陆 大致的实践了springMVC之后,我们来学习一下mybatis,MyBatis是持久层的框架(SpringMVC 是Web层的框架,Spring是业务层的框架 )
mybatis依赖库:https://pan.baidu.com/s/1XuaidgvU0N7VQK8J0o5__g?pwd=1111
配置文件:https://pan.baidu.com/s/15D-kqGkaa3XHW2-qUVJlog?pwd=1111
一、mybatis是什么?
MyBatis 是支持定制化 SQL、存储过程以及高级映射的优秀的持久层框架。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以对配置和原生Map使用简单的 XML 或注解,将接口和 Java 的 POJOs(Plain Old Java Objects,普通的 Java对象)映射成数据库中的记录。
二、配置一个mybatis框架
1.创建java程序
- 新建项目
mybatisDemo
2.提供依赖jar包
- 右键
mybatisDemo
建立依赖库lib
- 将依赖库解压移动到
lib
中
3.将jar包构建到工程中
- 将 jar 包导入工程路径(右键项目
mybatisDemo
,F4)
- 选择
lib
目录,确定
4.提供配置文件
- 建立
resources
文件夹 - 右键
resources
, F4 ,选中为资源文件夹
- 将配置文件解压放入
resources
- 修改
jdbc.properties
内容为自己的数据库内容
5.建立数据库
- 建立并启动数据库(我的数据库名为
dishorder
) - 在数据库新建查询以建立user表
CREATE TABLE `user` (
`id` int(10) NOT NULL AUTO_INCREMENT COMMENT '用户id 主键自增',
`username` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '用户名',
`realname` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '真实姓名',
`password` varchar(40) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '登录密码',
`IDcard` varchar(18) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '身份证号',
`phone` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '手机号',
`email` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '邮箱',
`paypwd` int(40) NULL DEFAULT NULL COMMENT '交易密码',
`status` int(10) NULL DEFAULT NULL COMMENT '用户状态(0:离线 1:在线)',
`reputation` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '用户信誉',
PRIMARY KEY (`id`) USING BTREE
);
6.编写mapper
- 在
src
建立packagecom.gec.mapper
- 建立
UserMapper.java
文件
package com.gec.mapper;
//UserMapper 使用用于绑定关联UserMapper.xml文件中的sql语句
public interface UserMapper {
//关联了xml中方法名对应的sql操作语句
public int insertUser();
public int updateUser();
public int deleteUser();
}
- 建立
UserMapper.xml
文件
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<!--mapper的命名空间 类似于包名加类名 -->
<mapper namespace="com.gec.mapper.UserMapper">
<!-- id相当于方法名 -->
<insert id="insertUser">
insert into user(username, password)
values ('zhang', '123456');
</insert>
<delete id="deleteUser">
delete from user where username='zhang';
</delete>
<update id="updateUser">
update user set username='liu',password='123456' where username='zhang';
</update>
</mapper>
三、编写测试代码
1.固定输入数据到数据库
1.在com.gec
创建Test.java文件
package com.gec;
import com.gec.mapper.UserMapper;
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 java.io.IOException;
import java.io.InputStream;
public class Test {
public static void main(String[] args) throws IOException {
//1、加载mybatis的全局配置文件
InputStream is = Resources.getResourceAsStream("mybatis-config.xml");
//2、生成sqlsessionfactory【会话的工厂类】【用于生成session会话】
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);
//3、通过sqlsessionfactory来得到生成sqlsession会话对象
SqlSession session = sqlSessionFactory.openSession();
//4、通过会话对象得到mapper接口对象
UserMapper userMapper = session.getMapper(UserMapper.class);
//通过mapper对象执行操作方法
int result = userMapper.insertUser();
System.out.println(result);
//添加删除修改要提交事务
session.commit();
}
}
执行:
执行结果:
2.根据主键删除数据库中的数据
TestDelete.java
package com.gec;
import com.gec.mapper.UserMapper;
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 java.io.IOException;
import java.io.InputStream;
public class TestDelete {
//根据主键删除
public static void main(String[] args) throws IOException {
//1、加载mybatis的全局配置文件
InputStream is = Resources.getResourceAsStream("mybatis-config.xml");
//2、生成sqlsessionfactory【会话的工厂类】【用于生成session会话】
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);
//3、通过sqlsessionfactory来得到生成sqlsession会话对象
SqlSession session = sqlSessionFactory.openSession();
//4、通过会话对象得到mapper接口对象
UserMapper userMapper = session.getMapper(UserMapper.class);
//通过mapper对象执行操作方法
int result = userMapper.deleteUser();
System.out.println(result);
//添加删除修改要提交事务
session.commit();
}
}
执行如下:
检查数据库,成功删除这位zhang同学
3.根据主键修改用户名和密码
TestUpdate.java
package com.gec;
import com.gec.mapper.UserMapper;
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 java.io.IOException;
import java.io.InputStream;
public class TestUpdate {
//根据主键修改用户名和密码
public static void main(String[] args) throws IOException {
//1、加载mybatis的全局配置文件
InputStream is = Resources.getResourceAsStream("mybatis-config.xml");
//2、生成sqlsessionfactory【会话的工厂类】【用于生成session会话】
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);
//3、通过sqlsessionfactory来得到生成sqlsession会话对象
SqlSession session = sqlSessionFactory.openSession();
//4、通过会话对象得到mapper接口对象
UserMapper userMapper = session.getMapper(UserMapper.class);
//通过mapper对象执行操作方法
int result = userMapper.updateUser();
System.out.println(result);
//添加删除修改要提交事务
session.commit();
}
}
执行如下:(先执行一次Test,让数据库中有一条数据)
成功将zhang同学改成了liu同学
四、动态形式注入参数
现在我们的操作是写在mapper里面的固定的输入、删除和修改,但实际上我们的操作是需要可以变化的输入、可以重复调用(比如从网页获取信息存储到数据库)。
所以我们可以新建实体类,例如User类:
-
创建
User.java
,对应数据库进行设计,并执行构造、无参构造、get and set方法、to string方法。
-
编写
UserMapper.java
【方法定义】
package com.gec.mapper;
import com.gec.bean.User;
import java.util.List;
//UserMapper 使用用于绑定关联UserMapper.xml文件中的sql语句
public interface UserMapper {
//关联了xml中方法名对应的sql操作语句
public int insertUser(User user);
// public int selectUser(User user);
// public int updateUser(User user);
// public int deleteUser(int id);
// public List<User> selectUser();
}
- 修改
UserMapper.xml
(parameterType是入参的数据类型,数据的获取用#{ }
表示)【操作方法的具体实现】
<?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的命名空间 类似于包名加类名 -->
<mapper namespace="com.gec.mapper.UserMapper">
<!-- id相当于方法名 parameterType入参的数据类型-->
<insert id="insertUser" parameterType="com.gec.bean.User">
insert into user(username, password) values (#{username}, #{password});
</insert>
<!-- 查询操作 -->
<select id="selectUser" parameterType="com.gec.bean.User">
select * from user;
</select>
<!-- 修改操作 -->
<update id="updateUser" parameterType="com.gec.bean.User">
update user
set username=#{username},
password=#{password}
where id = #{id};
</update>
<!-- 删除操作 -->
<update id="deleteUser" parameterType="int">
delete
from user
where id = #{id};
</update>
</mapper>
- 编写
Test.java
进行测试
package com.gec.test;
import com.gec.bean.User;
import com.gec.mapper.UserMapper;
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 java.io.IOException;
import java.io.InputStream;
import java.util.List;
public class Test {
public static void main(String[] args) throws IOException {
//1、加载mybatis的全局配置文件
InputStream is = Resources.getResourceAsStream("mybatis-config.xml");
//2、生成sqlsessionfactory【会话的工厂类】【用于生成session会话】
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);
//3、通过sqlsessionfactory来得到生成sqlsession会话对象
SqlSession session = sqlSessionFactory.openSession();
//4、通过会话对象得到mapper接口对象
UserMapper userMapper = session.getMapper(UserMapper.class);
//通过mapper对象执行操作方法
//练习0:插入数据操作
User user = new User();
user.setUsername("tom");
user.setPassword("123456");
int result = userMapper.insertUser(user);
System.out.println(result);
//练习1:根据主键删除数据操作
// int result = userMapper.deleteUser(3);
// System.out.println(result);
//练习2:根据主键修改用户名及密码操作
// User user = new User();
// user.setId(2);
// user.setUsername("zhangsan");
// user.setPassword("abc");
// //
// int result = userMapper.updateUser(user);
// System.out.println(result);
//查询:查询所有的数据
// List<User> list = userMapper.selectUser();
// for (User user : list) { System.out.println(user); }
//添加删除修改要提交事务,不然不会存储到数据库
session.commit();
}
}
练习题
答案在上述代码的注释中
1. 根据主键删除数据操作
2. 根据主键修改用户名及密码操作
3. 查询所有的数据
五、结果映射
我们实际运用的时候,如果实体类中的变量和数据库中的不一致,就会无法访问,所以需要将结果一对一映射
往UserMapper.xml
里加入以下代码,将查询结果字段和实体类中的变量名进行一对一的映射
<!-- 定义结果集的映射 查询结果字段和实体类中的变量名进行一对一的映射 -->
<resultMap id="UserResultMap" type="com.gec.bean.User">
<!-- property实体类中的变量名 column查询结果字段名 -->
<id property="id" column="id"></id>
<result property="username" column="username"></result>
<result property="realname" column="realname"></result>
<result property="password" column="password"></result>
<result property="card" column="IDcard"></result>
<result property="phone" column="phone"></result>
<result property="email" column="email"></result>
<result property="paypwd" column="paypwd"></result>
<result property="status" column="status"></result>
<result property="reputation" column="reputation"></result>
</resultMap>
怎么以映射查询表所有数据 ?
修改UserMapper.xml
以下代码:
<!-- id相当于方法名 resultType 查询结果返回的数据类型 resultType="com.gec.bean.User" -->
<select id="selectUser" resultMap="UserResultMap">
select * from user;
</select>
运行Test.java
,运行结果如下:
可见,只需将 parameterType="com.gec.bean.User"
改成 resultMap="UserResultMap"
,就可以改变入参的数据结构。
最后
实际应用中,我们不需要进行如此复杂的建类、建方法、和映射。mybatis有逆向工程 这一概念(可以根据数据库自动建立以上的操作)点击蓝字直接跳转~