初入简单介绍:
MyBatis框架主要是围绕着SqlSessionFactory这个类进行的:
SqlSessionFactory是一个sql会话工厂,在这个工厂里面取得一个session会话丢给客户端使用。可以理解为,session是由SqlSessionFactory制造的,需要session的时候直接去工厂里面拿一个,用完了还回来。
sqlSessionFactory是ORM框架Hibernate一个数据库session的连接工厂配置,更像一种连接池管理类,每次的数据操作都将由连接池来分配连接后进行。
需要导入hibernater的相关的jiar包: 地址: https://github.com/zjllovecode/SSH-
这个sqlSessionFactory的创建过程如下几种方法:
- 定义一个Configuration对象,其中包含数据源、事务、mapper文件资源以及影响数据库行为属性设置settings
- 通过配置对象,则可以创建一个SqlSessionFactoryBuilder对象
- 通过 SqlSessionFactoryBuilder 获得SqlSessionFactory 的实例。
- 通过与Spring集成,由Spring容器管理创建
一、通过Configuration.xml配置文件进行创建 1.配置文件: <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd"> <configuration> <properties resource="ssm/jdbc.properties"></properties> <environments default="development"> <environment id="development"> <transactionManager type="JDBC" /> <dataSource type="POOLED"> <property name="driver" value="${jdbc.driverClassName}"/> <property name="url" value="${jdbc.url}"/> <property name="username" value="${jdbc.username}"/> <property name="password" value="${jdbc.password}"/> </dataSource> </environment> </environments>
<mappers>
<mapper resource="mapper/User.xml"/>
</mappers>
</configuration>
2.读取配置文件: import java.io.IOException; import java.io.Reader; 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 com.sm.model.User; public class GetSqlSessionFactoryFromXML { public static void main(String[] args) throws IOException { //配置文件的名称 String resource = "ssm/configuration.xml"; //通过Mybatis包中的Resources对象很轻松的获取到配置文件 Reader reader = Resources.getResourceAsReader(resource); //通过SqlSessionFactoryBuilder创建 SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader); //获得session实例 SqlSession session =sqlSessionFactory.openSession(); User user = new User(); user.setId(8); //完成数据库的插入 session.insert("add", user); session.commit(); session.close(); System.out.println(sqlSessionFactory); } }
三、通过与Spring集成,由Spring容器管理创建 1. 在spring的配置文件applicationContext.xml中配置 <bean id="sessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> <property name="dataSource" ref="dataSource" /> <property name="configLocation" value="classpath*:conf/configuration.xml"/> </bean>
mysql自增主键返回:
查询id的sql:SELECT LAST_INSERT_ID()
通过修改User.xml映射文件,可以将mysql自增主键返回,如下添加selectKey 标签:
修改上面的user.xml如下:
<insert id="addUser" parameterType="com.yyb.pojo.User" > <!-- selectKey 标签实现主键返回 --> <!-- keyColumn:主键对应的表中的哪一列 --> <!-- keyProperty:主键对应的pojo中的哪一个属性 --> <!-- order:设置在执行insert语句前执行查询id的sql,该值在执行insert语句之后执行查询id的sql --> <!-- resultType:设置返回的id的类型 --> <selectKey keyColumn="id" keyProperty="id" order="AFTER" resultType="int"> SELECT LAST_INSERT_ID() </selectKey> INSERT into USER(username,birthday,address,sex) VALUES (#{username},#{birthday},#{address},#{sex}) </insert>
-----------执行完后,取值即可 : System.out.println(user.getId());
mybatis查询的2方式:
第一种:原始dao开发。存在重复代码。
package cn.itcast.mybatis.po; import java.io.Serializable; import java.util.Date; public class User implements Serializable { /** * */ private static final long serialVersionUID = 1L; private Integer id; private String username;// 用户姓名 private String sex;// 性别 private Date birthday;// 生日 private String 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 String getSex() { return sex; } public void setSex(String sex) { this.sex = sex; } public Date getBirthday() { return birthday; } public void setBirthday(Date birthday) { this.birthday = birthday; } public String getAddress() { return address; } public void setAddress(String address) { this.address = address; } @Override public String toString() { return "User [id=" + id + ", username=" + username + ", sex=" + sex + ", birthday=" + birthday + ", address=" + address + "]"; } }
4、在resources下加入log4j.properties和SqlMapConfig.xml配置文件
mybatis默认使用log4j作为输出日志信息。log4j.properties配置如下:
# Global logging configuration log4j.rootLogger=DEBUG, stdout # Console output... log4j.appender.stdout=org.apache.log4j.ConsoleAppender log4j.appender.stdout.layout=org.apache.log4j.PatternLayout log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n
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> <!-- 和spring整合后 environments配置将废除 --> <environments default="development"> <environment id="development"> <!-- 使用jdbc事务管理 --> <transactionManager type="JDBC" /> <!-- 数据库连接池 --> <dataSource type="POOLED"> <property name="driver" value="com.mysql.jdbc.Driver" /> <property name="url" value="jdbc:mysql://192.168.1.20:3306/test?" /> <property name="username" value="root" /> <property name="password" value="root123" /> </dataSource> </environment> </environments> <mappers> <mapper resource="mapper/User.xml"/> </mappers> </configuration>
在resources下创建一个mapper文件夹,添加User.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"> <!-- namespace:命名空间,用于隔离sql,还有一个很重要的作用,后面会讲 --> <mapper namespace="test"> <!-- id:statement的id 或者叫做sql的id--> <!-- parameterType:声明输入参数的类型 --> <!-- resultType:声明输出结果的类型,应该填写pojo的全路径 --> <!-- #{}:输入参数的占位符,相当于jdbc的? --> <select id="queryUserById" parameterType="int" resultType="com.yyb.pojo.User"> SELECT * FROM user WHERE id = #{id} </select> </mapper>
测试:创建一个sqlsession来执行查询语句:
public class Test { @org.junit.Test public void func1() { String path = "SqlMapConfig.xml"; InputStream resourceAsStream = null; try { // 1. 加载SqlMapConfig.xml配置文件 resourceAsStream = Resources.getResourceAsStream(path); } catch (IOException e) { e.printStackTrace(); } // 2. 创建SqlSessionFactory对象 SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream); //3. 创建SqlSession对象 SqlSession sqlSession = sqlSessionFactory.openSession(); // 4. 执行SqlSession对象执行查询,获取结果User // 第一个参数是User.xml的statement的id,第二个参数是执行sql需要的参数; Object user = sqlSession.selectOne("test.queryUserById", 1); // 5. 打印结果 System.out.println(user); // 6. 释放资源 sqlSession.close(); } }
第二种:Mapper动态代理方式:
:Mapper接口开发方法只需要程序员编写Mapper接口(相当于Dao接口),由Mybatis框架根据接口定义创建接口的动态代理对象规则。
比如: //遵循四个原则:
public interface UserMapper { //接口方法名 == User.xml中id名 //返回值类型 与 Mapper.xml文件中返回值类型要一致 //入参类型 与 Mapper.xml中入参的类型要一致 //命名空间 绑定此接口 public User findUserById(Integer id); }
mapper文件如下:
<?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"> <!-- 写Sql语句 --> <mapper namespace="com.itheima.mybatis.mapper.UserMapper"> <!-- 通过ID查询一个用户 --> <select id="findUserById" parameterType="Integer" resultType="cn.itcast.mybatis.po.User"> select * from user where id = #{id} </select> </mapper>
resources文件夹下面的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> <typeAliases> <typeAlias type="cn.itcast.mybatis.po.User" alias="User" /> <typeAlias type="com.yyb.pojo.QueryVo" alias="QueryVo" /> </typeAliases> <!-- 和spring整合后 environments配置将废除 --> <environments default="development"> <environment id="development"> <!-- 使用jdbc事务管理 --> <transactionManager type="JDBC" /> <!-- 数据库连接池 --> <dataSource type="POOLED"> <property name="driver" value="com.mysql.jdbc.Driver" /> <property name="url" value="jdbc:mysql://192.168.1.20:3306/test?" /> <property name="username" value="root" /> <property name="password" value="root123" /> </dataSource> </environment> </environments> <!--resources下面的mapper文件夹下面的,生成一个mapper.xml --> <mappers> <mapper resource="mapper/UserMapper.xml"/> </mappers> </configuration>
测试类:
@Test public void testMapper() throws Exception { //加载核心配置文件 String resource = "sqlMapConfig.xml"; InputStream in = Resources.getResourceAsStream(resource); //创建SqlSessionFactory SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(in); //创建SqlSession SqlSession sqlSession = sqlSessionFactory.openSession(); //SqlSEssion帮我生成一个实现类 (给接口) UserMapper userMapper = sqlSession.getMapper(UserMapper.class); User user = userMapper.findUserById(10); System.out.println(user); }
SqlMapConfig.xml配置文件:
SqlMapConfig.xml中配置的内容和顺序如下:
- properties(属性)
- settings(全局配置参数)
- typeAliases(类型别名)
- typeHandlers(类型处理器)
- objectFactory(对象工厂)
- plugins(插件)
- environments(环境集合属性对象)
- environment(环境子属性对象)
- transactionManager(事务管理)
- dataSource(数据源)
- mappers(映射器)
例如:
<typeAliases> <!-- 单个别名定义 --> <typeAlias alias="user" type="cn.itcast.mybatis.pojo.User" /> <!-- 批量别名定义,扫描整个包下的类,别名为类名(大小写不敏感) --> <package name="cn.itcast.mybatis.pojo" /> </typeAliases>
<!-- 1.加载映射文件 -->
<mappers>
<!-- 扫描mappers路径下的mapper映射文件 -->
<mapper resource="mappers/UserMapper.xml"/>
<!-- 扫描包下的接口文件 --> <!-- 批量注册mapper: -->
<package name="edu.zju.bme.data.manage.mapper" />
</mappers>
<!-- 2.或者:mapper扫描 -->
<property name="mapperLocations" value="classpath:mybatis/*/*.xml"></property>
例如:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD SQL Map Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd"> <configuration> <settings> <setting name="cacheEnabled" value="true" /><!-- 全局映射器启用缓存 --> <setting name="useGeneratedKeys" value="true" /> <setting name="defaultExecutorType" value="REUSE" /> <!--设置启用数据库字段下划线映射到java对象的驼峰式命名属性,默认为false--> <setting name="mapUnderscoreToCamelCase" value="true"/> </settings> <typeAliases> 别名: <typeAlias type="com.fh.entity.system.User" alias="User" /> <typeAlias type="com.fh.entity.system.Role" alias="Role" /> <typeAlias type="com.fh.entity.system.Menu" alias="Menu" /> <typeAlias type="com.fh.entity.system.MenuList" alias="MenuList" /> <typeAlias type="com.fh.entity.system.Operator" alias="Operator" /> <typeAlias type="com.fh.util.PageData" alias="pd" /> <!-- 分页 --> <typeAlias type="com.fh.entity.Page" alias="Page" /> </typeAliases> <plugins> <plugin interceptor="com.fh.plugin.PagePlugin"> <property name="dialect" value="mysql" /> <property name="pageSqlId" value=".*listPage.*" /> </plugin> </plugins> </configuration>
Mapper配置的几种方法:
1、<mapper resource=" " />,使用相对于类路径的资源(现在的使用方式)。如: <mappers> <mapper resource="sqlmap/User.xml" /></mappers>
2、<mapper class=" " />,使用mapper接口类路径。如:<mappers> <mapper class="cn.itcast.mybatis.mapper.UserMapper"/></mappers>。注意:此种方法要求mapper接口名称和mapper映射文件名称相同,且放在同一个目录中(使用maven的话,要把xml放到resource目录下,路径要和mapper对应)。
3、<package name=""/>,注册指定包下的所有mapper接口。如:<mappers><package name="cn.itcast.mybatis.mapper"/></mappers>。注意:此种方法要求mapper接口名称和mapper映射文件名称相同,且放在同一个目录中(使用maven的话,要把xml放到resource目录下,路径要和mapper对应)。
4.在spring的applicationContext.xml中配置全局扫描mapper:
<!-- mapper扫描 -->
<property name="mapperLocations" value="classpath:mybatis/*/*.xml"></property>
一般的原因是Mapper 错误检查:
按以下步骤一一执行:
1:检查xml文件所在的package名称是否和interface对应的package名称一一对应
2:检查xml文件的namespace是否和xml文件的package名称一一对应
3:检查函数名称能否对应上
4:去掉xml文件中的中文注释
5:随意在xml文件中加一个空格或者空行然后保存
一般来说到此就可以排除错误了