SSM框架学习之MyBatis浅谈

JDBC流程:

  • 加载驱动
  • 获取链接
  • 获取操作对象
  • 操作数据库
  • 返回结果

JDBCDemo(以MySql为例):

 1       //加载驱动
 2         Class.forName("com.mysql.jdbc.Driver");
 3         String url = "jdbc:mysql://127.0.0.1:3306/mysql";//jdbc:mysql://localhost:3306/+数据库名称
 4         String userName = "root";//数据库账号
 5         String passWord = "root";//数据库密码
 6         //获取链接
 7         Connection connection = DriverManager.getConnection(url, userName, passWord);
 8         //获取操作对象
 9         Statement statement = connection.createStatement();
10         //操作数据库
11         String querySql = "SELECT * FROM USER";//查询语句
12         String addSql = "INSERT INTO USER VALUES ('001','zhangsan','001');";//增加语句
13         String deleteSql = "DELETE FROM USER WHERE id = '001';";//删除语句
14         String updateSql = "UPDATE USER SET userName = 'lisi' WHERE id = '001';";//更新语句
15         //返回结果
16         ResultSet resultSet = statement.executeQuery(querySql);
17         int addFlag = statement.executeUpdate(addSql);//返回操作行数
18         int deleteFlag = statement.executeUpdate(deleteSql);//返回操作行数
19         int updateFlag = statement.executeUpdate(updateSql);//返回操作行数

Mybatis介绍:

百度:

MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBatis 。2013年11月迁移到Github。

MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解来配置和映射原生信息,将接口和 Java 的 POJOs(Plain Ordinary Java Object,普通的 Java对象)映射成数据库中的记录。

项目Demo:

 数据库准备:新建库:mybatis,然后建表:user,插入几行数据。

CREATE TABLE USER (
userId varchar(100),
userName varchar(100),
phoneNum varchar(100),
passWorld varchar(100)
);
 INSERT INTO USER VALUES ('001','张三','13888888888','123');
 INSERT INTO USER VALUES ('002','李四','13888888888','456');
 INSERT INTO USER VALUES ('003','王五','13888888888','789');

 Pom.xml:

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 
 3 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 4   xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
 5   <modelVersion>4.0.0</modelVersion>
 6 
 7   <groupId>com.demo.ibatis</groupId>
 8   <artifactId>ibatis</artifactId>
 9   <version>1.0-SNAPSHOT</version>
10   <packaging>war</packaging>
11 
12   <name>ibatis Maven Webapp</name>
13   <!-- FIXME change it to the project's website -->
14   <url>http://www.example.com</url>
15 
16   <properties>
17     <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
18     <maven.compiler.source>1.8</maven.compiler.source>
19     <maven.compiler.target>1.8</maven.compiler.target>
20   </properties>
21 
22   <dependencies>
23     <dependency>
24       <groupId>junit</groupId>
25       <artifactId>junit</artifactId>
26       <version>4.11</version>
27       <scope>test</scope>
28     </dependency>
29     <dependency>
30       <groupId>org.springframework</groupId>
31       <artifactId>spring-webmvc</artifactId>
32       <version>5.1.7.RELEASE</version>
33     </dependency>
34     <dependency>
35       <groupId>org.slf4j</groupId>
36       <artifactId>slf4j-log4j12</artifactId>
37       <version>1.7.12</version>
38     </dependency>
39     <dependency>
40       <groupId>jstl</groupId>
41       <artifactId>jstl</artifactId>
42       <version>1.2</version>
43     </dependency>
44     <dependency>
45       <groupId>javax.servlet</groupId>
46       <artifactId>servlet-api</artifactId>
47       <version>2.5</version>
48     </dependency>
49     <!-- MySql -->
50     <dependency>
51       <groupId>mysql</groupId>
52       <artifactId>mysql-connector-java</artifactId>
53       <version>8.0.16</version>
54     </dependency>
55     <dependency>
56       <groupId>org.mybatis</groupId>
57       <artifactId>mybatis</artifactId>
58       <version>3.5.1</version>
59     </dependency>
60   </dependencies>
61 
62   <build>
63     <finalName>ibatis</finalName>
64     <pluginManagement><!-- lock down plugins versions to avoid using Maven defaults (may be moved to parent pom) -->
65       <plugins>
66         <plugin>
67           <artifactId>maven-clean-plugin</artifactId>
68           <version>3.1.0</version>
69         </plugin>
70         <!-- see http://maven.apache.org/ref/current/maven-core/default-bindings.html#Plugin_bindings_for_war_packaging -->
71         <plugin>
72           <artifactId>maven-resources-plugin</artifactId>
73           <version>3.0.2</version>
74         </plugin>
75         <plugin>
76           <artifactId>maven-compiler-plugin</artifactId>
77           <version>3.8.0</version>
78         </plugin>
79         <plugin>
80           <artifactId>maven-surefire-plugin</artifactId>
81           <version>2.22.1</version>
82         </plugin>
83         <plugin>
84           <artifactId>maven-war-plugin</artifactId>
85           <version>3.2.2</version>
86         </plugin>
87         <plugin>
88           <artifactId>maven-install-plugin</artifactId>
89           <version>2.5.2</version>
90         </plugin>
91         <plugin>
92           <artifactId>maven-deploy-plugin</artifactId>
93           <version>2.8.2</version>
94         </plugin>
95       </plugins>
96     </pluginManagement>
97   </build>
98 </project>
Pom.xml文件

