-- 建立數據庫 CREATE DATABASE mybatis; -- 使用數據庫 USE mybatis; -- 刪除表 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,'張三','2019-03-27 18:47:08','男','北京'); insert into `user`(`id`,`username`,`birthday`,`sex`,`address`) values (42,'李四','2019-03-27 18:47:08','男','上海'); insert into `user`(`id`,`username`,`birthday`,`sex`,`address`) values (43,'王五','2019-03-27 18:47:08','男','廣州');
File -> New -> Modulejava
Maven -> Module SDK -> Nextmysql
Finishsql
導入座標數據庫
import java.sql.*; public class TestJdbc { public static void main(String args[]) { Connection connection = null; PreparedStatement preparedStatement = null; ResultSet resultSet = null; try { //1. 加載驅動 Class.forName("com.mysql.jdbc.Driver"); //2. 獲取鏈接 String url = "jdbc:mysql://localhost:3306/mybatis"; String username = "root"; String password = "root"; connection = DriverManager.getConnection(url, username, password); //3. 獲取預處理對象 String sql = "SELECT * FROM user WHERE id = ?"; preparedStatement = connection.prepareStatement(sql); // 設置參數 preparedStatement.setInt(1,41); // 執行查詢 resultSet = preparedStatement.executeQuery(); // 處理結果集 while (resultSet.next()) { System.out.println(resultSet.getString("username")); System.out.println(resultSet.getDate("birthday")); System.out.println(resultSet.getString("sex")); System.out.println(resultSet.getString("address")); } }catch (Exception ex) { ex.printStackTrace(); }finally { try { // 關閉鏈接,釋放資源 if (resultSet != null) { resultSet.close(); } if (preparedStatement != null) { preparedStatement.close(); } if (connection != null) { connection.close(); } }catch (SQLException ex) { ex.printStackTrace(); } } } }
MyBatis 本是apache的一個開源項目iBatis, 2010年這個項目由apache software foundation 遷移到了google code,而且更名爲MyBatis 。
-- 建立數據庫 CREATE DATABASE mybatis; -- 使用數據庫 USE mybatis; -- 刪除表 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,'張三','2019-03-27 18:47:08','男','北京'); insert into `user`(`id`,`username`,`birthday`,`sex`,`address`) values (42,'李四','2019-03-27 18:47:08','男','上海'); insert into `user`(`id`,`username`,`birthday`,`sex`,`address`) values (43,'王五','2019-03-27 18:47:08','男','廣州');
File -> New -> Moduleapache
Maven -> Module SDK -> Next編程
Finishmybatis
導入座標架構
import java.io.Serializable; import java.util.Date; public class User implements Serializable { private Integer id; private String username; private Date birthday; private String sex; private String address; public User() { } public User(Integer id, String username, Date birthday, String sex, String address) { this.id = id; this.username = username; this.birthday = birthday; this.sex = sex; this.address = address; } public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public Date getBirthday() { return birthday; } public void setBirthday(Date birthday) { this.birthday = birthday; } public String getSex() { return sex; } public void setSex(String sex) { this.sex = sex; } public String getAddress() { return address; } public void setAddress(String address) { this.address = address; } @Override public String toString() { return "User{" + "id=" + id + ", username='" + username + '\'' + ", birthday=" + birthday + ", sex='" + sex + '\'' + ", address='" + address + '\'' + '}'; } }
public interface UserDao { /** * 查詢全部用戶 * @return */ List<User> findAll(); }
<?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> <!-- 環境,能夠配置多個,default:指定採用哪一個環境 --> <environments default="development"> <!-- id:environment的惟一標識 --> <environment id="development"> <!-- 事務管理器,JDBC類型的事務管理器 --> <transactionManager type="JDBC"></transactionManager> <!-- 數據源,池類型的數據源 --> <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="root"/> </dataSource> </environment> </environments> <!-- 映射配置文件 --> <mappers> <mapper resource="com/mybatis/dao/UserDao.xml"></mapper> </mappers> </configuration>
<?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.mybatis.dao.UserDao"> <select id="findAll" resultType="com.mybatis.domain.User"> SELECT * FROM user; </select> </mapper>
public class MybatisTest { /** * 入門案例測試類 * @param args */ public static void main(String[] args) throws Exception{ //1. 讀取配置文件 InputStream inputStream = Resources.getResourceAsStream("SqlMapConfig.xml"); //2. 獲取SqlSessionFactoryBuilder對象 SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder(); //3. 獲取SqlSessionFactory對象 SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(inputStream); //4. 獲取SqlSession對象 SqlSession sqlSession = sqlSessionFactory.openSession(); //5. 獲取接口的代理對象 UserDao userDao = sqlSession.getMapper(UserDao.class); //6. 使用代理對象執行方法 List<User> userList = userDao.findAll(); for (User user : userList) { System.out.println(user); } //7. 釋放資源 sqlSession.close(); inputStream.close(); } }
User{id=41, username='張三', birthday=Wed Mar 27 18:47:08 CST 2019, sex='男', address='北京'} User{id=42, username='李四', birthday=Wed Mar 27 18:47:08 CST 2019, sex='男', address='上海'} User{id=43, username='王五', birthday=Wed Mar 27 18:47:08 CST 2019, sex='男', address='廣州'}
1.準備數據
2.搭建maven工程,導入座標
3.建立數據表對應的pojo與dao接口
4.建立Mybatis的主配置文件與映射配置文件
5.建立測試類app
File -> New -> Moduledom
Maven -> Module SDK -> Next
Finish
導入座標
import java.io.Serializable; import java.util.Date; public class User implements Serializable { private Integer id; private String username; private Date birthday; private String sex; private String address; public User() { } public User(Integer id, String username, Date birthday, String sex, String address) { this.id = id; this.username = username; this.birthday = birthday; this.sex = sex; this.address = address; } public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public Date getBirthday() { return birthday; } public void setBirthday(Date birthday) { this.birthday = birthday; } public String getSex() { return sex; } public void setSex(String sex) { this.sex = sex; } public String getAddress() { return address; } public void setAddress(String address) { this.address = address; } @Override public String toString() { return "User{" + "id=" + id + ", username='" + username + '\'' + ", birthday=" + birthday + ", sex='" + sex + '\'' + ", address='" + address + '\'' + '}'; } }
import java.io.Serializable; public class QueryVo implements Serializable { private User user; public User getUser() { return user; } public void setUser(User user) { this.user = user; } @Override public String toString() { return "QueryVo{" + "user=" + user + '}'; } }
public interface UserDao { /** * 查詢全部 * @return */ List<User> findAll(); /** * 保存用戶 * @param user */ void saveUser(User user); /** * 更新用戶 * @param user */ void updateUser(User user); /** * 刪除用戶 * @param id */ void deleteUser(Integer id); /** * 根據id查詢用戶 * @param id */ User findById(Integer id); /** * 根據名稱模糊查詢 * @param username * @return */ List<User> findByUsername(String username); /** * 查詢用戶的總記錄數 * @return */ Integer findTotal(); /** * 根據pojo查詢用戶 */ List<User> findByQueryVo(QueryVo queryVo); }
<?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> <!-- 環境,能夠配置多個,default:指定採用哪一個環境 --> <environments default="development"> <!-- id:environment的惟一標識 --> <environment id="development"> <!-- 事務管理器,JDBC類型的事務管理器 --> <transactionManager type="JDBC"></transactionManager> <!-- 數據源,池類型的數據源 --> <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="root"/> </dataSource> </environment> </environments> <!-- 映射配置文件 --> <mappers> <mapper resource="com/mybatis/dao/UserDao.xml"></mapper> </mappers> </configuration>
<?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.mybatis.dao.UserDao"> <!-- 查詢全部 --> <select id="findAll" resultType="com.mybatis.domain.User"> SELECT * FROM user </select> <!-- 保存用戶 --> <insert id="saveUser" parameterType="com.mybatis.domain.User"> INSERT INTO user(username,birthday,sex,address) values(#{username},#{birthday},#{sex},#{address}) </insert> <!-- 更新用戶 --> <update id="updateUser" parameterType="com.mybatis.domain.User"> UPDATE user SET username = #{username}, birthday = #{birthday}, sex = #{sex}, address = #{address} WHERE id = #{id} </update> <!-- 刪除用戶 --> <delete id="deleteUser" parameterType="java.lang.Integer"> DELETE FROM user WHERE id = #{id} <!-- 當只有一個參數時,參數名稱能夠任意 --> </delete> <!-- 根據id查詢用戶 --> <select id="findById" parameterType="java.lang.Integer" resultType="com.mybatis.domain.User"> SELECT * FROM user WHERE id = #{id} </select> <!-- 根據名稱模糊查詢 --> <select id="findByUsername" parameterType="java.lang.String" resultType="com.mybatis.domain.User"> SELECT * FROM user WHERE username LIKE #{%username%} </select> <!-- 查詢用戶的總記錄數 --> <select id="findTotal" resultType="java.lang.Integer"> SELECT COUNT(id) FROM user </select> <!-- 根據pojo查詢用戶 --> <select id="findByQueryVo" parameterType="com.mybatis.domain.QueryVo" resultType="com.mybatis.domain.User"> SELECT * FROM user WHERE username = #{user.username} </select> </mapper>
public class MybatisTest { private InputStream inputStream; private SqlSessionFactoryBuilder sqlSessionFactoryBuilder; private SqlSessionFactory sqlSessionFactory; private SqlSession sqlSession; private UserDao userDao; @Before public void init() throws Exception{ //1. 讀取配置文件 this.inputStream = Resources.getResourceAsStream("SqlMapConfig.xml"); //2. 獲取SqlSessionFactoryBuilder this.sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder(); //3. 獲取SqlSessionFactory this.sqlSessionFactory = sqlSessionFactoryBuilder.build(inputStream); //4. 獲取SqlSession this.sqlSession = sqlSessionFactory.openSession(); //5. 獲取接口的代理對象 this.userDao = sqlSession.getMapper(UserDao.class); } @After public void destroy() throws Exception{ //8. 提交事務 sqlSession.commit(); //9. 關閉資源 sqlSession.close(); inputStream.close(); } /** * 查詢全部 */ @Test public void testFindAll() throws Exception { List<User> userList = this.userDao.findAll(); for (User user : userList) { System.out.println(user); } } /** * 保存用戶 */ @Test public void testSaveUser() throws Exception { //6. 利用代理對象調用接口中的方法 User user = new User(); user.setUsername("找老劉"); user.setBirthday(new Date()); user.setSex("男"); user.setAddress("上海陸家嘴"); this.userDao.saveUser(user); } /** * 更新用戶 */ @Test public void testUpdateUser() throws Exception { User user = new User(); user.setId(53); user.setUsername("王五"); user.setBirthday(new Date()); user.setSex("男"); user.setAddress("香格里拉"); userDao.updateUser(user); } /** * 刪除用戶 */ @Test public void testDeleteUser() throws Exception { userDao.deleteUser(53); } /** * 根據id查詢用戶 */ @Test public void testFindById() throws Exception { User user = userDao.findById(51); System.out.println(user); } /** * 根據名稱模糊查詢 */ @Test public void testFindByUsername() throws Exception { List<User> userList = userDao.findByUsername("老王"); for (User user : userList) { System.out.println(user); } } /** * 查詢用戶的總記錄數 */ @Test public void testFindTotal() throws Exception { Integer total = userDao.findTotal(); System.out.println(total); } /** * 根據pojo查詢用戶 */ @Test public void testFindByQueryVo() throws Exception { User user = new User(); user.setUsername("tom"); QueryVo queryVo = new QueryVo(); queryVo.setUser(user); List<User> userList = userDao.findByQueryVo(queryVo); for (User u : userList) { System.out.println(u); } } }
-- 執行findAll() User{id=41, username='張三', birthday=Wed Mar 27 18:47:08 CST 2019, sex='男', address='北京'} User{id=42, username='李四', birthday=Wed Mar 27 18:47:08 CST 2019, sex='男', address='上海'} User{id=43, username='王五', birthday=Wed Mar 27 18:47:08 CST 2019, sex='男', address='廣州'}
MyBatis主配置文件中的properties元素的propertie子元素的value屬性的值,便可以直接定義,也能夠在主配置文件中定義而後引用,也能夠引用外部的properties文件。舉例子來講就是,以下的兩個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"></transactionManager> <dataSource type="pooled"> <property name="driver" value="com.mysql.jdbc.Driver"/> <property name="url" value="jdbc:mysql://localhost:3306/eesy"/> <property name="username" value="root"/> <property name="password" value="root"/> </dataSource> </environment> </environments> <mappers> <mapper resource="com/mybatis/dao/UserDao.xml"></mapper> </mappers> </configuration>
<?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> <properties> <property name="driver" value="com.mysql.jdbc.Driver"/> <property name="url" value="jdbc:mysql://localhost:3306/eesy"/> <property name="username" value="root"/> <property name="password" value="root"/> </properties> <environments default="development"> <environment id="development"> <transactionManager type="jdbc"></transactionManager> <dataSource type="pooled"> <property name="driver" value="${driver}"/> <property name="url" value="${url}"/> <property name="username" value="${username}"/> <property name="password" value="${password}"/> </dataSource> </environment> </environments> <mappers> <mapper resource="com/mybatis/dao/UserDao.xml"></mapper> </mappers> </configuration>
以上兩種形式,在開發過程當中通常不會這麼用。通常是直接類路徑下(在maven工程下就是resources目錄下)定義一個properties文件,而後在MyBatis的主配置文件中引用該文件,而後就能夠在主配置文件中直接引用。以下所示:
jdbc.driver = com.mysql.jdbc.Driver jdbc.url = jdbc:mysql://localhost:3306/mybatis jdbc.username = root jdbc.password = root
<?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> <properties resource="datasource.properties"></properties> <environments default="development"> <environment id="development"> <transactionManager type="jdbc"></transactionManager> <dataSource type="pooled"> <property name="driver" value="${jdbc.driver}"/> <property name="url" value="${jdbc.url}"/> <property name="username" value="${jdbc.username}"/> <property name="password" value="${jdbc.password}"/> </dataSource> </environment> </environments> <mappers> <mapper resource="com/mybatis/dao/UserDao.xml"></mapper> </mappers> </configuration>
若是屬性在不僅一個地方進行了配置,那麼 MyBatis 將按照下面的順序來加載:
在MyBatis的映射配置文件中(也就是接口對應的XxxMapper.xml文件),每當指定一個java類的所屬類型時,都須要拼寫出該類的全限定類名。例以下面的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.mybatis.dao.UserDao"> <!-- 查詢全部 --> <select id="findAll" resultType="com.mybatis.domain.User"> SELECT * FROM user </select> <!-- 保存用戶 --> <insert id="saveUser" parameterType="com.mybatis.domain.User"> INSERT INTO user(username,birthday,sex,address) values(#{username},#{birthday},#{sex},#{address}) </insert> </mapper>
如上這樣配置存在一個問題,當配置文件少的時候還好,若是配置文件的數量一旦增多,就會致使工做量激增。因此就有了給java類的全限定類名取一個簡短的別名,用別名代替全限定類名,減小沒必要要的工做量。具體操做以下。
主配置文件中使用typeAliases標籤爲pojo的全限定類名去一個別名,而後把映射配置文件中pojo的全限定類名替換成別名便可。別名能夠任意,且當使用了別名後,別名將不區分大小寫。具體配置以下。
主配置文件
<?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> <!-- 注意configuration下的子標籤嚴格區分定義順序(使用順序) --> <properties resource="datasource.properties"></properties> <typeAliases> <!-- type:用於指定pojo的全限定類名; alias:用於指定別名 --> <typeAlias type="com.mybatis.domain.User" alias="user"></typeAlias> </typeAliases> <environments default="development"> <environment id="development"> <transactionManager type="jdbc"></transactionManager> <dataSource type="pooled"> <property name="driver" value="${jdbc.driver}"/> <property name="url" value="${jdbc.url}"/> <property name="username" value="${jdbc.username}"/> <property name="password" value="${jdbc.password}"/> </dataSource> </environment> </environments> <mappers> <mapper resource="com/mybatis/dao/UserDao.xml"></mapper> </mappers> </configuration>
映射文件
<?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.mybatis.dao.UserDao"> <!-- 查詢全部 --> <!-- 使用了別名後pojo的別名不區分大小寫 --> <select id="findAll" resultType="user"> SELECT * FROM user </select> <!-- 保存用戶 --> <insert id="saveUser" parameterType="User"> INSERT INTO user(username,birthday,sex,address) values(#{username},#{birthday},#{sex},#{address}) </insert> </mapper>
以上操做雖然已經能極大的簡化咱們的開發,可是,一個項目中不可能只有一兩個pojo。因此若是咱們要使用上述的方式指定定義一個項目中全部pojo的話也不現實。typeAliases下除了typeAlias子標籤外,還有一個package子標籤,該標籤的做用是爲某個指定的包下全部的pojo一塊兒取別名,默認類名即爲別名。具體以下所示。
<?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> <!-- 注意configuration下的子標籤嚴格區分定義順序(使用順序) --> <properties resource="datasource.properties"></properties> <typeAliases> <!-- type:用於指定pojo的全限定類名; alias:用於指定別名 --> <typeAlias type="com.mybatis.domain.User" alias="user"></typeAlias> <!-- 爲com.mybatis.domain子包下的pojo一塊兒取別名,別名即爲類名 --> <package name="com.mybatis.domain"/> </typeAliases> <environments default="development"> <environment id="development"> <transactionManager type="jdbc"></transactionManager> <dataSource type="pooled"> <property name="driver" value="${jdbc.driver}"/> <property name="url" value="${jdbc.url}"/> <property name="username" value="${jdbc.username}"/> <property name="password" value="${jdbc.password}"/> </dataSource> </environment> </environments> <mappers> <mapper resource="com/mybatis/dao/UserDao.xml"></mapper> </mappers> </configuration>
<select id="findById" parameterType="java.lang.Integer" resultType="com.mybatis.domain.User"> SELECT * FROM user WHERE id = #{id} </select>
屬性說明
<insert id="saveUser" useGeneratedKeys="true" keyColumn="id" keyProperty="id" parameterType="com.mybatis.domain.User"> INSERT INTO user(username,birthday,sex,address) values(#{username},#{birthday},#{sex},#{address}) </insert>
屬性說明
<update id="updateUser" parameterType="com.mybatis.domain.User"> UPDATE user SET username = #{username}, birthday = #{birthday}, sex = #{sex}, address = #{address} WHERE id = #{id} </update>
屬性說明
<delete id="deleteUser" parameterType="java.lang.Integer"> <!-- 當只有一個參數時,參數名稱能夠任意 --> DELETE FROM user WHERE id = #{id} </delete>
屬性說明