環境:java
/* SQLyog Ultimate v13.1.1 (64 bit) MySQL - 5.7.31-log : Database - mybatis ********************************************************************* */ CREATE DATABASE /*!32312 IF NOT EXISTS*/`mybatis` /*!40100 DEFAULT CHARACTER SET latin1 */; USE `mybatis`; /*Table structure for table `user` */ DROP TABLE IF EXISTS `user`; CREATE TABLE `user` ( `id` int(20) NOT NULL, `name` varchar(30) DEFAULT NULL, `pwd` varchar(30) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; /*Data for the table `user` */ insert into `user`(`id`,`name`,`pwd`) values (1,'qijian','123'), (2,'Tom','123'), (3,'qijian','111');
<?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"> <parent> <artifactId>mybatis-study</artifactId> <groupId>com.qijijan</groupId> <version>1.0-SNAPSHOT</version> </parent> <modelVersion>4.0.0</modelVersion> <artifactId>mybatis-01</artifactId> <dependencies> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.5.2</version> </dependency> </dependencies> <build> <!--Maven靜態資源過濾問題--> <resources> <resource> <directory>src/main/resources</directory> <includes> <include>**/*.properties</include> <include>**/*.xml</include> </includes> <filtering>true</filtering> </resource> <resource> <directory>src/main/java</directory> <includes> <include>**/*.poroperties</include> <include>**/*.xml</include> </includes> <filtering>true</filtering> </resource> </resources> </build> </project>
<?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?useSSL=false&useUnicode=true&characterEncoding=UTF-8"/> <property name="username" value="root"/> <property name="password" value="****"/> </dataSource> </environment> </environments> <mappers> <mapper resource="com/qijian/dao/UserMapper.xml"/> </mappers> </configuration>
注意: XML 頭部的聲明,它用來驗證 XML 文檔的正確性。environment 元素體中包含了事務管理和鏈接池的配置。mappers 元素則包含了一組映射器(mapper),這些映射器的 XML 映射文件包含了 SQL 代碼和映射定義信息。mysql
MybatisUtils工具類.sql
package com.qijian.utils; 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 java.io.IOException; import java.io.InputStream; public class MybatisUtils { private static SqlSessionFactory sqlSessionFactory; private static String resource = "mybatis-Config.xml"; private static InputStream inputStream; static { //使用mybatis的第一步:獲取 SqlSessionFactory對象 try { inputStream = Resources.getResourceAsStream(resource); sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); } catch (IOException e) { e.printStackTrace(); } } //既然有了 SqlSessionFactory,顧名思義,咱們能夠從中得到 SqlSession 的實例。 // SqlSession 提供了在數據庫執行 SQL 命令所需的全部方法。 public static SqlSession getSqlSession() throws IOException { return sqlSessionFactory.openSession(); } }
package com.qijian.pojo; public class User { private int id; private String name; private String pwd; @Override public String toString() { return "User{" + "id=" + id + ", name='" + name + '\'' + ", pwd='" + pwd + '\'' + '}'; } public User(int id, String name, String pwd) { this.id = id; this.name = name; this.pwd = pwd; } public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getPwd() { return pwd; } public void setPwd(String pwd) { this.pwd = pwd; } }
package com.qijian.dao; import com.qijian.pojo.User; import java.util.List; import java.util.Map; public interface UserMapper { //查詢全部的用戶 //@Select("SELECT * FROM mybatis.user WHERE id = #{id}") List<User> getUserList(); //經過id查詢用戶 User getUserById(int id); //增長用戶 int addUser(User user); //添加用戶 使用Map集合 int addUserByMap(Map<String,Object> map); //修改用戶 int updateUser(User user); //刪除用戶 void deleteUser(int id); }
<?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.qijian.dao.UserMapper"> <select id="getUserList" resultType="com.qijian.pojo.User"> select * from mybatis.user </select> <select id="getUserById" parameterType="int" resultType="com.qijian.pojo.User"> select *from mybatis.user where id = #{id}; </select> <insert id="addUser" parameterType="com.qijian.pojo.User"> insert into mybatis.user(id,name,pwd) values(#{id},#{name},#{pwd}); </insert> <insert id="addUserByMap" parameterType="Map"> insert into mybatis.user(id,name,pwd) values(#{id},#{name},#{pwd}); </insert> <update id="updateUser" parameterType="com.qijian.pojo.User"> update mybatis.user set name = #{name},pwd = #{pwd} where id=#{id}; </update> <delete id="deleteUser" parameterType="int"> delete from mybatis.user where id=#{id}; </delete> </mapper>
注意:
對命名空間的一點補充
在以前版本的 MyBatis 中,命名空間(Namespaces)的做用並不大,是可選的。 但如今,隨着命名空間愈加重要,你必須指定命名空間。
命名空間的做用有兩個,一個是利用更長的全限定名來將不一樣的語句隔離開來,同時也實現了你上面見到的接口綁定。就算你以爲暫時用不到接口綁定,你也應該遵循這裏的規定,以防哪天你改變了主意。 長遠來看,只要將命名空間置於合適的 Java 包命名空間之中,你的代碼會變得更加整潔,也有利於你更方便地使用 MyBatis。
命名解析:爲了減小輸入量,MyBatis 對全部具備名稱的配置元素(包括語句,結果映射,緩存等)使用了以下的命名解析規則。
全限定名(好比 「com.mypackage.MyMapper.selectAllThings)將被直接用於查找及使用。
短名稱(好比 「selectAllThings」)若是全局惟一也能夠做爲一個單獨的引用。 若是不惟一,有兩個或兩個以上的相同名稱(好比 「com.foo.selectAllThings」 和 「com.bar.selectAllThings」),那麼使用時就會產生「短名稱不惟一」的錯誤,這種狀況下就必須使用全限定名。
8. 測試類數據庫
package com.qijian.dao; import com.qijian.pojo.User; import com.qijian.utils.MybatisUtils; import org.apache.ibatis.session.SqlSession; import org.junit.Test; import java.io.IOException; import java.util.HashMap; import java.util.List; import java.util.Map; public class UserMapperTest { @Test public void testSelect() throws IOException { //第一步:獲取sqlsesion對象 SqlSession sqlSession = MybatisUtils.getSqlSession(); //執行 UserMapper userMapper = sqlSession.getMapper(UserMapper.class); List<User> userList = userMapper.getUserList(); for(User user : userList){ System.out.println(user); } //關閉資源 sqlSession.close(); } @Test public void testSelectById() throws IOException { //獲取sqlSession對象 SqlSession sqlSession = MybatisUtils.getSqlSession(); //執行 UserMapper userMapper = sqlSession.getMapper(UserMapper.class); User user = userMapper.getUserById(1); System.out.println(user); sqlSession.close(); } // 注意增刪改差須要提交事務 @Test public void testAddUser() throws IOException { SqlSession sqlSession = MybatisUtils.getSqlSession(); UserMapper userMapper = sqlSession.getMapper(UserMapper.class); int res = userMapper.addUser(new User(7,"herry","123")); if (res>0){ System.out.println("插入成功!"); } //提交事務 sqlSession.commit(); sqlSession.close(); } @Test public void testUpdateUser() throws IOException { SqlSession sqlSession = MybatisUtils.getSqlSession(); sqlSession.getMapper(UserMapper.class).updateUser(new User(3,"qijian","111")); sqlSession.commit(); sqlSession.close(); } @Test public void testDeleteUser() throws IOException { SqlSession sqlSession = MybatisUtils.getSqlSession(); UserMapper userMapper = sqlSession.getMapper(UserMapper.class); userMapper.deleteUser(7); sqlSession.commit(); sqlSession.close(); } @Test public void testAddByMap() throws IOException { SqlSession sqlSession = MybatisUtils.getSqlSession(); UserMapper userMapper = sqlSession.getMapper(UserMapper.class); //空過Map能夠很方便的插入數據 // 假設,咱們的實體類,或者數據庫中的表,字段或者參數過多,咱們應當使用Map Map<String,Object> map = new HashMap<String, Object>(); map.put("id",8); map.put("name","wangwu"); map.put("pwd","1234"); userMapper.addUserByMap(map); sqlSession.commit(); sqlSession.close(); } // Map中傳遞參數,直接在SQL中取出key // 對象傳遞參數,直接在SQL中取對象的屬性 // 只有一個基本類型參數的狀況下,能夠直接在SQL中取到 // 多參數用Map }
在該項目的搭建中遇到的問題以下:apache