mybatis的学习和使用(2)

本文章中后续所用到的版本是mybatis-3-mybatis-3.4.2,为了方便查看代码和定位,在我的github中将版本修改为3.4.2.1,

1     <groupId>org.mybatis</groupId>
2     <artifactId>mybatis</artifactId>
3     <version>3.4.2.1</version>
4     <packaging>jar</packaging>

其他工程中引用如下:

 1 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 2     xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
 3     <modelVersion>4.0.0</modelVersion>
 4 
 5     <groupId>com.wang</groupId>
 6     <artifactId>MyBatis</artifactId>
 7     <version>0.0.1</version>
 8     <packaging>jar</packaging>
 9 
10     <name>MyBatis</name>
11     <url>http://maven.apache.org</url>
12 
13     <properties>
14         <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
15     </properties>
16 
17     <dependencies>
18         <dependency>
19             <groupId>junit</groupId>
20             <artifactId>junit</artifactId>
21             <version>3.8.1</version>
22             <scope>test</scope>
23         </dependency>
24         <!-- https://mvnrepository.com/artifact/org.mybatis/mybatis -->
25         <dependency>
26             <groupId>org.mybatis</groupId>
27             <artifactId>mybatis</artifactId>
28             <version>3.4.2.1</version>
29         </dependency>
30         <!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
31         <dependency>
32             <groupId>mysql</groupId>
33             <artifactId>mysql-connector-java</artifactId>
34             <version>6.0.5</version>
35         </dependency>
36 
37         <!-- https://mvnrepository.com/artifact/log4j/log4j -->
38         <dependency>
39             <groupId>log4j</groupId>
40             <artifactId>log4j</artifactId>
41             <version>1.2.17</version>
42         </dependency>
43 
44     </dependencies>
45 
46     <build>
47         <plugins>
48             <plugin>
49                 <groupId>org.apache.maven.plugins</groupId>
50                 <artifactId>maven-compiler-plugin</artifactId>
51                 <configuration>
52                     <source>1.7</source>
53                     <target>1.7</target>
54                     <encoding>UTF-8</encoding>
55                 </configuration>
56             </plugin>
57         </plugins>
58     </build>
59 </project>

 

1         <dependency>
2             <groupId>org.mybatis</groupId>
3             <artifactId>mybatis</artifactId>
4             <version>3.4.2.1</version>
5         </dependency>

 中指定了用工程生成的jar文件。

 

 

第一个工程名称是ExampleMyBatisHelloWorld,代码 https://github.com/wangjiuong/MybatisDemo/tree/master/ExampleMyBatisHelloWorld

mysql建表语句如下:

1 DROP TABLE IF EXISTS `t_user`;
2 CREATE TABLE `t_user` (
3   `id` int(11) NOT NULL AUTO_INCREMENT,
4   `username` varchar(255) DEFAULT NULL,
5   `password` varchar(255) DEFAULT NULL,
6   `account` double DEFAULT NULL,
7   `regTime` varchar(255) DEFAULT NULL,
8   PRIMARY KEY (`id`)
9 ) ENGINE=InnoDB AUTO_INCREMENT=9191 DEFAULT CHARSET=utf8;

 

表对应的BEAN如下:

 1 package com.wang.MyBatis.model;
 2 
 3 import java.io.Serializable;
 4 
 5 public class UserBean implements Serializable{
 6 
 7     private static final long serialVersionUID = 1L;
 8     private Integer id;
 9     private String username;
10     private String password;
11     private Double account;
12     
13     public UserBean() {
14         super();
15     }
16     
17     public UserBean(String username, String password, Double account) {
18         super();
19         this.username = username;
20         this.password = password;
21         this.account = account;
22     }
23 
24     public UserBean(Integer id, String username, String password, Double account) {
25         super();
26         this.id = id;
27         this.username = username;
28         this.password = password;
29         this.account = account;
30     }
31 
32     public Integer getId() {
33         return id;
34     }
35 
36     public void setId(Integer id) {
37         this.id = id;
38     }
39 
40     public String getUsername() {
41         return username;
42     }
43 
44     public void setUsername(String username) {
45         this.username = username;
46     }
47 
48     public String getPassword() {
49         return password;
50     }
51 
52     public void setPassword(String password) {
53         this.password = password;
54     }
55 
56     public Double getAccount() {
57         return account;
58     }
59 
60     public void setAccount(Double account) {
61         this.account = account;
62     }
63 
64     @Override
65     public String toString() {
66         return "UserBean [id=" + id + ", username=" + username + ", password="
67                 + password + ", account=" + account + "]";
68     }
69     
70     
71     
72 
73 }

 

 

项目中mybatis.cfg.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 <configuration>
 5     <environments default="development">
 6         <environment id="development">
 7             <transactionManager type="JDBC"></transactionManager>
 8             <dataSource type="POOLED">
 9                 <property name="driver" value="com.mysql.jdbc.Driver" />
10                 <property name="url"
11                     value="jdbc:mysql://localhost:3306/test?serverTimezone=UTC&amp;characterEncoding=utf8&amp;useSSL=true" />
12                 <property name="username" value="root" />
13                 <property name="password" value="mysql" />
14             </dataSource>
15         </environment>
16     </environments>
17     <mappers>
18         <package name="com.wang.MyBatis.model" />
19     </mappers>
20 </configuration>

MyBatis 的配置文件包含了影响 MyBatis 行为甚深的设置(settings)和属性(properties)信息。一共有9个配置项,详细见 

http://www.mybatis.org/mybatis-3/zh/configuration.html

