Mybatis简介
MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBatis。是一个基于Java的持久层框架,本身就是基于JDBC封装的,它支持定制化SQL、存储过程以及高级映射。Mybatis避免了几乎所有的JDBC代码和手动设置参数以及获取结果集。可以使用简单的XML或者注解来配置和映射原生类型、接口和java的POJO为数据库中记录。
JDBC原始方法查询数据库
// 1.加载数据库驱动
Class.forName("com.mysql.jdbc.Driver");
// 2.创建并获取数据库连接
Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/mybatis", "root", "root");
// 3.使用Connection创建一个PrepareStatement对象。需要sql语句。
PreparedStatement prepareStatement = connection.prepareStatement("select * from user where id = ?");
// 4.设置参数
prepareStatement.setInt(1, 10);
// 5.执行查询
ResultSet resultSet = prepareStatement.executeQuery();
// 6.获取查询结果
while(resultSet.next()){
System.out.println(resultSet.getString("id")+"..."+resultSet.getString("username"));
}
// 7.释放资源
resultSet.close();
prepareStatement.close();
connection.close();
}
存在的问题:
- 数据库驱动加载存在硬编码问题
- 数据库连接串、用户名、密码存在硬编码问题
- sql语句存在硬编码问题
- 设置参数硬编码
- 最好是把结果封装到java对象中。
- 应该使用数据库连接池
MyBatis入门程序
1.创建工程,创建依赖(maven)
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.1</version>
</dependency>
2.创建jdbc.properties配置文件
代码如下:
jdbc.url=jdbc:mysql://localhost:3306/mybatis
dbc.driver=com.mysql.jdbc.Driver
jdbc.user=root
jdbc.password=root
jdbc.characterEncoding=utf8
3.创建mybatis_conf.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>
<!--引入properties文件 -->
<properties resource="jdbc.properties" />
<typeAliases>
<typeAlias type="com.xxx.mybatis.bean.Student" alias="Student" />
</typeAliases>
<!-- 和spring整合后 environments配置将废除-->
<environments default="development">
<environment id="development">
<!-- 使用jdbc事务管理-->
<transactionManager type="JDBC"/>
<!-- 数据库连接池-->
<dataSource type="POOLED">
<property name="driver" value="${jdbc.driver}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.user}"/>
<property name="password" value="${jdbc.password}"/>
</dataSource>
</environment>
</environments>
</configuration>
mybatis_conf.xml是mybatis核心配置文件,上边文件的配置内容为数据源、事务管理。
4.创建pojo类
@Getter
@Setter
public class Student {
private String cname;
private Integer id;
public Student() {}
public Student(String cname, Integer id) {
this.cname = cname;
this.id = id;
}
@Override
public String toString() {
return "{" +
"cname='" + cname + '\'' +
", id='" + id + '\'' +
"}\n";
}
}
5.sql映射文件(Mapper.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对应空Dao接口的全名 -->
<mapper namespace="com.xxx.mybatis.dao.StudentDao">
<!-- 此处的id是查询语句的名称,对应接口中的方法名 -->
<select id="queryAll" resultType="Student ">
select * from user;
</select>
</mapper>
6.加载映射文件
mybatis框架需要加载映射文件,将下面的代码加到mybatis_conf.xml中:
<mappers>
<mapper resource="mapper/Mapper.xml" />
</mappers>
7.测试
读入配置文件后,构建一个SqlSessionFactory获取sqlSession随后获取Mapper调用dao层中的方法查询数据库信息,代码如下:
// 1. 读入配置文件
String confPath = "mybatis_conf.xml";
InputStream in = Resources.getResourceAsStream(confPath);
// 2. 构建SqlSessionFactory(用于获取sqlSession)
SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(in);
// 3. 获取sqlSession对象(用于具体的CRUD)
SqlSession sqlSession = sessionFactory.openSession();
StudentDao studentDao = sqlSession.getMapper(StudentDao.class);
List<Student> studentList = studentDao.queryAll();
log.info("studentList: " +studentList);//需要添加@slf4j
获取sqlSession有两种方法一种是上面所讲通过sessionFactory中获取,另一种则是通过mybatis的SqlSessionFactory托管给Spring容器后,通过配置spring xml文件和注解来获取。
8.其他
sql语句若是动态的where条件后是?我们则需要在sql语句后面添加#{}和
来
获
取
但
是
这
两
种
占
位
符
也
有
区
别
:
{}来获取但是这两种占位符也有区别:
来获取但是这两种占位符也有区别:{}:作用是字符串拼接,如果参数是简单数据类型那么括号中必须是value,如果参数是实现类类型,括号中应该是实现类的属性。
#{}是预编译处理(PreparedStatement),相当于原来的?,而KaTeX parse error: Expected 'EOF', got '#' at position 20: …符串替换。Mybatis在处理#̲时,会调用PreparedSt…时,就是把KaTeX parse error: Expected 'EOF', got '#' at position 11: {}替换成变量的值。#̲方式能够很大程度防止sql注入…方式一般用于传入数据库对象,例如传入表名,一般能用#的就别用$。
至此简单的mybatis基本知识解释得差不多了,更深的知识等以后再次探讨。