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&characterEncoding=utf8&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]

浙公网安备 33010602011771号