mybatis原理

一.MyBatis简介

MyBatis就是一个持久层的框架,它让程序员只关注sql本身,而不需要关注连接的创建,statement的创建,MyBatis将输入参数,输出结果进行映射

二.MyBatis的原理(执行流程)

三.MyBatis操作流程 

1.最基本的查询

从上面原理可以看出,首先我们要写配置文件

SqlMapConfig.xml文件

[html]  view plain  copy
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <!DOCTYPE configuration  
  3. PUBLIC "-//mybatis.org//DTD Config 3.0//EN"  
  4. "http://mybatis.org/dtd/mybatis-3-config.dtd">  
  5. <configuration>  
  6.   
  7. <!--引入database配置文件  -->  
  8. <properties resource="db.properties">  
  9. </properties>  
  10.   
  11. <!--配置mybatis的环境,如果和spring结合,则由spring管理  -->  
  12. <environments default="development">  
  13.   <environment id="development">  
  14.   <!-- 事物管理,配置JDBC表示 -->  
  15.     <transactionManager type="JDBC"></transactionManager>  
  16.     <!--配置数据源,采用mybatis连接池,使用POOLED方式  -->  
  17.     <dataSource type="POOLED">  
  18.     <property name="driver" value="${driver}"/>  
  19.     <property name="url" value="${url}"/>  
  20.     <property name="username" value="${username}"/>  
  21.     <property name="password" value="${password}"/>  
  22.     </dataSource>  
  23.   </environment>  
  24. </environments>  
  25. <!-- 映射XMl文件 -->  
  26. <mappers>  
  27. <mapper resource="UserMapper.xml"/>  
  28. <!--如果xml文件是放在某个文件夹下,如果是你跟映射类放在同一个下,而且同名,则用package方法,不是的话,
  29. <mapper resource="com/hpe/mapper/impl/UserMapper.xml"/>这样写-->
  30. </mappers>  
  31. </configuration>  

从上面可以看出,我们引入了database配置文件,也可以不引入,直接在value中写值

db.properties文件如下:

[html]  view plain  copy
  1. driver=com.mysql.jdbc.Driver  
  2. url=jdbc:mysql://localhost:3306/mybatis?useUnicode=true&characterEncoding=utf8  
  3. username=root  
  4. password=123  

pojo类:

[java]  view plain  copy
  1. public class User implements Serializable{  
  2.     private int id;  
  3.     private String username;// 用户姓名  
  4.     private String sex;// 性别  
  5.     private Date birthday;// 生日  
  6.     private String address;// 地址  
  7.       
  8.     //订单信息  
  9.     private List<Orders> orders;  
  10.       
  11.     public List<Orders> getOrders() {  
  12.         return orders;  
  13.     }  
  14.     public void setOrders(List<Orders> orders) {  
  15.         this.orders = orders;  
  16.     }  
  17.     public int getId() {  
  18.         return id;  
  19.     }  
  20.     public void setId(int id) {  
  21.         this.id = id;  
  22.     }  
  23.     public String getUsername() {  
  24.         return username;  
  25.     }  
  26.     public void setUsername(String username) {  
  27.         this.username = username;  
  28.     }  
  29.     public String getSex() {  
  30.         return sex;  
  31.     }  
  32.     public void setSex(String sex) {  
  33.         this.sex = sex;  
  34.     }  
  35.     public Date getBirthday() {  
  36.         return birthday;  
  37.     }  
  38.     public void setBirthday(Date birthday) {  
  39.         this.birthday = birthday;  
  40.     }  
  41.     public String getAddress() {  
  42.         return address;  
  43.     }  
  44.     public void setAddress(String address) {  
  45.         this.address = address;  
  46.     }  
  47.     @Override  
  48.     public String toString() {  
  49.         return "User [id=" + id + ", username=" + username + ", sex=" + sex  
  50.                 + ", birthday=" + birthday + ", address=" + address + "]";  
  51.     }  
  52.       
  53. }  