Web.xml:不用动,使用创建项目时默认的即可。

下面四个文件放在项目的“Resources”目录下。

jdbc.properties(数据库信息):

1 driver=com.mysql.jdbc.Driver
2 url=jdbc:mysql://localhost:3306/mybatis?useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC
3 username=root
4 password=root
JDBC

log4j.properties(日志信息):

 1 ### direct log messages to stdout ###
 2 log4j.appender.stdout=org.apache.log4j.ConsoleAppender
 3 log4j.appender.stdout.Target=System.out
 4 log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
 5 log4j.appender.stdout.layout.ConversionPattern=%-d{yyyy-MM-dd HH:mm:ss,SSS} [%t] [%c]-[%p] %m%n
 6 
 7 ### direct messages to file mylog.log ###
 8 log4j.appender.file=org.apache.log4j.FileAppender
 9 log4j.appender.file.File=e:/mylog.log
10 log4j.appender.file.layout=org.apache.log4j.PatternLayout
11 log4j.appender.file.layout.ConversionPattern=%-d{yyyy-MM-dd HH:mm:ss,SSS} [%t] [%c]-[%p] %m%n
12 
13 ### set log levels - for more verbose logging change 'info' to 'debug' ###
14 
15 log4j.rootLogger=debug, stdout,file
log

mybatis-config.xml(mybatis配置文件★★★):

 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     <!--获取JDBC的相关信息-->
 7     <properties resource="jdbc.properties"></properties>
 8     <!-- 配置环境:可以配置多个环境,default:配置某一个环境的唯一标识,表示默认使用哪个环境 -->
 9     <environments default="development">
10         <!-- 配置环境,id:环境的唯一标识 -->
11         <environment id="development">
12             <!-- 事务管理器,type:使用jdbc的事务管理器 -->
13             <transactionManager type="JDBC"/>
14             <!-- 数据源,type:数据源类型,池类型的数据源 -->
15             <dataSource type="POOLED">
16                 <!-- 配置连接信息 -->
17                 <property name="driver" value="${driver}" />
18                 <property name="url" value="${url}" />
19                 <property name="username" value="${username}" />
20                 <property name="password" value="${password}" />
21             </dataSource>
22         </environment>
23     </environments>
24     <!-- 配置映射文件:用来配置sql语句和结果集类型等 -->
25     <mappers>
26         <mapper resource="UserMapper.xml"/>
27     </mappers>
28 </configuration>
Mybaits-config

UserMapper.xml(代码操作数据库的映射文件):

 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 <!--
 6     mapper标签:配置各类声明
 7     namespace:名称空间,由于映射文件有多个,为了防止crud语句的唯一标识被重复,可以设置空间名称。
 8  -->
 9 <mapper namespace="com.demo.mapper.UserMapper">
10     <!--
11     select:查询的statement(声明),用来编写查询语句
12     id:语句的唯一标识
13     resultType:配置返回的结果集类型
14     parameterType:传递的参数类型,可以省略
15     -->
16     <select id="queryUserById" resultType="com.demo.bean.User">
17         select * from user where userId = #{id} ;
18     </select>
19     <select id="queryUserList" resultType="com.demo.bean.User">
20         select * from user ;
21     </select>
22     <!--
23           insert:插入的statement,编写插入语句
24           id:插入语句的唯一标识
25           parameterType:插入语句的参数,可以省略
26        -->
27     <insert id="insertUser" parameterType="com.demo.bean.User">
28     insert into user VALUES (
29     #{userId},
30     #{userName},
31     #{phoneNum},
32     #{passWorld}
33     );
34 </insert>
35     <!-- 
36     update:更新的statement,用来编写更新语句
37     id:语句的唯一标识
38     parameterType:语句的参数,可以省略
39  -->
40     <update id="updateUser">
41     update user set userName =   #{userName} where userId = #{userId};
42     </update>
43     <!--
44     delete:删除的statement,用来编写删除语句
45     id:语句的唯一标识
46     parameterType:语句的参数,可以省略
47  -->
48     <delete id="deleteUserById">
49         delete from user where userId = #{id};
50     </delete>
51 
52 </mapper>
UserMapper