本配置文件中只用到了两个配置项environments和mappers,environments中指定了用到的mysql环境信息,mappers中指定了package的路径,MyBatis使用自动扫描功能,也可能指定使用具体的mapp.xml文件,配置样例如下:

1 <!-- Using classpath relative resources -->
2 <mappers>
3   <mapper resource="org/mybatis/builder/AuthorMapper.xml"/>
4   <mapper resource="org/mybatis/builder/BlogMapper.xml"/>
5   <mapper resource="org/mybatis/builder/PostMapper.xml"/>
6 </mappers>

 

DBTools.class中定义了SqlSession的工厂类,

 1 import java.io.Reader;
 2 
 3 import org.apache.ibatis.io.Resources;
 4 import org.apache.ibatis.session.SqlSession;
 5 import org.apache.ibatis.session.SqlSessionFactory;
 6 import org.apache.ibatis.session.SqlSessionFactoryBuilder;
 7 
 8 public class DBTools {
 9     public static SqlSessionFactory sessionFactory;
10     
11     static{
12         try {
13             //使用MyBatis提供的Resources类加载mybatis的配置文件
14             Reader reader = Resources.getResourceAsReader("mybatis.cfg.xml");
15             //构建sqlSession的工厂
16             sessionFactory = new SqlSessionFactoryBuilder().build(reader);
17         } catch (Exception e) {
18             e.printStackTrace();
19         }
20         
21     }
22     //创建能执行映射文件中sql的sqlSession
23     public static SqlSession getSession(){
24         return sessionFactory.openSession();
25     }
26     
27 }

第14行代码读入了该配置文件,在第15行中调用了SqlSessionFactoryBuilder的build方法对读入内存的文件进行了解析。并且返回SqlSessionFactory对象。

 

 

UserMapper.xml的定义如下:
 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <!DOCTYPE mapper PUBLIC "-//mybatis.org/DTD Mapper 3.0" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 3 <mapper namespace="com.wang.MyBatis.model.UserMapper">
 4 
 5     <!-- 自定义返回结果集 -->
 6     <resultMap id="userMap" type="com.wang.MyBatis.model.UserBean">
 7         <id property="id" column="id" javaType="java.lang.Integer"></id>
 8         <result property="username" column="username" javaType="java.lang.String"></result>
 9         <result property="password" column="password" javaType="java.lang.String"></result>
10         <result property="account" column="account" javaType="java.lang.Double"></result>
11     </resultMap>
12     <!-- 在各种标签中的id属性必须和接口中的方法名相同 , id属性值必须是唯一的,不能够重复使用。parameterType属性指明查询时使用的参数类型,resultType属性指明查询返回的结果集类型 -->
13     <!-- useGeneratedKeys:( 仅 对 insert 有 用 ) 这 会 告 诉 MyBatis 使 用 JDBC 的getGeneratedKeys 
14         方法来取出由数据(比如:像 MySQL 和 SQLServer 这样的数据库管理系统的自动递增字段)内部生成的主键。默认值: false。 -->
15     <!--keyProperty: (仅对 insert有用)标记一个属性, MyBatis 会通过 getGeneratedKeys或者通过 insert 
16         语句的 selectKey 子元素设置它的值。默认:不设置。 -->
17     <!--#{}中的内容,为占位符,当参数为某个JavaBean时,表示放置该Bean对象的属性值 -->
18 
19 
20 
21     <insert id="insertUser" useGeneratedKeys="true" keyProperty="id">
22         insert into t_user (username,password,account) values
23         (#{username},#{password},#{account})
24     </insert>
25 
26     <update id="updateUser">
27         update t_user set
28         username=#{username},password=#{password},account=#{account} where
29         id=#{id}
30     </update>
31 
32     <delete id="deleteUser" parameterType="int">
33         delete from t_user where
34         id=#{id}
35     </delete>
36 
37     <select id="selectUserById" parameterType="int" resultMap="userMap">
38         select * from t_user where id=#{id}
39     </select>
40 
41     <select id="selectAllUser" resultMap="userMap">
42         select * from t_user
43     </select>
44 
45 
46 </mapper>

resultMap定了返回的信息结果集,对应的BEAN是com.wang.MyBatis.model.UserBean,

 

App中执行了插入和查询的功能,插入功能代码如下:

 1 /**
 2      * 新增用户
 3      */
 4     private static void insertUser() {
 5         SqlSession session = DBTools.getSession();
 6         UserMapper mapper = session.getMapper(UserMapper.class);
 7         UserBean user = new UserBean("懿", "1314520", 7000.0);
 8         try {
 9             mapper.insertUser(user);
10             System.out.println(user.toString());
11             session.commit();
12         } catch (Exception e) {
13             e.printStackTrace();
14             session.rollback();
15         }
16     }

代码中首先获取SqlSession的对象,然后通过SqlSession对象在6行获取了UserMapper的动态代理类,该动态代理类是由mybatis内部实现的,在执行mapper.insertUser(user)时,由动态代理类来执行,具体的源代码讲解在后面章节展开。

 

执行代码

1 public static void main(String[] args) {
2         insertUser();
3         selectUserById();
4     }

结果如下:

1 UserBean [id=1, username=懿, password=1314520, account=7000.0]
2 org.apache.ibatis.logging.jdbc.PreparedStatementLogger@25bbf683
3 UserBean [id=1, username=懿, password=1314520, account=7000.0]

 

posted @ 2017-03-23 23:17  王久勇  阅读(767)  评论(0)    收藏  举报