概述
mybatis是一个优秀的基于java的持久层框架,它内部封装了 jdbc,使开发者只需要关注sq语句本身,而不需要花费精力 去处理加载驱动、创建连接、创建 statement等繁杂的过程。
mybatis通过xm或注解的方式将要执行的各种 statement配 置起来,并通过java对象和 statement中sq的动态参数进行 映射生成最终执行的sq语句。
最后 mybatis框架执行sql并将结果映射为java对象并返回。采用ORM思想解决了实体和数据库映射的问题,对jdbc进行了封装,屏蔽了 jdbc api底层访问细节,使我们不用与 jdbc api打交道,就可以完成对数据库的持久化操作。
开发步骤
添加依赖
1 2 3 4 5 6 7 8 9 10 11 <dependency > <groupId > mysql</groupId > <artifactId > mysql-connector-java</artifactId > <version > 5.1.46</version > </dependency > <dependency > <groupId > org.mybatis</groupId > <artifactId > mybatis</artifactId > <version > 3.4.6</version > </dependency >
编写数据表与Bean类
创建并编写mapper.xml
1 2 3 4 5 6 7 8 <?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 ="userMapper" > <select id ="findAll" resultType ="com.myspring.bean.User" > select * from user </select > </mapper >
创建并编写sqlMapConfig.xml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 <?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 ="" > <environment id ="development" > <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 ="123456789" /> </dataSource > </environment > </environments > </configuration >
调用操作
1 2 3 4 5 6 7 8 9 10 11 12 InputStream resourceAsStream = Resources.getResourceAsStream("mybatis/sqlMapConfig.xml" ); SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream); SqlSession sqlSession = sqlSessionFactory.openSession(); List<User> userList = sqlSession.selectList("userMapper.findAll" ); System.out.println(userList); sqlSession.close();
增删改查操作代码 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 <?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 ="userMapper" > <select id ="findAll" resultType ="com.myspring.bean.User" > select * from user </select > <insert id ="save" parameterType ="com.myspring.bean.User" > insert into user values (#{name}, #{age}) </insert > <update id ="update" parameterType ="com.myspring.bean.User" > update user set age=#{age} where name = #{name} </update > </mapper >
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 InputStream resourceAsStream = Resources.getResourceAsStream("mybatis/sqlMapConfig.xml" ); SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream); SqlSession sqlSession = sqlSessionFactory.openSession(); List<User> userList = sqlSession.selectList("userMapper.findAll" ); sqlSession.insert("userMapper.save" , new User("李52四" , 11 )); sqlSession.update("userMapper.update" , new User("李52四" , 110 )); sqlSession.delete("userMapper.delete" , "李52四" ); sqlSession.commit(); sqlSession.close();
配置文件常用标签 environments标签
配置数据库环境,支持多环境
transactionManager事务管理器属性
JDBC: 这个配置就是直接使用了JDBC的提交和回滚设置,它依赖于从数据源得到的连接来管理事务作用域
MANAGED: 这个配置几乎没做什么。它从来不提交或回滚一个连接,而是让容器来管理事务的整个生命周期(比如JEE应用服务器的上下文)。默认情况下它会关闭连接,然而一些容器并不希望这样,因此需要将closeConnection属性设置为false来阻止它默认的关闭行为。
daraSource数据源属性
UNPOOLED:这个数据源的实现只是每次被请求时打开和关闭连接。
POOLED:这种数据源的实现利用“池”的概念将JDBC连接对象组织起来。
JNDI:这个数据源的实现是为了能在如EJB或应用服务器这类容器中使用,容器可以集中或在外部配置数据源,然后放置一个JNDI上下文的引用。
Mapper标签
加载映射,加载方式有多种。
使用相对于类路径的资源引用,例如:< mapper resource=”org/ mybatis/ builder/ AuthorMapperxm”/>
使用完全限定资源定位符(URL),例如:< mapper url=”file//ar/ mappers/ Author Mapper.xm”/
使用映射器接口实现类的完全限定类名,例如:< mapper class=” org. mybatis builder. AuthorMapper”/>
将包内的映射器接口实现全部注主册为映射器,例如:< package name=” org. mybatis. builder”/>
Properties标签
实际开发中,习惯将数据源的配置信息单独抽取成个 properties文件,该标签可以加载额外配置的 properties文件
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 <?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 resource ="jdbc.properties" /> <environments default ="development" > <environment id ="development" > <transactionManager type ="JDBC" /> <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 > <mappers > <mapper resource ="mybatis/UserMapper.xml" /> </mappers > </configuration >
typeAliases标签
起别名,有已经设置好的常用的类型的别名,也可自定义
1 2 3 4 <typeAliases > <typeAlias type ="com.myspring.bean.User" alias ="user" /> </typeAliases >
MyBatis相关API SqlSession工厂构建器SqlSessionFactoryBuilder
SqlSession工厂对象SqlSessionFactory
SqlSession会话对象
DAO层实现
采用 Mybatis的代理开发方式实现DAO层的开发,这种方式是我们后面进入企业的主流。
Mapper接口开发方法只需要程序员编写 Mapper接口(相当于Dao接口),由 Mybatis框架根据接口定义创建接口的动态代理对象,代理对象的方法体同上边Dao接口实现类方法。
Mapper.xm文件中的 namespace与 mapper接口的全限定名相同
Mapper接口方法名和 Mapper. xm中定义的每个 statement的id相同
Mapper接口方法的输入参数类型和 mapper. xn中定义的毎个sql的 parameter Type的类型相同
Mapper接口方法的辅出参数类型和 mapper. xm中定义的每个sq的 resultType的类型相同
创建并编写Mapper.xml文件
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 <?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.myspring.dao.UserMapper" > <select id ="findAll" resultType ="user" > select * from user </select > <select id ="findByName" parameterType ="int" resultType ="user" > select * from user where id = #{id} </select > </mapper >
创建并编写Mapper接口
1 2 3 4 5 6 public interface UserMapper { List<User> findAll () throws Exception ; User findById (int id) ; }
调用
1 2 3 4 5 6 7 InputStream resourceAsStream = Resources.getResourceAsStream("myBatis/sqlMapConfig.xml" ); SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream); SqlSession sqlSession = sqlSessionFactory.openSession(); UserMapper mapper = sqlSession.getMapper(UserMapper.class); List<User> all = mapper.findAll(); User user = mapper.findById(2 );
映射文件:动态sql语句 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 <sql id ="selectUser" > select * from user </sql > <select id ="findByCondition" parameterType ="user" resultType ="user" > <include refid ="selectUser" /> <where > <if test ="id!=0" > and id=#{id} </if > <if test ="name!=null" > and name=#{name} </if > <if test ="age!=0" > and age=#{age} </if > </where > </select > <select id ="findByIds" parameterType ="list" resultType ="user" > <include refid ="selectUser" /> <where > -- select * from user where id in(?,?) -- collection写list或array等 <foreach collection ="list" open ="id in(" close =")" item ="id" separator ="," > #{id} </foreach > </where > </select >
配置文件 类型转换TypeHandler标签 黑马程序员最全SSM框架教程|Spring+SpringMVC+MyBatis全覆盖_SSM整合_哔哩哔哩_bilibili
插件plugins标签
添加依赖
1 2 3 4 5 6 7 8 9 10 <dependency > <groupId > com.github.pagehelper</groupId > <artifactId > pagehelper</artifactId > <version > 5.1.2</version > </dependency > <dependency > <groupId > com.github.jsqlparser</groupId > <artifactId > jsqlparser</artifactId > <version > 1.0</version > </dependency >
在配置文件中添加标签
1 2 3 4 5 <plugins > <plugin interceptor ="com.github.pagehelper.PageHelper" > <property name ="dialect" value ="mysql" /> </plugin > </plugins >
调用
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 PageHelper.startPage(1 , 1 ); List<User> userList = mapper.findAll(); PageInfo<User> userPageInfo = new PageInfo<>(userList); for (User user : userList) { System.out.println(user); } System.out.println("上一页:" + userPageInfo.getPrePage()); System.out.println("当前页:" + userPageInfo.getPageNum()); System.out.println("下一页:" + userPageInfo.getNextPage()); System.out.println("总页数:" + userPageInfo.getPages()); System.out.println("当前条数:" + userPageInfo.getPageSize()); System.out.println("总条数:" + userPageInfo.getTotal()); System.out.println("是否第一页:" + userPageInfo.isIsFirstPage()); System.out.println("是否末页:" + userPageInfo.isIsLastPage());
多表操作 黑马程序员最全SSM框架教程|Spring+SpringMVC+MyBatis全覆盖_SSM整合_哔哩哔哩_bilibili
注解开发 使用xml开发crud 1 2 3 4 <mappers > <mapper resource ="mybatis/UserMapper.xml" /> </mappers >
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 <?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.myspring.dao.UserMapper" > <sql id ="selectUser" > select * from user </sql > <select id ="findAll" resultType ="user" > <include refid ="selectUser" /> </select > <select id ="findById" parameterType ="int" resultType ="user" > select * from user where id = #{id} </select > <select id ="findByIds" parameterType ="list" resultType ="user" > <include refid ="selectUser" > </include > <where > -- select * from user where id in(?,?) -- collection写list或array等 <foreach collection ="list" open ="id in(" close =")" item ="id" separator ="," > #{id} </foreach > </where > </select > <select id ="findByCondition" parameterType ="user" resultType ="user" > <include refid ="selectUser" > </include > <where > <if test ="id!=0" > and id=#{id} </if > <if test ="name!=null" > and name=#{name} </if > <if test ="age!=0" > and age=#{age} </if > </where > </select > <insert id ="save" parameterType ="com.myspring.bean.User" > insert into user (name, age) values (#{name}, #{age}) </insert > <update id ="update" parameterType ="com.myspring.bean.User" > update user set age=#{age}, name=#{name} where id = #{id} </update > <delete id ="delete" parameterType ="int" > delete from user where id = #{id} </delete > </mapper >
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 public interface UserMapper { List<User> findAll () ; User findById (int id) ; List<User> findByCondition (User user) ; List<User> findByIds (List<Integer> ids) ; void save (User user) ; void update (User user) ; void delete (int id) ; }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 public class UserMapperTest { private UserMapper userMapper; @Before public void before () throws IOException { InputStream resourceAsStream = Resources.getResourceAsStream("myBatis/sqlMapConfig.xml" ); SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream); SqlSession sqlSession = sqlSessionFactory.openSession(true ); userMapper = sqlSession.getMapper(UserMapper.class); } @Test public void testSave () throws Exception { User user = new User(); user.setName("钱老板" ); user.setAge(90 ); userMapper.save(user); } @Test public void testUpdate () throws Exception { User user = userMapper.findById(3 ); user.setAge(99 ); userMapper.update(user); } @Test public void testDelete () throws Exception { userMapper.delete(4 ); } @Test public void testFindById () throws Exception { User user = userMapper.findById(3 ); System.out.println(user); } }
注解开发CRUD 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 public interface UserMapper { @Select("select * from user") List<User> findAll () ; @Select("select * from user where id = #{id}") User findById (int id) ; @Insert("insert into user (name, age) values (#{name}, #{age})") void save (User user) ; @Update("update user set age=#{age}, name=#{name} where id = #{id}") void update (User user) ; @Update(" delete from user where id = #{id}") void delete (int id) ; }
1 2 3 4 5 <mappers > <package name ="com.myspring.dao" /> </mappers >
调用不变