第一章 Mybtais的两种启动方式
Mybatis的两种启动方式如下:
1.xml实现:
xml的实现方式中,主要是通过手动创建SqlSession,然后调用session.selectOne()方法实现来实现。
首先是创建Configuration.xml文件:
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd"> <configuration> <!-- 为每个model类配置别名 --> <typeAliases> <typeAlias alias="User" type="com.xxx.mybatis.model.User"/> </typeAliases> <environments default="development"> <environment id="development"> <transactionManager type="JDBC"/> <dataSource type="POOLED"> <property name="driver" value="com.mysql.jdbc.Driver"/> <property name="url" value="jdbc:mysql://127.0.0.1:3306/mytest" /> <property name="username" value="root"/> <property name="password" value="123456"/> </dataSource> </environment> </environments> <!-- 手动加载model的映射xml文件 --> <mappers> <mapper resource="mapper/User.xml"/> </mappers> </configuration>
Configuration.xml文件中主要是为每个model对象起一个别名,然后在具体的映射文件中可以直接使用这些定义的别名。
文件中同时还需手动引入每一个配置的xml映射文件。此部分配置在引入自动扫描后可省略。
User.java类代码如下:
1 package com.xxx.model; 2 3 public class User { 4 5 private int id; 6 private String userName; 7 private String userAge; 8 private String userAddress; 9 10 public int getId() { 11 return id; 12 } 13 public void setId(int id) { 14 this.id = id; 15 } 16 public String getUserName() { 17 return userName; 18 } 19 public void setUserName(String userName) { 20 this.userName = userName; 21 } 22 public String getUserAge() { 23 return userAge; 24 } 25 public void setUserAge(String userAge) { 26 this.userAge = userAge; 27 } 28 public String getUserAddress() { 29 return userAddress; 30 } 31 public void setUserAddress(String userAddress) { 32 this.userAddress = userAddress; 33 } 34 35 }
配置User.xml文件
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="com.xxx.models.UserMapper"> <!-- resultType与Configuration中的别名对应 --> <select id="selectUserByID" parameterType="int" resultType="User"> select * from `user` where id = #{id} </select> </mapper> <!-- useGeneratedKeys设置为"true"表明要MyBatis获取由数据库自动生成的主键;keyProperty="id"指定把获取到的主键值注入到User的id属性--> <insert id="addUser" parameterType="User" useGeneratedKeys="true" keyProperty="id"> insert into user(userName,userAge,userAddress) values(#{userName},#{userAge},#{userAddress}) </insert>
以#{id}的形式引用User参数的id属性,MyBatis将使用反射读取User参数的属性。
至此Mybatis启动文件配置完成,开始编写启动类:
1 public class Test { 2 private static SqlSessionFactory sqlSessionFactory; 3 private static Reader reader; 4 5 static { 6 try { 7 reader = Resources.getResourceAsReader("Configuration.xml"); 8 sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader); 9 } catch (Exception e) { 10 e.printStackTrace(); 11 } 12 } 13 14 public static void main(String[] args) { 15 SqlSession session = sqlSessionFactory.openSession(); 16 17 SqlSession session = sqlSessionFactory.openSession(); 18 try { 19 // com.xxx.model.UserMapper应与User.xml中的namespace完全对应 20 User user = session.selectOne("com.xxx.model.UserMapper.selectUserByID", 1); 21 22 System.out.println(user.getUserAddress()); 23 System.out.println(user.getUserName()); 24 } finally { 25 session.close(); 26 } 27 } 28 29 }
2.xml + 接口 实现
在实现方式一中,selectOne()中的参数应与映射的User.xml文件中的namespace完全对应,不够灵活,也增加了出错的可能性。可以使用xml加接口的形式来代替。
首先增加接口类IUserMapper:
1 package com.xxx.mapper; 2 3 import com.netease.model.User; 4 import java.util.List; 5 6 public interface IUserMapper { 7 public User selectUserByID(int id); 8 9 public void addUser(User user); 10 }
此处的方法名与User.xml文件中的id对应。同时将User.xml中的namespace改为:
<mapper namespace="com.netease.mapper.IUserMapper">
此时调用方式如下:
public static void main(String[] args) { SqlSession session = sqlSessionFactory.openSession(); try { IUserMapper mapper = session.getMapper(IUserMapper.class); User user = mapper.selectUserByID(1); } finally { session.close(); } }
Mybatis调用sql的方式总结为以上两种,一种是通过sqlSession的selectOne(),insert()等方法直接匹配调用xml中的sql语句;
另一种是定义接口,再通过接口调用,程序中只有接口的定义,而没有接口的实现类,调用过程中实际上是调用了Mybatis实现的接口代理类。
这两种实现方式的深层次分析,将在后续章节中继续分析。
3.集成spring
在方式2中,sqlSessionFactory,sqlSession与定义的接口都通过手动实例化,将spring集成进来之后,sqlSessionFactory与sqlSession都将交给spring管理。
首先配置spring的配置文件applicationContext.xml:
1 <?xml version="1.0" encoding="UTF-8"?> 2 <beans xmlns="http://www.springframework.org/schema/beans" 3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 4 xmlns:context="http://www.springframework.org/schema/context" 5 xmlns:aop="http://www.springframework.org/schema/aop" 6 xsi:schemaLocation="http://www.springframework.org/schema/beans 7 http://www.springframework.org/schema/beans/spring-beans-3.1.xsd 8 http://www.springframework.org/schema/context 9 http://www.springframework.org/schema/context/spring-context-3.1.xsd 10 http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.1.xsd" 11 default-autowire="byName"> 12 13 <bean id="dataSource" class="org.apache.commons.dbcp2.BasicDataSource"> 14 <property name="driverClassName" value="com.mysql.jdbc.Driver"/> 15 <property name="url" value="jdbc:mysql://127.0.0.1:3306/mytest?characterEncoding=utf8"/> 16 <property name="username" value="root"/> 17 <property name="password" value="123456"/> 18 </bean> 19 20 <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> 21 <!--dataSource属性指定要用到的连接池--> 22 <property name="dataSource" ref="dataSource"/> 23 <!--configLocation属性指定mybatis的核心配置文件--> 24 <property name="configLocation" value="classpath:Configuration.xml"/> 25 <!-- 所有配置的mapper文件 --> 26 <property name="mapperLocations" value="classpath*:mapper/*.xml" /> 27 </bean> 28 29 <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> 30 <property name="dataSource" ref="dataSource" /> 31 </bean> 32 33 <!-- 方式一 为每个接口定义一个bean --> 34 <!--<bean id="userMapper" class="org.mybatis.spring.mapper.MapperFactoryBean">--> 35 <!--<!–sqlSessionFactory属性指定要用到的SqlSessionFactory实例–>--> 36 <!--<property name="sqlSessionFactory" ref="sqlSessionFactory"/>--> 37 <!--<!–mapperInterface属性指定映射器接口,用于实现此接口并生成映射器对象–>--> 38 <!--<property name="mapperInterface" value="com.xxx.mapper.IUserMapper"/>--> 39 <!--</bean>--> 40 41 <!-- 方式二 Mybatis自动扫描接口 --> 42 <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"> 43 <property name="basePackage" value="com.xxx.mapper" /> 44 </bean> 45 </beans>
此时User.xml文件中的导入映射文件的配置可以删除,User.xml中只是配置model的别名。
与spring集成后,可通过spring注入获取接口,然后直接调用接口的方法:
@Autowired
IUserMapper userMapper;