Java EE学习笔记(六)

时间:2022-09-28 21:03:09

初识MyBatis

1、MyBatis的定义

1)、MyBatis(前身是iBatis)是一个支持普通SQL查询、存储过程以及高级映射的持久层框架。 

2)、MyBatis框架也被称之为ORM(Object/Relation Mapping,即对象关系映射框架。所谓的ORM就是一种为了解决面向对象与关系型数据库中数据类型不匹配的技术,它通过描述Java对象与数据库表之间的映射关系,自动将Java应用程序中的对象持久化到关系型数据库的表中。

3)、ORM框架的工作原理:

Java EE学习笔记(六)

4)、Hibernate与MyBatis的区别:

Java EE学习笔记(六)

2、MyBatis的工作原理

Java EE学习笔记(六)

3、MyBatis入门程序

1)、查询客户:在实际开发中,查询操作通常都会涉及到单条数据的精确查询,以及多条数据的模糊查询

2)、根据客户编号查询客户信息;根据客户名模糊查询客户信息。

a)、创建mybatis数据库,并且插入3条数据:

Java EE学习笔记(六)

Java EE学习笔记(六)

b)、由于MyBatis默认使用log4j输出日志信息,所以如果要查看控制台的输出SQL语句,那么就需要在classpath路径下配置其日志文件。在项目的src目录下创建log4j.properties文件。

# Global logging configuration,全局的日志配置,Mybatis的日志配置和控制台输出,其中Mybatis的日志配置用于将com.itheima包下所有类的日志记录级别设置为DEBUG
log4j.rootLogger=ERROR, stdout


# MyBatis logging configuration...
log4j.logger.com.itheima=DEBUG


# Console output...
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n

c)、src->com.itheima.po

①客户持久化类:Customer.java(属性字段与数据库中的表字段相对应)

 1 package com.itheima.po;
 2 /**
 3  * 客户持久化类
 4  */
 5 public class Customer { // 一个POJO(普通java对象)
 6     
 7     private Integer id;       // 主键id
 8     private String username; // 客户名称
 9     private String jobs;      // 职业
10     private String phone;     // 电话
11     
12     public Integer getId() {
13         return id;
14     }
15     
16     public void setId(Integer id) {
17         this.id = id;
18     }
19     
20     public String getUsername() {
21         return username;
22     }
23     
24     public void setUsername(String username) {
25         this.username = username;
26     }
27     
28     public String getJobs() {
29         return jobs;
30     }
31     
32     public void setJobs(String jobs) {
33         this.jobs = jobs;
34     }
35     
36     public String getPhone() {
37         return phone;
38     }
39     
40     public void setPhone(String phone) {
41         this.phone = phone;
42     }
43     
44     @Override
45     public String toString() {
46         return "Customer [id=" + id + ", username=" + username + ", jobs=" + jobs + ", phone=" + phone + "]";
47     }
48 }

d)、src->com.itheima.mapper

①映射文件:CustomerMapper.xml

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
 3                  "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 4 <!-- 以上是Mybatis映射文件的约束信息 -->                 
 5    
 6 <!-- <mapper>是根元素,包括一个属性namespace表示命名空间,通常会设置成“包名+SQL映射文件名”的形式 -->
 7 <mapper namespace="com.itheima.mapper.CustomerMapper">
 8 
 9     <!--子元素<select>中的信息是用于执行查询操作的配置,根据客户编号获取客户信息 -->
