MyBatis 概述 Mybatis 是一种持久层的框架,通过建立接口的方法和 XML 注册的 SQL 语句的映射关系来实现对数据库的操作。
入门 获取数据库连接之前 首先获取数据库的连接实例 SqlSession 的连接池 SqlSessionFactory:
1 2 3 4 5 6 7 8 9 10 11 12 13 private static SqlSessionFactory factory; static { try { String resource="MyBatis-config.xml" ; InputStream inputstream = Resources.getResourceAsStream(resource); factory = new SqlSessionFactoryBuilder().build(inputstream); } catch (IOException e) { e.printStackTrace(); } } public static SqlSession getSession () { return factory.openSession(); }
获取连接池需要在服务器启动的时候进行,所以放到静态代码块里面执行。上面的 SqlSessionFactoryBuilder
作用就是按照配置文件建造连接池,此实例用完就扔,所以不给外部引用,让 GC 把它回收了。留着 SqlSessionFactory
作为单独一个连接池管理 SQL 连接。
数据库连接 在 MyBatis-config.xml
连接池配置中加入数据库连接环境,其中 <property>
标签中的 value 中依次填入所有的信息即可。
或者外部引入一个 properties 文件,里面写上数据库连接数据,然后用 ${PropertyName}
的方式引用。
外部文件 DataBase.properties
:
1 2 3 4 driver =com.mysql.jdbc.Driver url =jdbc:mysql://localhost:3306/mybatis?useSSL=true&useUnicode=true&characterEncoding=utf8 username =root password =123456
然后配置文件:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 <configuration > <properties resource ="DataBase.properties" > </properties > <environments default ="development" > <environment id ="development" > <transactionManager type ="JDBC" > </transactionManager > <dataSource type ="POOLED" > <property name ="driver" value ="${jdbc.driver}" /> <property name ="url" value ="${jdbc.url}" /> <property name ="username" value ="${jdbc.username}" /> <property name ="password" value ="${jdbc.password}" /> </dataSource > </environment > </environments > </configuration >
建立 DAO 层方法和 SQL 语句的映射 DAO 层的接口:
1 2 3 4 5 6 7 8 public interface UserMapper { List<User> getUsers () ; int addUser (User user) ; int updateUser (User user) ; int deleteUserByUserName (String userName) ; User queryUserById (Integer id) ; User queryUserByUserName (String userName) ; }
新建数据库操作接口映射的 XML 文件:
1 2 3 4 5 6 7 8 9 <?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 ="space.xorex.mapper.UserMapper" > <select id ="getUsers" resultType ="space.xorex.pojo.User" > select * from user </select > </mapper >
注意上面的 namespace
是下方的 SQL 语句映射的执行方法 名称所在的定义空间(就是定义这些方法的接口),接口只能写完整的类名,不可以用别名。然后每一条就是执行方法映射的 SQL 语句。
对于这些映射标签,比如下面的,就一定要注意对应的接口方法名称的 参数 和 返回值,写对应的信息,而对于常见的数据类型,MyBatis 进行了别名映射,可以不区分大小写 的使用这些别名。然后就是占位符的填充,使用 #{}
里面写数据名,是从 parameterType 中寻找的(但其实这个属性完全可以不写)。
1 2 3 4 5 6 <select id ="queryUserByUserName" resultType ="space.xorex.pojo.User" parameterType ="string" > select * from user where userName=#{userName} </select >
获取 Mapper 实例 直接用 MybatisUtils 里面的 getSession() 获取连接,然后调用 SqlSession 的 getMapper() 获取对应 Mapper 接口的实现对象。都用完之后,SqlSession 需要提交 commit() 和关闭 close()。
1 2 3 4 5 6 7 8 9 10 11 public class UserMapperTest { SqlSession session=MybatisUtils.getSession(); @Test public void insertUser () { UserMapper mapper=session.getMapper(UserMapper.class); mapper.insertUser("This" , "That" ); session.commit(); session.close(); } }
需要说一下的是,这里获取的 Mapper 接口实现类,其实是一个动态代理类,叫作 MapperProxy,这个动态代理类是 Mybatis 根据配置文件自动生成的。