MyBatis依赖信息
使用版本3.4.6
<!-- https://mvnrepository.com/artifact/org.mybatis/mybatis -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.6</version>
</dependency>
概述
MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解来配置和映射原生信息,将接口和 Java 的 POJOs(Plain Old Java Objects,普通的 Java对象)映射成数据库中的记录。
MyBatis主要就完成2件事情
1. 封装JDBC操作
2. 利用反射打通Java类与SQL语句之间的相互转换
MyBatis的主要设计目的就是让我们对执行SQL语句时对输入输出的数据管理更加方便,所以方便地写出SQL和方便地获取SQL的执行结果才是MyBatis的核心竞争力。
特点
- 简单易学:本身就很小且简单。没有任何第三方依赖,最简单安装只要两个jar文件+配置几个sql映射文件易于学习,易于使用,通过文档和源代码,可以比较完全的掌握它的设计思路和实现。
- 灵活:mybatis不会对应用程序或者数据库的现有设计强加任何影响。 sql写在xml里,便于统一管理和优化。通过sql基本上可以实现我们不使用数据访问框架可以实现的所有功能,或许更多。
- 解除sql与程序代码的耦合:通过提供DAL层,将业务逻辑和数据访问逻辑分离,使系统的设计更清晰,更易维护,更易单元测试。sql和代码的分离,提高了可维护性。
- 提供映射标签,支持对象与数据库的orm字段关系映射
- 提供对象关系映射标签,支持对象关系组建维护
- 提供xml标签,支持编写动态sql
体系结构
1.0版本用mybaits配置文件加一个mapper.xml文件和一个实体类一个测试类能进行简单的查询操作 还需要一个log4j日志文件
项目结构:
配置文件中需要添加三个依赖
<dependencies>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.41</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.mybatis/mybatis -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.6</version>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.12</version>
</dependency>
</dependencies>
mybaits配置文件的内容:
<?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>
<!-- 和spring整合后 environments配置将废除 -->
<environments default="development">
<environment id="development">
<!-- 使用jdbc事务管理 -->
<transactionManager type="JDBC" />
<!-- 数据库连接池,此处使用的是mybaits的连接池 &要用&;来表示 -->
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver" />
<property name="url"
value="jdbc:mysql://localhost:3306/mystudent?useSSL=true&characterEncoding=utf-8" />
<property name="username" value="root" />
<property name="password" value="root" />
</dataSource>
</environment>
</environments>
<!--添加映射文件-->
<mappers>
<mapper resource="StudentMapper.xml"></mapper>
</mappers>
</configuration>
映射文件:StudentMapper.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="test">
<!-- id:statement的id 或者叫做sql的id-->
<!-- parameterType:声明输入参数的类型 -->
<!-- resultType:声明输出结果的类型,应该填写pojo的全路径 -->
<!-- #{}:输入参数的占位符,相当于jdbc的?
如果是简单类型(基本类型、字符串类型)名称可以任意-->
<select id="queryAll" parameterType="Integer"
resultType="com.qf.pojo.Student">
SELECT * FROM `user`
</select>
</mapper>
pojo中的实体类就是domain中的实体类,此处就不添加。
mybatis的测试类:
public class Demo1 {
public static void main(String[] args) throws Exception {
//1.读取mybatis的配置文件
InputStream is = Resources.getResourceAsStream("mybatis-config.xml");
//2.创建SqlSessionFactory
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(is);
//3.获取SqlSession(通过工厂获取连接)
SqlSession sqlSession = factory.openSession();
//4.执行
List<Student> studentList = sqlSession.selectList("test.queryAll");
//5.遍历
for (Student student : studentList) {
System.out.println(student.toString());
}
//6.关闭
sqlSession.close();
}
}
这种方法执行太麻烦,有很大的代码冗余
2.0版本
项目结构:
这个版本将创建SqlSession对象封装到一个工具类中pom和1.0版本的内容一样,log4j和mybatis-config.xml也和1.0版本一样,UserMapper.xml中有了增删改查的sql语句
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">
<!-- namespace:命名空间,用于隔离sql,还有一个很重要的作用,后面会讲 -->
<mapper namespace="test">
<!--查询所有-->
<select id="findAll" resultType="com.qf.pojo.User">
select * from user
</select>
<!--根据用户名模糊查询 #相当于占位符? 会自动加'' ${} 相当于字符串的拼接-->
<select id="findByUsername" resultType="com.qf.pojo.User">
select * from user where username like #{username};
</select>
<!--根据ID查询 resultType结果类型(输出)-->
<select id="findById" resultType="com.qf.pojo.User">
select * from user where id=#{id}
</select>
<!--添加 parameterType参数类型 (输入)-->
<insert id="add" parameterType="com.qf.pojo.User">
<selectKey keyProperty="id" resultType="int" order="AFTER">
select LAST_INSERT_ID();
</selectKey>
insert into user (username,birthday,sex,address) values (#{username},#{birthday},#{sex},#{address})
</insert>
<!--更新-->
<update id="update" parameterType="com.qf.pojo.User">
update user set username=#{username},birthday=#{birthday},sex=#{sex},address=#{address} where id=#{id}
</update>
<!--删除-->
<delete id="delete" parameterType="int">
delete from user where id=#{id}
</delete>
</mapper>
这个版本中添加了dao层,有dao接口以及dao的实现类,dao接口及实现类的代码如下:
public interface UserDao {
List<User> findAll();
User findById(int id);
List<User> findByUsername(String username);
void add(User user);
void update(User user);
void delete(int id);
}
public class UserDaoImpl implements UserDao {
@Override
public List<User> findAll() {
SqlSession sqlSession = MyBatisUtils.openSession();
//此处的“test”对应的是UserMapper.xnl中mapper的namespace,findAll对应的是select的id,下面的同理
List<User> userList = sqlSession.selectList("test.findAll");
sqlSession.close();
return userList;
}
@Override
public User findById(int id) {
SqlSession sqlSession = MyBatisUtils.openSession();
User user = sqlSession.selectOne("test.finById", id);
sqlSession.close();
return user;
}
@Override
public List<User> findByUsername(String username) {
SqlSession sqlSession = MyBatisUtils.openSession();
List<User> userList = sqlSession.selectList("test.findByUsername",username);
sqlSession.close();
return userList;
}
@Override
public void add(User user) {
SqlSession sqlSession = MyBatisUtils.openSession();
sqlSession.insert("test.add",user);
//提交事务
sqlSession.commit();
sqlSession.close();
}
@Override
public void update(User user) {
SqlSession sqlSession = MyBatisUtils.openSession();
sqlSession.update("test.update",user);
//提交事务
sqlSession.commit();
sqlSession.close();
}
@Override
public void delete(int id) {
SqlSession sqlSession = MyBatisUtils.openSession();
sqlSession.delete("test.delete",id);
//提交事务
sqlSession.commit();
sqlSession.close();
}
}
MyBatisUtils作用,通过创建SqlSessionFactory来获得SqlSession对象
public class MyBatisUtils {
private static SqlSessionFactory factory;
static {
//1创建流读取mybaits-config.xml
try {
InputStream is = Resources.getResourceAsStream("mybatis-config.xml");
factory = new SqlSessionFactoryBuilder().build(is);
System.out.println("sqlsesisonfactory初始化成功");
} catch (IOException e) {
e.printStackTrace();
System.out.println("sqlsesisonfactory初始化失败");
}
}
// (2)返回SqlSession的方法
public static SqlSession openSession(){
return factory.openSession();
}
}
最后是测试类
UserDaoTest.java
public class UserDaoTest {
UserDao userDao = new UserDaoImpl();
@Test
public void testFindAll(){
List<User> userList = userDao.findAll();
for (User user : userList) {
System.out.println(user.toString());
}
}
@Test
public void testFindById(){
User user = userDao.findById(10);
System.out.println(user.toString());
}
@Test
public void testFindByUsername(){
List<User> userList = userDao.findByUsername("%张%");
for (User user : userList) {
System.out.println(user.toString());
}
}
@Test
public void testAdd(){
User user = new User(0,"周芷若","2014-08-08","2","安阳");
userDao.add(user);
System.out.println(user.toString());
}
@Test
public void testUpdate(){
User user = new User(27,"周芷若","2008-9-18","2","安阳");
userDao.update(user);
}
@Test
public void testDelete(){
userDao.delete(26);
}
}
版本3.0
先上项目结构:
mybatis-config.xml和log4j和之前是一样的
这个版本主要的是UserMapper.xml在UserMapper接口要在同一个包下面
在mybaits-config.xml中将映射文件的mappers改成下面这样
<mappers>
<!--<mapper resource="StudentMapper.xml"></mapper>-->
<mapper resource="com/qf/mapper/UserMapper.xml"></mapper>
</mappers>
mapper包中只用写接口和xml文件即可,不过,接口的方法和配置文件中的id要一一对应,pojo还是用来放实体类
public interface UserMapper {
List<User> findAll();
User findById(int id);
List<User> findByUsername(String username);
void add(User user);
void update(User user);
void delete(int id);
}
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">
<!-- namespace:命名空间,用于隔离sql,还有一个很重要的作用,后面会讲 -->
<mapper namespace="com.qf.mapper.UserMapper">
<select id="findAll" resultType="User">
select * from USER
</select>
<!--根据id查询-->
<select id="findById" resultType="User">
select * from USER where id=#{id}
</select>
<!--根据用户名模糊查询-->
<select id="findByUsername" resultType="User">
select * from user where username like #{username}
</select>
<insert id="add" parameterType="User">
insert into user (username,birthday,sex,address) values (#{username},#{birthday},#{sex},#{address})
</insert>
<update id="update" parameterType="User">
update user set username=#{username},birthday=#{birthday},sex=#{sex},address=#{address} where id=#{id}
</update>
<delete id="delete">
delete from user where id=#{id}
</delete>
</mapper>
测试类和工具类与2.0版本一样。