映射文件:

[html]  view plain  copy
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <!DOCTYPE mapper      
  3. PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"      
  4. "http://mybatis.org/dtd/mybatis-3-mapper.dtd">  
  5. <mapper namespace="test">  
  6. <!--  
  7. select:表示一个MappedStatement对象  
  8. id:Statement的唯一标示  
  9. parameterType:传入参数的java类型,parameterType只能有一个,所以入参只能有一个  
  10. resultType:输出结果所映射的java类型  
  11. #{}:表示一个占位符  
  12. #{id}:里面的参数表示输入的参数名称,如果是基本类型,则参数名称任意,如果是其它类型,则必须写对应的参数名  
  13.   -->  
  14. <select id="findByUserId" parameterType="int" resultType="com.study.mpo.User">  
  15. SELECT * FROM user WHERE id=#{id}  
  16. </select>  
  17. </mapper>  

测试代码:

[java]  view plain  copy
  1. @Test  
  2.     public void test1() throws IOException{  
  3.           
  4.         String resource="SqlMapConfig.xml";  
  5.         //读取配置文件  
  6.         InputStream inputStream = Resources.getResourceAsStream(resource);  
  7.         //建立sqlsessionFactory  
  8.         SqlSessionFactory  sqlSessionFactory= new SqlSessionFactoryBuilder().build(inputStream);  
  9.         //创建session  
  10.         SqlSession session=sqlSessionFactory.openSession();  
  11.         //调用session的增删改查  
  12.         User customer=session.selectOne("test.findByUserId"1);  
  13.         System.out.println(customer.getUsername());  
  14.           
  15.     }  

2.模糊查询或者排序时,使用${}连接符

[html]  view plain  copy
  1. <!--    
  2. 模糊查询  
  3. ${} :表示一个sql的连接符,即参数传递什么,它就会显示什么  
  4. 使用该链接符有sql注入风险,但是有些必须使用该链接符,比如${}  
  5. -->  
  6.  <select id="findLikeByUser" parameterType="java.lang.String" resultType="com.study.mpo.User">  
  7. SELECT * FROM USER WHERE username LIKE '%${value}%'  
  8. </select>  

测试代码:

[java]  view plain  copy
  1. @Test  
  2. public void test2() throws IOException{  
  3.       
  4.     String resource="SqlMapConfig.xml";  
  5.     //读取配置文件  
  6.     InputStream inputStream = Resources.getResourceAsStream(resource);  
  7.     //建立sqlsessionFactory  
  8.     SqlSessionFactory  sqlSessionFactory= new SqlSessionFactoryBuilder().build(inputStream);  
  9.     //创建session  
  10.     SqlSession session=sqlSessionFactory.openSession();  
  11.     //调用session的增删改查  
  12.     List<User> customerList=session.selectList("test.findLikeByUser""小");  
  13.     session.close();  
  14.     System.out.println(customerList.toString());  
  15.       
  16. }  

3.添加用户

[html]  view plain  copy
  1. <!-- 添加用户  
  2. value的值根据ONGL表达式来查询  
  3. -->  
  4.     <insert id="insertUser" parameterType="com.study.mpo.User">  
  5.         INSERT INTO USER  
  6.         (username,birthday,sex,address)  
  7.         VALUES(#{username},#{birthday},#{sex},#{address})  
  8.     </insert>  
测试代码:

[java]  view plain  copy
  1. @Test  
  2.     public void insertUserTest() throws Exception{  
  3.         //读取配置文件  
  4.         //全局配置文件的路径  
  5.         String resource = "SqlMapConfig.xml";  
  6.         InputStream inputStream = Resources.getResourceAsStream(resource);  
  7.           
  8.         //创建SqlSessionFactory  
  9.         SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);  
  10.           
  11.         //创建SqlSession  
  12.         SqlSession sqlSession = sqlSessionFactory.openSession();  
  13.           
  14.         User user = new User();  
  15.         user.setUsername("xsa");  
  16.         user.setAddress("xsaxasx");  
  17.           
  18.         //调用SqlSession的增删改查方法  
  19.         //第一个参数:表示statement的唯一标示  
  20.         sqlSession.insert("test.insertUser", user);  
  21.           
  22.         System.out.println(user.getId());  
  23.         //提交事务  
  24.         sqlSession.commit();  
  25.         //关闭资源  
  26.         sqlSession.close();  
  27.     }  