10     <select id="findCustomerById" parameterType="Integer" resultType="com.itheima.po.Customer">
11         <!-- 其id属性是<select>元素在映射文件中的唯一标识
12             属性parameterType:用于指定传入参数的类型
13             属性resultType:用于指定返回结果的类型,这里表示返回的数据是Customer对象类型
14             "#{}"用于表示一个占位符,相当于"?",而"#{id}"表示该占位符待接收参数的名称为id
15          -->
16         select * from t_customer where id = #{id}
17     </select>
18     
19     <!--根据客户名模糊查询客户信息列表-->
20     <select id="findCustomerByName" parameterType="String" resultType="com.itheima.po.Customer">
21         <!-- select * from t_customer where username like '%${value}%' -->
22         <!-- "${}"用来表示拼接SQL的字符串,即不加解释的原样输出,
23             "${value}"表示要拼接的是简单类型参数
24             注意:使用"${}"无法防止SQL注入问题,但可以做如下修改:使用concat()函数进行字符串拼接,这点需要注意
25          -->
26         select * from t_customer where username like concat('%',#{value},'%')
27     </select>
28     
29     <!-- 添加客户信息,<insert>元素来实现 -->
30     <insert id="addCustomer" parameterType="com.itheima.po.Customer">
31         insert into t_customer(username,jobs,phone) 
32         values(#{username},#{jobs},#{phone})
33     </insert>
34     
35     <!-- 更新客户信息,<update>元素来实现 -->
36     <update id="updateCustomer" parameterType="com.itheima.po.Customer">
37         update t_customer set
38         username=#{username},jobs=#{jobs},phone=#{phone}
39         where id=#{id}
40     </update>
41     
42     <!-- 删除客户信息,<delete>元素来实现 -->
43     <delete id="deleteCustomer" parameterType="Integer">
44         delete from t_customer where id=#{id}
45     </delete>
46 </mapper>

e)、src->mybatis-config.xml

 1 <?xml version="1.0" encoding="UTF-8" ?>
 2 <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
 3                         "http://mybatis.org/dtd/mybatis-3-config.dtd">
 4     <!-- 以上是Mybatis映射文件的约束信息 -->  
 5     
 6     <!-- 以下是开发人员需要配置的信息,都放在<configuration>元素中进行配置 -->
 7     
 8 <configuration>
 9     
10     <!--1、配置环境 ,默认的环境id为mysql-->
11     <environments default="mysql">
12     
13         <!--1.2、配置id为mysql的数据库环境 -->
14         <environment id="mysql">
15         
16             <!-- 使用JDBC的事务管理 -->
17             <transactionManager type="JDBC" />
18             
19             <!--数据库连接池 -->
20             <dataSource type="POOLED">
21             
22               <property name="driver" value="com.mysql.jdbc.Driver" />
23               <property name="url" value="jdbc:mysql://localhost:3306/mybatis" />
24               <property name="username" value="root" />
25               <property name="password" value="******" />
26               
27             </dataSource>
28         </environment>
29     </environments>
30     
31     <!--2、配置Mapper的位置 -->
32     <mappers>
33         <mapper resource="com/itheima/mapper/CustomerMapper.xml" />
34     </mappers>
35     
36 </configuration>

f)、src->com.itheima.test