User:

 1 public class User {
 2     private String userId;
 3     private String userName;
 4     private String phoneNum;
 5     private String passWorld;
 6 
 7     public User() {
 8     }
 9 
10     public User(String userId, String userName, String phoneNum, String passWorld) {
11         this.userId = userId;
12         this.userName = userName;
13         this.phoneNum = phoneNum;
14         this.passWorld = passWorld;
15     }
16 
17     public void setUserId(String userId) {
18         this.userId = userId;
19     }
20 
21     public void setUserName(String userName) {
22         this.userName = userName;
23     }
24 
25     public void setPhoneNum(String phoneNum) {
26         this.phoneNum = phoneNum;
27     }
28 
29     public void setPassWorld(String passWorld) {
30         this.passWorld = passWorld;
31     }
32 
33     public String getUserId() {
34         return userId;
35     }
36 
37     public String getUserName() {
38         return userName;
39     }
40 
41     public String getPhoneNum() {
42         return phoneNum;
43     }
44 
45     public String getPassWorld() {
46         return passWorld;
47     }
48 
49     @Override
50     public String toString() {
51         return "User{" +
52                 "userId='" + userId + '\'' +
53                 ", userName='" + userName + '\'' +
54                 ", phoneNum='" + phoneNum + '\'' +
55                 ", passWorld='" + passWorld + '\'' +
56                 '}';
57     }
58 }
Bean

UserMapper(上面的时配置文件,这个时代码文件):

 1 public interface UserMapper {
 2     /**
 3      * 通过id查询user对象
 4      * @param id
 5      * @return
 6      */
 7     User queryUserById(String id);
 8     /**
 9      * 查询所有用户
10      * @return
11      */
12     List<User> queryUserList();
13 
14     /**
15      * 插入用户
16      * @param user
17      */
18     void insertUser(User user);
19 
20     /**
21      * 更新用户
22      * @param user
23      */
24     void updateUser(User user);
25     /**
26      * 通过id删除用户
27      * @param id
28      */
29     void deleteUserById(String id);
30 
31 }
UserMapper

测试:

 1 public class MyController {
 2     public static void main(String[] args) throws IOException {
 3         //获取全局配置文件的输入流
 4         InputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml");
 5         //加载全局配置文件获取sqlSessionFactory
 6         SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
 7         //获取sqlSession,参数:true,自动开启事务
 8         SqlSession sqlSession = sqlSessionFactory.openSession(true);
 9         UserMapper mapper = sqlSession.getMapper(UserMapper.class);
10         //单个查询
11         User user1 = mapper.queryUserById("001");
12         System.out.println(user1);
13         //多个查询
14         List<User> users = mapper.queryUserList();
15         for (User user2 : users) {
16             System.out.println(user2);
17         }
18         User user3 = new User();
19         user3.setUserId("004");
20         user3.setUserName("赵六");
21         user3.setPhoneNum("13888888888");
22         user3.setPassWorld("000");
23         //增加
24         mapper.insertUser(user3);
25         //修改(把张三改为吴彦祖)
26         User user4 = new User("001","吴彦祖","13888888888","123");
27         mapper.updateUser(user4);
28         //删除
29         mapper.deleteUserById("002");
30     }
31 }
Controller

结果:

配置文件:

配置步骤:

1、 配置全局配置文件

设置环境(事务、数据源)

管理映射文件XxxMapper.xml

2、 配置映射文件

Mapper标签:用来配置不同的statement

Namespace属性:用来配置名称空间,来区分不同的映射文件中的statement

编写crud的statement:select 、update 、insert 、delete

         Select:专门用于查询的statement,可以编写查询语句

         Id属性:该statement的唯一标识,一般用来被引用

         resultType:结果集类型

         paramterType:参数类型,可以省略,一般都省略

使用步骤:

1、获取全局配置文件的数据流,加载全局配置文件

2、通过全局配置文件的输入流创建SqlSessionFactory

3、通过SqlSessionFactory获取SqlSession

4、通过SqlSession操作crud

5、关闭SqlSession,释放资源。

补充:

#{}:

1、 是预编译

2、 编译成占位符

3、 可以防止sql注入

4、 自动判断数据类型

5、 一个参数时,可以使用任意参数名称进行接收

${}:

1、 非预编译

2、 sql的直接拼接

3、 不能防止sql注入

4、 需要判断数据类型,如果是字符串,需要手动添加引号。

5、 一个参数时,参数名称必须是value,才能接收参数。

ResultMap:

ResultMap是mybatis中最重要最强大的元素,使用ResultMap可以解决两大问题:

  • POJO属性名和表结构字段名不一致的问题(有些情况下也不是标准的驼峰格式,比如id和userId)
  • 完成高级查询,比如说,一对一、一对多、多对多。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值