项目中有时候再插入数据的时候,要得到它的id,怎么实现了

3.1自增主键返回ID

[html]  view plain  copy
  1. <!-- 添加用户 -->  
  2.     <!-- selectKey:查询主键,在标签内需要输入查询主键的sql -->  
  3.     <!-- order:指定查询主键的sql和insert语句的执行顺序,相当于insert语句来说 -->  
  4.     <!-- LAST_INSERT_ID:该函数是mysql的函数,获取自增主键的ID,它必须配合insert语句一起使用 -->  
  5.     <insert id="insertUser" parameterType="com.study.mpo.User">  
  6.         <selectKey keyProperty="id" resultType="int" order="AFTER">  
  7.             SELECT LAST_INSERT_ID()   
  8.         </selectKey>  
  9.       
  10.         INSERT INTO USER  
  11.         (username,birthday,sex,address)  
  12.         VALUES(#{username},#{birthday},#{sex},#{address})  
  13.     </insert>  

3.2自增主键之UUID

[html]  view plain  copy
  1. <insert id="insertUser2" parameterType="com.study.mpo.User">  
  2.         <selectKey keyProperty="id" resultType="string" order="BEFORE">  
  3.             SELECT UUID()   
  4.         </selectKey>  
  5.       
  6.         INSERT INTO USER  
  7.         (id,username,birthday,sex,address)  
  8.         VALUES(#{id},#{username},#{birthday},#{sex},#{address})  
  9.     </insert>  

四.mapper代理开发

前面我们所看到的都是dao的开发方式,MyBatis提供了Mapper代理的开发方式

使用Mapper代理的开发规范:

1、  mapper接口的全限定名要和mapper映射文件的namespace值一致。

2、  mapper接口的方法名称要和mapper映射文件的statement的id一致。

3、  mapper接口的方法参数类型要和mapper映射文件的statement的parameterType的值一致,而且它的参数是一个。

4、  mapper接口的方法返回值类型要和mapper映射文件的statement的resultType的值一致。


mapper接口:

[java]  view plain  copy
  1. public interface UserMapper {  
  2.     // 1、 根据用户ID查询用户信息  
  3.     public User findUserById(int id) throws Exception;  
  4. }  

mapper映射文件


[html]  view plain  copy
  1. <span style="color:#000000;"><?xml version="1.0" encoding="UTF-8" ?>  
  2. <!DOCTYPE mapper      
  3. PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"      
  4. "http://mybatis.org/dtd/mybatis-3-mapper.dtd">  
  5. <!--namespace必须和mapper接口的全限定名一致-->  
  6.  <mapper namespace="com.study.mybatis.mapper.UserMapper">  
  7.     <!-- 根据用户ID查询用户信息 -->  
  8.     <select id="findUserById" parameterType="int" resultType="User">  
  9.         SELECT  
  10.         * FROM USER WHERE id =#{id}  
  11.     </select>  
  12. </mapper></span>  
测试:

[java]  view plain  copy
  1. <span style="color:#000000;">// 创建UserMapper对象  
  2.         SqlSession sqlSession = sqlSessionFactory.openSession();  
  3.   
  4.         // 由mybatis通过sqlsession来创建代理对象  
  5.         UserMapper mapper = sqlSession.getMapper(UserMapper.class);  
  6.   
  7.         User user = mapper.findUserById(1);  
  8.   
  9.         System.out.println(user);  
  10.   
  11.         sqlSession.close();</span>  
  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值