视频观看地址:http://edu.51cto.com/course/14674.html?source=sohtml
以前咱们编写jdbc模板类中使用属性文件db.properties文件,在mybatis中也能够这样配置java
src目录下创建一个db.properties文件sql
db.driver=oracle.jdbc.driver.OracleDriver db.url=jdbc:oracle:thin:@127.0.0.1:1521:orcl db.username=scott db.password=tiger
接下来须要在mybatis-config.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> <properties resource="db.properties"/> <environments default="development"> <environment id="development"> <transactionManager type="JDBC"/> <dataSource type="POOLED"> <property name="driver" value="${db.driver}"/> <property name="url" value="${db.url}"/> <property name="username" value="${db.username}"/> <property name="password" value="${db.password}"/> </dataSource> </environment> </environments> <mappers> <mapper resource="UserMapper.xml"/> </mappers> </configuration>
接下来测试便可apache
是否开启自动驼峰命名规则(camel case)映射,即从经典数据库列名 A_COLUMN 到经典 Java 属性名 aColumn 的相似映射。 session
在mybatis中开启驼峰命名mybatis
<settings> <setting name="mapUnderscoreToCamelCase" value="true"/> </settings>
设置完毕后,咱们更改一个以前的sql,不采用别名的方式进行oracle
<select id = "selectAll" resultType="cn.org.kingdom.pojo.User"> select * from tb_user </select>
测试该方法,查看日志app
DEBUG - Opening JDBC Connection DEBUG - Created connection 532118459. DEBUG - Setting autocommit to false on JDBC Connection [oracle.jdbc.driver.T4CConnection@1fb77bbb] DEBUG - ==> Preparing: select * from tb_user DEBUG - ==> Parameters: DEBUG - <== Total: 4 User [userid=2, userName=张三, pwd=123456, age=10, sex=男, birthday=Mon Aug 13 10:07:55 CST 2018] User [userid=3, userName=李四, pwd=123456, age=10, sex=男, birthday=Mon Aug 13 10:07:55 CST 2018] User [userid=4, userName=王五, pwd=123456, age=10, sex=男, birthday=Mon Aug 13 10:07:55 CST 2018] User [userid=5, userName=赵六, pwd=123456, age=10, sex=男, birthday=Mon Aug 13 10:07:55 CST 2018] DEBUG - Resetting autocommit to true on JDBC Connection [oracle.jdbc.driver.T4CConnection@1fb77bbb] DEBUG - Closing JDBC Connection [oracle.jdbc.driver.T4CConnection@1fb77bbb] DEBUG - Returned connection 532118459 to pool.
可是有的时候,咱们的数据库的列的命名和实体类没有遵照驼峰命名,此时就须要咱们后面讲解resultMap类型来搞定dom
每一个mapper文件中关于resultType,parameterType这样的属性写全类名太麻烦,咱们能够经过此属性进行优化
在mybatis-config.xml中加入别名设置
单一设置:
<typeAlias type="cn.org.kingdom.pojo.User" alias="User"/>
扫描包设置:
<package name="cn.org.kingdom.pojo"/>
直接运行测试便可
类型处理器是在设置参数,以及从result中检索值来匹配java数据类型,MyBatis提供了很是多的默认类型处理器,知足咱们的开发要求。不须要自定义
类型处理器 | Java 类型 | JDBC 类型 |
---|---|---|
BooleanTypeHandler |
java.lang.Boolean , boolean |
数据库兼容的 BOOLEAN |
ByteTypeHandler |
java.lang.Byte , byte |
数据库兼容的 NUMERIC 或 BYTE |
ShortTypeHandler |
java.lang.Short , short |
数据库兼容的 NUMERIC 或 SHORT INTEGER |
IntegerTypeHandler |
java.lang.Integer , int |
数据库兼容的 NUMERIC 或 INTEGER |
LongTypeHandler |
java.lang.Long , long |
数据库兼容的 NUMERIC 或 LONG INTEGER |
FloatTypeHandler |
java.lang.Float , float |
数据库兼容的 NUMERIC 或 FLOAT |
DoubleTypeHandler |
java.lang.Double , double |
数据库兼容的 NUMERIC 或 DOUBLE |
BigDecimalTypeHandler |
java.math.BigDecimal |
数据库兼容的 NUMERIC 或 DECIMAL |
StringTypeHandler |
java.lang.String |
CHAR , VARCHAR |
ClobReaderTypeHandler |
java.io.Reader |
- |
ClobTypeHandler |
java.lang.String |
CLOB , LONGVARCHAR |
NStringTypeHandler |
java.lang.String |
NVARCHAR , NCHAR |
NClobTypeHandler |
java.lang.String |
NCLOB |
BlobInputStreamTypeHandler |
java.io.InputStream |
- |
ByteArrayTypeHandler |
byte[] |
数据库兼容的字节流类型 |
BlobTypeHandler |
byte[] |
BLOB , LONGVARBINARY |
DateTypeHandler |
java.util.Date |
TIMESTAMP |
DateOnlyTypeHandler |
java.util.Date |
DATE |
TimeOnlyTypeHandler |
java.util.Date |
TIME |
SqlTimestampTypeHandler |
java.sql.Timestamp |
TIMESTAMP |
SqlDateTypeHandler |
java.sql.Date |
DATE |
SqlTimeTypeHandler |
java.sql.Time |
TIME |
ObjectTypeHandler |
Any | OTHER 或未指定类型 |
EnumTypeHandler |
Enumeration Type | VARCHAR-任何兼容的字符串类型,存储枚举的名称(而不是索引) |
EnumOrdinalTypeHandler |
Enumeration Type | 任何兼容的 NUMERIC 或 DOUBLE 类型,存储枚举的索引(而不是名称)。 |
InstantTypeHandler |
java.time.Instant |
TIMESTAMP |
LocalDateTimeTypeHandler |
java.time.LocalDateTime |
TIMESTAMP |
LocalDateTypeHandler |
java.time.LocalDate |
DATE |
LocalTimeTypeHandler |
java.time.LocalTime |
TIME |
OffsetDateTimeTypeHandler |
java.time.OffsetDateTime |
TIMESTAMP |
OffsetTimeTypeHandler |
java.time.OffsetTime |
TIME |
ZonedDateTimeTypeHandler |
java.time.ZonedDateTime |
TIMESTAMP |
YearTypeHandler |
java.time.Year |
INTEGER |
MonthTypeHandler |
java.time.Month |
INTEGER |
YearMonthTypeHandler |
java.time.YearMonth |
VARCHAR or LONGVARCHAR |
JapaneseDateTypeHandler |
java.time.chrono.JapaneseDate |
DATE |
开发环境:开发人员平常开发的时候使用的环境
测试环境:测试人员测试的时候使用环境
预发布环境:几乎和线上环境如出一辙,在上线以前在进行一次测试。
生成环境:线上环境。正式的 java 程序运行的环境
MyBatis容许配置多个环境,好比说开发环境,测试环境,生成环境,可是在构建SqlSessionFactory时只能选择一个,虽然这种方式也能够作到很方便的分离多个环境,可是在实际场景下咱们是更多的使用Spring来管理数据源,作到环境的分离
既然 MyBatis 的行为已经由上述元素配置完了,咱们如今就要定义 SQL 映射语句了。可是首先咱们须要告诉 MyBatis 到哪里去找到这些语句。 Java 在自动查找这方面没有提供一个很好的方法,因此最佳的方式是告诉 MyBatis 到哪里去找映射文件。你可使用相对于类路径的资源引用, 或彻底限定资源定位符(包括 file:/// 的 URL),或类名和包名等。例如:
1.使用相对于类路径的资源引用
<mappers> <mapper resource="org/mybatis/builder/AuthorMapper.xml"/> <mapper resource="org/mybatis/builder/BlogMapper.xml"/> <mapper resource="org/mybatis/builder/PostMapper.xml"/> </mappers>
2.使用彻底限定资源定位符(URL)
<mappers> <mapper url="file:///var/mappers/AuthorMapper.xml"/> <mapper url="file:///var/mappers/BlogMapper.xml"/> <mapper url="file:///var/mappers/PostMapper.xml"/> </mappers>
3.使用映射器接口实现类的彻底限定类名
<mappers> <mapper class="org.mybatis.builder.AuthorMapper"/> <mapper class="org.mybatis.builder.BlogMapper"/> <mapper class="org.mybatis.builder.PostMapper"/> </mappers>
四、映射器接口扫描包的方式
<mappers> <package name="org.mybatis.builder"/> </mappers>
在 mybatis 中 dao 层的接口名字不推荐使用Dao,而是修改为Mapper,例如 UserDao 修改为 UserMapper
因为在 dao(mapper)的实现类中对 sqlsession 的使用方式很相似。mybatis 提供了接口的动态代理
1.将dao包更改命名为cn.org.kingdom.mapper(可选)
2.将接口也改成xxMapper的形式(可选)
3.删除全部的dao类实现类(必须)由于此时咱们是经过动态代理的方式来生成其操做类
4.将映射文件放在mapper包下,而且将该映射文件名更改成接口的名字.xml
namespace:
根标签的 namespace 属性称为名称空间,若是但愿使用 mybatis 经过的动态代理的接口,就须要 namespace 中的值,和须要对应的Mapper(dao)接口的全路径一致
注意此时还须要保证咱们接口中的方法名和配置文件中的id名称保持一致
mapper接口实现
package cn.org.kingdom.mapper; import java.util.List; import cn.org.kingdom.pojo.User; public interface UserMapper { public int insertUser(User vo) throws Exception; public int updateUser(User vo) throws Exception ; public int deleteUser(int userid) throws Exception ; public User selectUserById(int userid) throws Exception ; public List<User> selectAll() throws Exception; public int getAllCounts() throws Exception ; }
将mapper.xml文件复制到mapper包中,而且将该文件的名称命名为Mapper接口的名字.xml(UserMapper.xml)
修改mybatis-config.xml文件
<mappers> <!-- <mapper resource="cn/org/kingdom/mapper/UserMapper.xml"/> --> <package name="cn.org.kingdom.mapper"/> </mappers>
测试类进行测试
package cn.org.kingdom.test; import java.io.InputStream; import java.util.Date; import java.util.List; 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 cn.org.kingdom.mapper.UserMapper; import cn.org.kingdom.pojo.User; public class MyBatisTest01 { SqlSessionFactory sqlSessionFactory = null ; SqlSession sqlSession = null ; UserMapper userMapper = null ; @Before public void setUp() throws Exception { //加载资源 String resource = "mybatis-config.xml"; InputStream inputStream = Resources.getResourceAsStream(resource); sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); sqlSession = sqlSessionFactory.openSession(); userMapper = sqlSession.getMapper(UserMapper.class); } @After public void tearDown() throws Exception { //关闭 sqlSession.close(); } @Test public void testInsertUser() { User vo = new User("阿珂", "123456", 18, "女", new Date()); try { userMapper.insertUser(vo); //提交事务 sqlSession.commit(); } catch (Exception e) { e.printStackTrace(); sqlSession.rollback(); } } @Test public void testUpdateUser() { User vo = new User(7,"冰封战神", "123456", 18, "男", new Date()); try { userMapper.updateUser(vo); //提交事务 sqlSession.commit(); } catch (Exception e) { e.printStackTrace(); sqlSession.rollback(); } } @Test public void testDeleteUserById() { int sid = 7 ; try { userMapper.deleteUser(sid); //提交事务 sqlSession.commit(); } catch (Exception e) { e.printStackTrace(); sqlSession.rollback(); } } @Test public void testSelectAll() throws Exception { List<User> list = userMapper.selectAll(); for (User user : list) { System.out.println(user); } } @Test public void testGetCount() throws Exception{ int count = userMapper.getAllCounts() ; System.out.println(count); } @Test public void testFindUserById() throws Exception{ User user = userMapper.selectUserById(2); System.out.println(user); } }
测试完成:
这里须要你们注意:必定要保证mapper接口中的方法名和mapper.xml中的id名称保持一致
mapper.xml中的namespace必须是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"> <!-- namespace:命名空間 (保證惟一) --> <mapper namespace="cn.org.kingdom.mapper.UserMapper"> <!-- id:保證惟一 --> <select id="selectUserById" resultType="User"> select userid,user_name as userName,age,pwd,sex,birthday from tb_user where userid = #{userid} </select> <insert id="insertUser" parameterType="User"> insert into tb_user(userid,user_name,age,pwd,sex,birthday) values(seq_user.nextval,#{userName},#{age},#{pwd},#{sex},#{birthday}) </insert> <update id="updateUser"> update tb_user set user_name=#{userName},age=#{age},pwd=#{pwd},sex=#{sex},birthday=#{birthday} where userid=#{userid} </update> <update id="deleteUser"> delete from tb_user where userid=#{userid} </update> <select id = "selectAll" resultType="User"> select * from tb_user </select> <select id = "getAllCounts" resultType="int"> select count(1) from tb_user </select> </mapper>