mybatis是對持久層進行了封裝、mybatis文檔地址:https://mybatis.org/mybatis-3/zh/index.html
下面實現單表的增刪改查操作。
1.新建maven項目命名為mybatis、並在pom.xml中引入相關依賴
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.itheima</groupId> <artifactId>mybaits</artifactId> <version>1.0-SNAPSHOT</version> <packaging>jar</packaging> <dependencies> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.4.5</version> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.6</version> </dependency> <dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>1.2.12</version> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.10</version> </dependency> </dependencies> </project>
2.數據庫命名為eesy_mybatis,執行下列sql語句
DROP TABLE IF EXISTS `user`; CREATE TABLE `user` ( `id` int(11) NOT NULL auto_increment, `username` varchar(32) NOT NULL COMMENT '用戶名稱', `birthday` datetime default NULL COMMENT '生日', `sex` char(1) default NULL COMMENT '性別', `address` varchar(256) default NULL COMMENT '地址', PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; insert into `user`(`id`,`username`,`birthday`,`sex`,`address`) values (41,'老王','2018-02-27 17:47:08','男','北京'),(42,'小二王','2018-03-02 15:09:37','女','北京金燕龍'),(43,'小二王','2018-03-04 11:34:34','女','北京金燕龍'),(45,'傳智播客','2018-03-04 12:04:06','男','北京金燕龍'),(46,'老王','2018-03-07 17:37:26','男','北京'),(48,'小馬寶莉','2018-03-08 11:44:00','女','北京修正');
3編寫實體類User與QV,包目錄結構如下
public class User implements Serializable { //實體屬性與數據庫字段一一對應 private Integer id; private String username; private Date birthday; private String sex; private String address; //getter/setter【已省略】 }
public class QV { private User user; private List<Integer> ids; //getter/setter【已省略】 }
4.編寫接口UserDao,包目錄結構如下:
package com.dao; import com.domain.QV; import com.domain.User; import java.util.List; public interface userDao { //查詢所有用戶 List<User> findAll(); //保存單個用戶 int saveUser(User user); //更新用戶信息 int updateUser(User user); //刪除用戶信息 int deleteUser(int id); //根據用戶姓名模糊查詢用戶 List<User> findUserByName(String name); // List<User> findByQV(String name); //多條件查詢 List<User> findByUser(User user); //傳入查詢條件QV對多個ID進行范圍查詢 List<User> findByIds(QV qv); }
5.編寫mybaits的主配置函數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"> <!-- mybatis的主配置文件 --> <configuration> <!-- 配置環境 --> <environments default="mysql"> <!-- 配置mysql的環境--> <environment id="mysql"> <!-- 配置事務的類型--> <transactionManager type="JDBC"></transactionManager> <!-- 配置數據源(連接池) --> <dataSource type="POOLED"> <!-- 配置連接數據庫的4個基本信息 --> <property name="driver" value="com.mysql.jdbc.Driver"/> <property name="url" value="jdbc:mysql://localhost:3306/eesy_mybatis?useUnicode=true&characterEncoding=utf8"/> <property name="username" value="root"/> <property name="password" value="root"/> </dataSource> </environment> </environments> <!-- 配置子配置文件位置 --> <!-- 映射位置一一對應,包括包目錄結構--> <mappers> <mapper resource="com/dao/userDao.xml"/> </mappers> </configuration>
6.編寫子配置文件userDao.xml,包目錄結構如下
<?xml version="1.0" encoding="UTF-8"?> <!--mybaits頭約束 --> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <!-- 配置映射,填寫絕對路徑 --> <mapper namespace="com.dao.userDao"> <!-- 了解的內容:抽取重復的sql語句--> <sql id="defaultUser"> select * from user </sql> <!--配置查詢所有用戶--> <select id="findAll" resultType="com.domain.User"> select * from user </select> <!--保存單個用戶,屬性需要與domain實體中的屬性一一對應--> <insert id="saveUser" parameterType="com.domain.User"> insert into user(username,address,sex,birthday)values(#{username},#{address},#{sex},#{birthday}); </insert> <!--更新用戶信息--> <update id="updateUser" parameterType="com.domain.User"> update user set username=#{username},sex=#{sex} where id=#{id}; </update> <!--刪除用戶--> <delete id="deleteUser"> delete from user where id=#{id}; </delete> <!--模糊查詢--> <select id="findUserByName" parameterType="String" resultType="com.domain.User"> select * from user where username like #{username}; </select> <!--參數為對象類型 --> <select id="findByQV" parameterType="String" resultType="com.domain.User"> select * from user where username like #{user.username}; </select> <!--多條件查詢--> <select id="findByUser" parameterType="com.domain.User" resultType="com.domain.User"> select * from user <where> <if test="username!=null and username != ''"> and username like #{username} </if> <if test="sex!=null and sex != ''"> and sex like #{sex} </if> </where> </select> <!--傳入多個ID對用戶進行范圍查詢--> <select id="findByIds" parameterType="com.domain.QV" resultType="com.domain.User"> <include refid="defaultUser"></include> <where> <if test="ids != null and ids.size()>0"> <foreach collection="ids" open="and id in (" close=")" item="id" separator=","> #{id} </foreach> </if> </where> </select> </mapper>
7.編寫測試類
package com.dao; import com.domain.QV; import com.domain.User; import org.apache.ibatis.io.Resources; import org.apache.ibatis.session.SqlSession; import org.apache.ibatis.session.SqlSessionFactory; import org.apache.ibatis.session.SqlSessionFactoryBuilder; import org.junit.After; import org.junit.Before; import org.junit.Test; import java.io.InputStream; import java.util.ArrayList; import java.util.Date; import java.util.List; /** * @author admin * @version 1.0.0 * @ClassName mybaits.java * @Description TODO * @createTime 2020年01月10日 15:48:00 */ public class mybaits {
private InputStream in; private SqlSession sqlSession; private userDao userDao; @Before//用於在測試方法執行之前執行 public void init() throws Exception { //1.讀取配置文件,生成字節輸入流 in = Resources.getResourceAsStream("SqlMapConfig.xml"); //2.獲取SqlSessionFactory SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(in); //3.獲取SqlSession對象 sqlSession = factory.openSession(); //4.獲取dao的代理對象 userDao = sqlSession.getMapper(userDao.class); } @After//用於在測試方法執行之后執行 public void destroy() throws Exception { //提交事務 sqlSession.commit(); //6.釋放資源 sqlSession.close(); in.close(); } @Test public void findAll(){ List<User> list = userDao.findAll(); for(User u : list){ System.out.println(u.toString()); } } @Test public void save() { User user = new User(); user.setUsername("modify User property"); user.setAddress("北京市順義區"); user.setSex("男"); user.setBirthday(new Date()); //執行方法 userDao.saveUser(user); } @Test public void update() { User user = new User(); user.setId(51); user.setUsername("update UserName"); user.setSex("女"); //執行方法 userDao.updateUser(user); } @Test public void delete() { User user = new User(); user.setId(51); //執行方法 userDao.deleteUser(user.getId()); } @Test public void findByUserName() { //執行方法 List<User> list = userDao.findUserByName("小%"); for(User user:list){ System.out.println(user.toString()); } } @Test public void findByQV() { //執行方法 List<User> list = userDao.findByQV("小%"); for(User user:list){ System.out.println(user.toString()); } } //多條件查詢 @Test public void findByUser() { User user = new User(); user.setUsername("小%"); user.setSex("男"); //執行方法 List<User> list = userDao.findByUser(user); for(User u:list){ System.out.println(u.toString()); } } //多個ID進行范圍查詢 @Test public void findByIds() { List<Integer> list = new ArrayList<Integer>(); list.add(42); list.add(43); list.add(45); QV qv = new QV(); qv.setIds(list); //執行方法 List<User> users = userDao.findByIds(qv); for(User u:users){ System.out.println(u.toString()); } } }
筆記:
無反射不框架,mybatis框架很多地方要求一一對應,按別人的規則來利用這種一一對應以及相應的getter/setter可幫助開發
動態SQL是mybatis的一大特點,上述簡單使用了下,動態sql文檔的說明:https://mybatis.org/mybatis-3/zh/dynamic-sql.html
盡量保證實體類的屬性與數據庫字段的列名一致,如果不一致需要自己在子配置文件中進行相關配置,用resultMap
<!-- 配置 查詢結果的列名和實體類的屬性名的對應關系 --> <resultMap id="userMap" type="uSeR"> <!-- 主鍵字段的對應 --> <id property="userId" column="id"></id> <!--非主鍵字段的對應--> <result property="userName" column="username"></result> <result property="userAddress" column="address"></result> <result property="userSex" column="sex"></result> <result property="userBirthday" column="birthday"></result> </resultMap>