作用:封裝了JDBC操作,簡化數據庫訪問代碼。
封裝的功能:
1.獲取連接,執行SQL,釋放連接
2.SQL參數設置(可以直接傳入對象,Mybtis會將對象的屬性傳入SQL語句)
#{屬性值}取代JDBC的?占位符
3.執行結果映射成實體對象。JDBC中需要開發者自己轉換。
實體類的屬性名與查詢結果集ResultSet的列名保持一致,結果集有別名的話以別名為屬性名。
開發者工作:寫SQL語句和實體類,然后使用SqlSession對象執行SQL操作。
Mybatis結構
SqlMapconfig.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> <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://localhost:3306/mybatis" /> <property name="username" value="root" /> <property name="password" value="XDP" /> </dataSource> </environment> </environments> <mappers> <!--注冊uerMapper.xml文件,resource是其路徑,通常和實體類在一個目錄中,也可單獨建一個文件專門放Mapper.xml--> <mapper resource="org/tarena/entity/userMapper.xml"/> </mappers> </configuration>
userMapper.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,通常設置成包名+sql映射的文件名--> <mapper namespace="myBatis.test.Demo.userMapper"> <!-- 在select/insert/delete標簽中編寫SQL語句; 設置唯一的id屬性,將來SqlSession通過id調用sql語句; parameterType指明查詢時使用的參數類型。如果參數只有1個則用簡單類型,參數為多個時可用Map集合或實體對象,占位符用對象的屬性名; resultType表示查詢結果將要封裝成的實體類,也可以為Map類型或基本類型--> <select id="getUserByID" parameterType="int" resultType="myBatis.test.User"> select * from users where id=#{propertyName} </select> <insert id="save" parameterType="myBatis.test.User"> insert into user(name,salary,age) values (#{name},#{salary},#{age}) </insert> </mapper>
獲取SqlSession操作sql語句:
//工具類 public class MyBatisUtil { public static SqlSession getSqlSession { //mybatis的配置文件 String conf = "SqlMapConfig.xml"; //使用類加載器加載mybatis的配置文件 InputStream is = MyBatisUtil.class.getClassLoader().getResourceAsStream(conf); //構建sqlSession的工廠 SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder(); SqlSessionFactory factory = builder.build(is); SqlSession session = sessionFactory.openSession(); return session; } }
//執行SQL語句 public class TestEMP { public static void main(String[] args) throws IOException { SqlSession session=MyBatisUtil.getSqlSession(); //直接返回封裝好的對象 User user=session.selectOne("getUserByID",10); //other word session.commit(); //增刪改必須提交事務 session.close(); //釋放session } }
返回Map類型的結果集
如果需要全部字段時可以和實體類映射。如果僅查詢部分字段,沒必要用實體類封裝,可以用Map進行封裝,key為列名,value為對應的字段值。
resultType =”java.util.HashMap”
當封裝的實體對象的屬性和查詢結果的字段名不一致時,可以將結果集的別名改為和實體對象的屬性一致。
或者使用resultMap屬性代替resultType屬性,顯式指定映射關系。如下所示:
<!-- type為返回的封裝對象,property為實體類屬性名,column為表的列名--> <!-- 主鍵用id元素指定匹配規則,非主鍵用result指定匹配規則;一致時可以省略--> <resultMap id="userMap" type="myBatis.test.User"> <id property="id" column="user_id"></id> <result prompt="name" column="name"></result> </resultMap>
Mapper映射接口規則
需要編寫DAO接口的實現類,給controll或service使用。
如果開發者按照MyBatis的規則定義DAO接口,實現類就不用寫了,框架會動態地在內存中創建實現類。
1. 根據SQL定義文件中的id屬性當接口的方法名
2. 根據SQL定義文件中的parameterType類型當方法參數類型
3. 根據SQL定義文件中的resultType類型定義方法返回的類型
(多行使用List<T>;單行使用T類型)
4. 將SQL定義文件<mapper>的namespace屬性指定成包名+DAO的接口名
//定義DAO接口 public interface UserDao{ public User getUserByID(int id); public void save(User user); }
使用:
UserDao userDao = Session.getMapper(UserDao.class);//接口實現的對象 User user=userDao.getUserByID("10");
Mybatis與Spring的整合
Mybatis-spring.jar整合包,包含以下組件:
1) SqlSessionFactoryBean組件:封裝了創建SqlSessinFactory的過程。
在applictionContext.xml中配置MapperFactoryBean組件
2) MapperFactoryBean組件:封裝了根據Mapper映射器接口生成實現組件的功能。
不用再調用session.getMapper(UserDao.class),生成的bean會加入spring容器中,直接調用該bean實例的方法執行sql語句。
一個bean只能給一個mapper接口生成實現組件。
<!--定義MapperFactoryBean 一次只能為一個Mapper接口生成實現組件;id為實現接口的對象,value為實現的mapper接口;ref為引用的SqlSession資源;可以注入到service中直接使用。--> <bean id="userDao" class="org.mybatis.spring.mapper.MapperFactoryBean"> <property name="mapperInterface" value="myBatis.test.Demo.userMapper"></property> <property name="sqlSessionFactory" ref="ssf"></property> </bean>
<!--創建SqlSessionFactory,定義SqlSession資源--> <!-- 整合后不需要myBatis主配置文件,相關信息以注入的方式加入到此 --> <bean id="ssf" class="org.mybatis.spring.SqlSessionFactoryBean"> <!-- 注入dataSource --> <property name="dataSource" ref="dbcp" /> <!-- 注入SQL語句文件 --> <property name="configLocation" value="classpath:org/mybaits/*.xml"></property> </bean>
<!-- 定義dbcp的DataSource --> <bean id="dbcp" class="org.apache.commons.dbcp.BasicDataSource"> <property name="username" value="root" /> <property name="password" value="123" /> <property name="url" value="jdbc:mysql://localhost:3306/mydb?useUnicode=true&characterEncoding=UTF-8"></property> <property name="driver" value="com.mysql.jdbc.Driver"/> </bean>
測試與使用
public class TestMybatis { private static ApplicationContext cxt; public static void main(String[] args) { // TODO 自動生成的方法存根 cxt = new ClassPathXmlApplicationContext("applicationContext.xml"); UserDao userDao = cxt.getBean("UserDao",UserDao.class); List<User> list = userDao.findAll(); for (User user : list){ System.out.println(user.getName()); }
} }
3) MapperScannerConfiger組件,封裝了批量生成Mapper接口組件的功能。
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"> <!-- value設置包路徑,可以使用分號或逗號作為分隔符設置多個包路徑。 --> <property name="basePackage" value="myBatis.test.Demo" /> <!-- 只有具備該注解標記的接口才會被自動實現 --> <property name="annotationClass" value="myBatis.test.annotation.MyBatisDao" /> <!-- sqlSessionFactory會自動注入 --> <property name="sqlSessionFactory" ref="ssf"></property> </bean>
4) SqlSessionTemplate組件:自己編寫Dao接口實現類時可以簡化編程。
Spring整合MyBatis結構: