环境: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