ssm框架中学习过程中较简单的一个框架。
MyBatis (ibatis)是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。(百度百科)
也就是说mybatis使数据库sql语句与Java代码“分开”,降低耦合,并且对于数据库语句的书写也比传统的jdbc要简单许多。
使用
1. 创建一个maven项目,在pom文件中导入相关jar包依赖。获取mybatis,SQL server数据库驱动jar包
<dependency> <groupId>org.mybatisgroupId> <artifactId>mybatisartifactId> <version>3.5.3version> dependency> <dependency> <groupId>com.microsoft.sqlservergroupId> <artifactId>mssql-jdbcartifactId> <version>7.0.0.jre10version> dependency>
2. 创建mybatis核心配置文件,mybatis-config.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="sql"> <environment id="sql"> <transactionManager type="JDBC"/> <dataSource type="POOLED"> <property name="driver" value="com.microsoft.sqlserver.jdbc.SQLServerDriver"/> <property name="url" value="jdbc:sqlserver://localhost:1433;databaseName=TestData"/> <property name="username" value="sa"/> <property name="password" value="123456"/> dataSource> environment> environments> <mappers> <mapper resource="com/cheng/dao/UserMapper.xml"/> mappers> configuration>
Mybatis默认的事务管理器就是 JDBC , 连接池 : POOLED
MyBatis 的配置文件包含了会深深影响 MyBatis 行为的设置和属性信息。
configuration(配置)
properties(属性)
settings(设置)
typeAliases(类型别名)
typeHandlers(类型处理器)
objectFactory(对象工厂)
plugins(插件)
environments(环境配置)
environment(环境变量)
transactionManager(事务管理器)
dataSource(数据源)
databaseIdProvider(数据库厂商标识)
mappers(映射器)
例:typeAliases(类型别名)设置
<typeAliases> <package name="com.cheng.pojo"/> typeAliases>
若批量定义别名后,mapper映射文件中。
<-- 未定义别名--> <select id="getUserList" resultType="com.cheng.pojo.User"> select * from sqldata select> <insert id="addUser" parameterType="com.cheng.pojo.User"> insert into sqldata (id,name,pwd) values(#{id},#{name},#{pwd}); insert> <--已定义别名 --> <select id="getUserList" resultType="User"> select * from sqldata select> <insert id="addUser" parameterType="User"> insert into sqldata (id,name,pwd) values(#{id},#{name},#{pwd}); insert>
例:通过properties属性来实现引用配置文件(连接数据库)
连接SQL server数据库的 db.properties
driver=com.microsoft.sqlserver.jdbc.SQLServerDriver
url=jdbc:sqlserver://localhost:1433;databaseName=TestData
username=sa
password=123456
连接mysql数据库的 db.properties
driver=com.mysql.cj.jdbc.Driver
url=jdbc:mysql://localhost:3306/jdbc?useSSL=false&serverTimezone=UTC
username=root
password=123456
引用.properties文件
...... ...... <properties resource="db.properties"/> <environments default="sql"> <environment id="sql"> <transactionManager type="JDBC"/> <dataSource type="POOLED"> <property name="driver" value="${driver}"/> <property name="url" value="${url}"/> <property name="username" value="${username}"/> <property name="password" value="${password}"/> dataSource> environment> environments> ...... ......
例:mappers(映射器)
<-- 方式一: 【推荐使用】--> <mappers> <mapper resource="com/cheng/dao/UserMapper.xml"/> mappers> <-- 方式一: 使用class文件绑定注册--> <mappers> <mapper class="com.cheng.dao.UserMapper"/> mappers>
3. 编写mybatis工具类
//sqlSessionFactory --> sqlSession public class MybatisUtils { private static SqlSessionFactory sqlSessionFactory; static{ try { //使用Mybatis第一步:获取sqlSessionFactory对象 String resource = "mybatis-config.xml"; InputStream inputStream = Resources.getResourceAsStream(resource); sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); } catch (IOException e) { e.printStackTrace(); } } //既然有了 SqlSessionFactory,顾名思义,我们就可以从中获得 SqlSession 的实例了。 // SqlSession 完全包含了面向数据库执行 SQL 命令所需的所有方法。 public static SqlSession getSqlSession(){ return sqlSessionFactory.openSession(); } }
4. pojo层编写实体类,类实例域要与数据库中列中属性相对应,名称相同(不相同也可以)
package com.cheng.pojo; import lombok.*; @Setter //生成set方法,final变量不包含 @Getter //生成get方法,final变量不包含 @AllArgsConstructor //生成所有参数的构造方法 /* @NoArgsConstructor //生成无参构造方法 @ToString //生成所有属性的toString()方法 @EqualsAndHashCode //生成生成equals()方法和hashCode方法 @Data //包括@Setter/@Getter,@ToString ,@EqualsAndHashCode,@RequiredArgsConstructor @RequiredArgsConstructor //生成一个包含 "特定参数" 的构造器,特定参数指的是那些有加上 final 修饰词的变量. // 如果所有的变量都是正常的,都没有用 final 修饰的话,那就会生成一个没有参数的构造器 */ public class User { private int id; private String name; private String pwd; @Override public String toString() { return "User{" + "id=" + id + ", name='" + name.trim() + '\'' + ", pwd='" + pwd.trim() + '\'' + '}'; } }
5. dao层接口,并编写映射文件 UserDao.xml(接口实现类由原来的UserDaoImpl转变为一个 Mapper配置文件)
package com.cheng.dao; import com.cheng.pojo.User; import java.util.List; public interface UserDao { //查询全部信息 ListgetUserList(); //根据id查询 List getUserListById(int id); //插入信息 void addUser(User user); //修改用户 void updateUser(User user); //删除用户 void deleteUser(int id); }
映射文件
namespace中的包名要和 Dao/mapper 接口的包名一致!
resultType:Sql语句执行的返回值。
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 namespace="com.cheng.dao.UserDao"> <select id="getUserList" resultType="com.cheng.pojo.User"> select * from sqldata select> <select id="getUserListById" resultType="com.cheng.pojo.User" parameterType="int"> select * from sqldata where id=#{id} select> <insert id="addUser" parameterType="com.cheng.pojo.User"> insert into sqldata (id,name,pwd) values(#{id},#{name},#{pwd}); insert> <update id="updateUser" parameterType="com.cheng.pojo.User"> update sqldata set name=#{name},pwd=#{pwd} where id=#{id} update> <delete id="deleteUser" parameterType="int"> delete from sqldata where id=#{id}; delete> mapper>
单元测试
import com.cheng.pojo.User; import com.cheng.utils.MybatisUtils; import org.apache.ibatis.session.SqlSession; import org.junit.Test; import java.util.List; public class JTest { @Test public void test(){ //第一步:获得SqlSession对象 SqlSession sqlSession; sqlSession = MybatisUtils.getSqlSession(); //方式一:getMapper UserDao userDao = sqlSession.getMapper(UserDao.class); ListuserList = userDao.getUserList(); for (User user : userList) { System.out.println(user); } //关闭SqlSession sqlSession.close(); } @Test public void test2(){ SqlSession sqlSession = MybatisUtils.getSqlSession(); UserDao mapper = sqlSession.getMapper(UserDao.class); List userListById = mapper.getUserListById(1); System.out.println(userListById); sqlSession.close(); } //增删改需要提交事务 @Test public void test3(){ SqlSession sqlSession =MybatisUtils.getSqlSession(); UserDao userDao=sqlSession.getMapper(UserDao.class); userDao.addUser(new User(3,"YuQingSong","123456")); sqlSession.commit(); //提交事务 sqlSession.close(); } }