一.简介
- 帮助程序员将数据存入到数据库中
- 传统的JDBC代码太复杂。
- 不用Mybatis也可以。更容易上手。
- 特性:简单易学,灵活,解除sql与程序代码的耦合,提供映射标签,提供对象关系映射标签,提供xml标签,支持编写动态sql
二.原理图
三.编码过程
3.1导入jar包
3.2 创建Source Folder(代码文件夹) config
3.3在config下创建配置文件
- log4j.properties(日志文件)
#全局log日志配置
#在开发环境下日志级别要设置成debug,生产环境设置成info或者error
log4j.rootLogger = debug,stdout
log4j.appender.stdout = org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout = org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n
- SqlMapConfig.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>
<environments default="mysql">
<!-- 配置mysql的环境-->
<environment id="mysql">
<!-- 配置事务 -->
<transactionManager type="JDBC"/>
<!--配置连接池-->
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/test"/>
<property name="username" value="root"/>
<property name="password" value="admin"/>
</dataSource>
</environment>
</environments>
<!-- 配置映射文件的位置 -->
<mappers>
<mapper resource="sqlmap/DeptMapper.xml"/>
</mappers>
</configuration>
3.4 在config下创建包sqlmap(Package)用于存放映射文件
3.5 创建com.neuedu.pojo包用于存放javabean
package com.neuedu.pojo;
public class Dept {
private int deptno;
private String dname;
private String loc;
public int getDeptno() {
return deptno;
}
public void setDeptno(int deptno) {
this.deptno = deptno;
}
public String getDname() {
return dname;
}
public void setDname(String dname) {
this.dname = dname;
}
public String getLoc() {
return loc;
}
public void setLoc(String loc) {
this.loc = loc;
}
}
3.6 编写映射文件(DeptMapper.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">
<!--
namespace命名空间,作用就是对sql进行分类化管理,使用mapper代理方法开发,
namespace有重要作用,不要重复。
-->
<mapper namespace="test">
<!-- 在映射文件中可以配置很多sql语句块 -->
<!-- 1.根据部门ID查询部门信息 -->
属性id:表示映射文件中的sql,具有唯一标识性;
属性parameterType:指定输入参数的数据类型(这里指定int类型);
属性resultType:指定sql输出结果集映射的java对象类型;
#{}:表示一个占位符;
#{deptno}:其中的deptno表示输入的参数,参数名称就是deptno;
如果参数的类型是简单类型,#{}中的参数名可以任意,可以是value或者其他名称-->
<select id="findDeptByid" parameterType="int" resultType="com.neuedu.pojo.Dept">
select * from dept where deptno = #{deptno}
</select>
<!-- 2.根据名字模糊查询 -->
属性resultType:指的是单条记录所映射的java对象类型(即使结果集为list,该属性值也是单条记录的类型);
${}:表示拼接sql语句,将接收到的参数直接拼接在sql中;
${value}:可以将接收输入的参数加以处理拼接在sql中;
如果传入的是简单类型,${}中只能写value;
注意:${}存在sql问题,安全性低;解决方式在《MyBatis K01(20211006)模糊查询中-->
<select id="findDeptByName" parameterType="java.lang.String" resultType="com.neuedu.pojo.Dept">
select * from dept where dname like '%${value}%'
</select>
<!-- 3.添加用户 -->
parameterType属性:指定输入参数的类型;
#{}中指定了pojo类的属性名,接收了pojo对象的属性值;
注意:此时花括号中的内容必须与pojo类的属性名一致,而其他#{}处则没有要求;-->
<insert id="insertDept" parameterType="com.neuedu.pojo.Dept">
insert into dept(dname,loc) values(#{dname},#{loc});
</insert>
<!-- 4.删除用户 -->
<delete id="deleteDept" parameterType="int">
delete from dept where deptno = #{deptno}
</delete>
<!-- 5.修改用户 -->
parameterType属性:指的是dept对象(包括deptno和更新的信息);
#{loc}:从输入对象中获取loc的属性值
注意:此时花括号中的内容必须与pojo类的属性名一致,而其他#{}处则没有要求;-->
<update id="updateDept" parameterType="com.neuedu.pojo.Dept">
update dept set dname = #{dname} ,loc = #{loc} where deptno = #{deptno};
</update>
</mapper>
3.7 编写运行测试类(DeptTest.java)
- 编写步骤:
1.定义mybaties的配置文件路径;
2.得到配置文件流;
3.创建会话工厂,传入mybaties的配置文件流;
4.通过工厂创建sqlSession;
5.通过sqlSession操作数据库;
6.提交事务(增删改需要,查询跳过);
7.关闭资源;
public class DeptTest {
/**
* 根据ID查询部门信息
* @throws IOException
*/
@Test // 单元测试
public void findDeptById() throws IOException {
// 定义mybaties的配置文件路径
String resource = "SqlMapConfig.xml";
// 得到配置文件流
InputStream inputStream = Resources.getResourceAsStream(resource);
// 创建会话工厂,传入mybaties的配置文件流
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
// 通过工厂创建sqlSession
SqlSession sqlSession = sqlSessionFactory.openSession();
// 通过sqlSession操作数据库
// 第一个参数:映射文件中statement的id:namespace +"."+ statement的id
// 第二个参数:指定和映射文件中所匹配的parameterType类型的参数
Dept dept = sqlSession.selectOne("test.findDeptByid", 10);
System.out.println(dept);
// 释放资源
sqlSession.close();
}
/**
* 根据名字模糊查询
* @throws IOException
*/
@Test
public void findDeptByName() throws IOException {
// 定义mybaties的配置文件路径
String resource = "SqlMapConfig.xml";
// 得到配置文件流
InputStream inputStream = Resources.getResourceAsStream(resource);
// 创建会话工厂,传入mybaties的配置文件流
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
// 通过工厂创建sqlSession
SqlSession sqlSession = sqlSessionFactory.openSession();
// 通过sqlSession操作数据库
//List<Dept> deptList = sqlSession.selectList("test.findDeptByName", "发");
//这里存在sql注入问题,如下例经测试会查出所有记录
List<Dept> deptList = sqlSession.selectList("test.findDeptByName", "发%' or 1=1 or loc like '%a");
System.out.println(deptList);
//关闭资源
sqlSession.close();
}
/**
* 插入部门信息
*/
@Test
public void insertDept() throws IOException {
// 定义mybaties的配置文件路径
String resource = "SqlMapConfig.xml";
// 得到配置文件流
InputStream inputStream = Resources.getResourceAsStream(resource);
// 创建会话工厂,传入mybaties的配置文件流
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
// 通过工厂创建sqlSession
SqlSession sqlSession = sqlSessionFactory.openSession();
// 创建Dept对象封装数据
Dept dept = new Dept();
dept.setDname("总裁办");
dept.setLoc("软件园");
// 通过sqlSession操作数据库
// 第二个参数:直接穿对象即可
sqlSession.insert("test.insertDept", dept);
// 提交事务,修改表数据时需要提交事务
sqlSession.commit();
//关闭资源
sqlSession.close();
}
/**
* 删除用户
* @throws IOException
*/
@Test
public void deleteDept() throws IOException {
// 定义mybaties的配置文件路径
String resource = "SqlMapConfig.xml";
// 得到配置文件流
InputStream inputStream = Resources.getResourceAsStream(resource);
// 创建会话工厂,传入mybaties的配置文件流
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
// 通过工厂创建sqlSession
SqlSession sqlSession = sqlSessionFactory.openSession();
//通过sqlSession操作数据库
sqlSession.delete("test.deleteDept",105);
//提交事务
sqlSession.commit();
//关闭资源
sqlSession.close();
}
/**
* 修改用户信息
*/
@Test
public void updateDept() throws IOException {
// 定义mybaties的配置文件路径
String resource = "SqlMapConfig.xml";
// 得到配置文件流
InputStream inputStream = Resources.getResourceAsStream(resource);
// 创建会话工厂,传入mybaties的配置文件流
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
// 通过工厂创建sqlSession
SqlSession sqlSession = sqlSessionFactory.openSession();
Dept dept = new Dept();
dept.setDeptno(103);
dept.setDname("总裁办");
dept.setLoc("软件园ggg");
//通过sqlSession操作数据库
sqlSession.update("test.updateDept",dept);
//提交事务
sqlSession.commit();
//关闭资源
sqlSession.close();
}
}