①测试类:MybatisTest.java

  1 package com.itheima.test;
  2 import java.io.InputStream;
  3 import java.util.List;
  4 import org.apache.ibatis.io.Resources;
  5 import org.apache.ibatis.session.SqlSession;
  6 import org.apache.ibatis.session.SqlSessionFactory;
  7 import org.apache.ibatis.session.SqlSessionFactoryBuilder;
  8 import org.junit.Test;
  9 import com.itheima.po.Customer;
 10 /**
 11  * 入门程序测试类
 12  */
 13 public class MybatisTest {
 14     /**
 15      * 根据客户编号查询客户信息
 16      */
 17     @Test
 18     public void findCustomerByIdTest() throws Exception {
 19         
 20         // 1、通过输入流读取配置文件
 21         String resource = "mybatis-config.xml";
 22         InputStream inputStream = Resources.getResourceAsStream(resource); 
 23         
 24         // 2、根据配置文件构建SqlSessionFactory工厂
 25         SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
 26         
 27         // 3、通过SqlSessionFactory工厂创建SqlSession对象
 28         SqlSession sqlSession = sqlSessionFactory.openSession();
 29         
 30         // 4、SqlSession执行映射文件中定义的SQL,并返回映射结果(执行查询操作)
 31         // 参数1:表示映射SQL的标识字符串,它由CustomerMapper.xml中<mapper>元素的namespace属性值+<select>元素的id属性值组成
 32         // 参数2:表示查询所需要的参数
 33         Customer customer = sqlSession.selectOne("com.itheima.mapper.CustomerMapper.findCustomerById", 1);
 34         
 35         // 5、打印输出结果
 36         System.out.println(customer.toString());
 37         
 38         // 6、关闭SqlSession
 39         sqlSession.close();
 40     }
 41     
 42     
 43     /**
 44      * 根据用户名称来模糊查询用户信息列表
 45      */
 46     @Test
 47     public void findCustomerByNameTest() throws Exception{    
 48         
 49         // 1、通过输入流读取配置文件
 50         String resource = "mybatis-config.xml";
 51         InputStream inputStream = Resources.getResourceAsStream(resource);
 52         
 53         // 2、根据配置文件构建SqlSessionFactory工厂
 54         SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
 55        
 56         // 3、通过SqlSessionFactory创建SqlSession对象
 57         SqlSession sqlSession = sqlSessionFactory.openSession();
 58         
 59         // 4、SqlSession执行映射文件中定义的SQL,并返回映射结果(返回集合对象,查询的结果为多条语句)
 60         List<Customer> customers = sqlSession.selectList("com.itheima.mapper.CustomerMapper.findCustomerByName", "j");
 61         
 62         for (Customer customer : customers) {
 63             //打印输出结果集
 64             System.out.println(customer);
 65         }
 66         // 5、关闭SqlSession
 67         sqlSession.close();
 68     }
 69     
 70     
 71     /**
 72      * 添加客户
 73      */
 74     @Test
 75     public void addCustomerTest() throws Exception{        
 76         
 77         // 1、读取配置文件
 78         String resource = "mybatis-config.xml";
 79         InputStream inputStream = Resources.getResourceAsStream(resource);
 80         
 81         // 2、根据配置文件构建SqlSessionFactory工厂
 82         SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
 83         
 84         // 3、通过SqlSessionFactory创建SqlSession对象
 85         SqlSession sqlSession = sqlSessionFactory.openSession();
 86         
 87         // 4、SqlSession执行添加操作
 88         // 4.1先创建Customer对象,并向对象中添加数据
 89         Customer customer = new Customer();
 90         customer.setUsername("rose");
 91         customer.setJobs("student");
 92         customer.setPhone("13333533092");
 93         
 94         // 4.2执行SqlSession的插入方法,返回的是SQL语句影响的行数
 95         int rows = sqlSession.insert("com.itheima.mapper.CustomerMapper.addCustomer", customer);
 96         
 97         // 4.3通过返回结果判断插入操作是否执行成功
 98         if(rows > 0){
 99             System.out.println("您成功插入了"+rows+"条数据!");
100         }else{
101             System.out.println("执行插入操作失败!!!");
102         }
103         
104         // 4.4提交事务
105         sqlSession.commit();
106         
107         // 5、关闭SqlSession
108         sqlSession.close();
109     }
110 
111     /**
112      * 更新客户
113      */
114     @Test
115     public void updateCustomerTest() throws Exception{        
116         
117         // 1、读取配置文件
118         String resource = "mybatis-config.xml";
119         InputStream inputStream = Resources.getResourceAsStream(resource);
120         
121         // 2、根据配置文件构建SqlSessionFactory工厂
122         SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
123         
124         // 3、通过SqlSessionFactory创建SqlSession对象
125         SqlSession sqlSession = sqlSessionFactory.openSession();
126         
127         // 4、SqlSession执行更新操作
128         // 4.1创建Customer对象,对对象中的数据进行模拟更新
129         Customer customer = new Customer();
130         customer.setId(1);
131         customer.setUsername("rose");
132         customer.setJobs("programmer");
133         customer.setPhone("13311111111");
134         
135         // 4.2执行SqlSession的更新方法,返回的是SQL语句影响的行数
136         int rows = sqlSession.update("com.itheima.mapper.CustomerMapper.updateCustomer", customer);
137         
138         // 4.3通过返回结果判断更新操作是否执行成功
139         if(rows > 0){
140             System.out.println("您成功修改了"+rows+"条数据!");
141         }else{
142             System.out.println("执行修改操作失败!!!");
143         }
144         
145         // 4.4、提交事务
146         sqlSession.commit();
147         
148         // 5、关闭SqlSession
149         sqlSession.close();
150     }
151 
152     /**
153      * 删除客户
154      */
155     @Test
156     public void deleteCustomerTest() throws Exception{        
157         
158         // 1、读取配置文件
159         String resource = "mybatis-config.xml";
160         InputStream inputStream = Resources.getResourceAsStream(resource);
161        
162         // 2、根据配置文件构建SqlSessionFactory工厂
163         SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
164         
165         // 3、通过SqlSessionFactory创建SqlSession对象
166         SqlSession sqlSession = sqlSessionFactory.openSession();
167         
168         // 4、SqlSession执行删除操作
169         // 4.1执行SqlSession的删除方法,返回的是SQL语句影响的行数
170         int rows = sqlSession.delete("com.itheima.mapper.CustomerMapper.deleteCustomer", 5);
171         
172         // 4.2通过返回结果判断删除操作是否执行成功
173         if(rows > 0){
174             System.out.println("您成功删除了"+rows+"条数据!");
175         }else{
176             System.out.println("执行删除操作失败!!!");
177         }
178         
179         // 4.3、提交事务,表示已经完成了对数据库的操作
180         sqlSession.commit();
181         
182         // 5、关闭SqlSession(会话对象)
183         sqlSession.close();
184     }
185 
186 }

②运行结果:

根据客户编号查询用户id为1的信息:

Java EE学习笔记(六)

根据客户名模糊查询客户表中客户名称带有"j"的两条信息。

Java EE学习笔记(六)

添加一条客户(id为4)信息:

Java EE学习笔记(六)

Java EE学习笔记(六)

更新用户id为4的信息:

Java EE学习笔记(六)

Java EE学习笔记(六)

删除用户id为4的一条记录:

Java EE学习笔记(六)

Java EE学习笔记(六)

个人总结:

Mybatis操作大致可以分为以下几个步骤:

1)、用输入流读取配置(mybatis-config)文件;

2)、通过配置文件创建SqlSessionFactory会话工厂;

3)、通过SqlSessionFactory创建SqlSession会话对象;

a)、可以创建用户实现类(作为sql方法的参数)对用户数据的“增改”操作,然后通过创建出来的SqlSession对象去执行sql方法。

4)、使用SqlSession对象(mybatis底层通过Executor接口,其会根据SqlSession传递的参数动态生成执行的SQL语句,同时负责查询缓存的维护)操作数据库。

5)、关闭SqlSession会话对象。