一、Mybatis的CRUD操作: xml文件中id表示方法名,resultype表示sql语句返回值类型,parametertype表示传参类型
select 1 2 3 4 List<User> getUserList () ; User getUserById (int id) ;
1 2 3 4 5 6 7 <select id ="getUserList" resultType ="pojo.User" > select * from user </select > <select id ="getUserById" resultType ="pojo.User" parameterType ="int" > select * from mybatis.user where id = #{id} </select >
测试:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 @Test public void test () { SqlSession sqlSession = MybatisUtils.getSqlSession(); UserMapper mapper = sqlSession.getMapper(UserMapper.class); List<User> userList = mapper.getUserList(); System.out.println(userList); sqlSession.close(); } @Test public void test2 () { SqlSession sqlSession = MybatisUtils.getSqlSession(); UserMapper mapper = sqlSession.getMapper(UserMapper.class); User user = mapper.getUserById(1 ); System.out.println(user); sqlSession.close(); }
insert 1 2 int addUser (User user) ;
1 2 3 <insert id ="addUser" parameterType ="pojo.User" > insert into mybatis.user(id,name,pwd) values (#{id},#{name},#{pwd}) </insert >
测试:
1 2 3 4 5 6 7 8 9 10 11 @Test public void test3 () { SqlSession sqlSession = MybatisUtils.getSqlSession(); UserMapper mapper = sqlSession.getMapper(UserMapper.class); int i = mapper.addUser(new User(4 , "haha" , "123333" )); System.out.println(i); sqlSession.commit(); sqlSession.close(); }
注意:增删改操作必须提交事务(sqlsession.commit)
update 1 2 int updateUser (User user) ;
xml:
1 2 3 <update id ="updateUser" parameterType ="pojo.User" > update mybatis.user set name = #{name},pwd=#{pwd} where id = #{id} </update >
测试:
1 2 3 4 5 6 7 8 @Test public void test4 () { SqlSession sqlSession = MybatisUtils.getSqlSession(); UserMapper mapper = sqlSession.getMapper(UserMapper.class); mapper.updateUser(new User(4 ,"hehe" ,"123123" )); sqlSession.commit(); sqlSession.close(); }
delete 1 2 int deleteUser (int id) ;
xml:
1 2 3 <delete id ="deleteUser" parameterType ="int" > delete from mybatis.user where id = #{id} </delete >
测试:
1 2 3 4 5 6 7 8 @Test public void test5 () { SqlSession sqlSession = MybatisUtils.getSqlSession(); UserMapper mapper = sqlSession.getMapper(UserMapper.class); mapper.deleteUser(4 ); sqlSession.commit(); sqlSession.close(); }
二、使用map随意构造参数: 传参传入map:
1 2 int addUser2 (Map<String,Object> map) ;
xml中:
1 2 3 <insert id ="addUser2" parameterType ="map" > insert into mybatis.user(id,name,pwd) values (#{userid},#{username},#{password}) </insert >
传入的参数名可以随便取
测试:
1 2 3 4 5 6 7 8 9 10 11 12 @Test public void test6 () { SqlSession sqlSession = MybatisUtils.getSqlSession(); UserMapper mapper = sqlSession.getMapper(UserMapper.class); HashMap<String, Object> map = new HashMap<String, Object>(); map.put("userid" ,5 ); map.put("username" ,"hahha" ); map.put("password" ,"123465" ); mapper.addUser2(map); sqlSession.commit(); sqlSession.close(); }
map传递参数,直接在sql中取出key
对象传递参数,直接在sql中取对象的属性
只有一个基本类型参数可以直接在sql中取
多个参数用map或者注解
三、进行模糊查询 1 2 List<User> getUserLike (String value) ;
1 2 3 <select id ="getUserLike" resultType ="pojo.User" > select * from mybatis.user where name like #{value} </select >
测试:
1 2 3 4 5 6 7 8 9 10 @Test public void test7 () { SqlSession sqlSession = MybatisUtils.getSqlSession(); UserMapper mapper = sqlSession.getMapper(UserMapper.class); List<User> users = mapper.getUserLike("%李%" ); for (User user:users){ System.out.println(user); } sqlSession.close(); }
四、一些配置解析 一、核心配置文件
二、environment 1 2 3 4 5 6 7 8 9 10 11 <environments default ="development" > <environment id ="development" > <transactionManager type ="JDBC" /> <dataSource type ="POOLED" > <property name ="driver" value ="com.mysql.cj.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 ="root" /> </dataSource > </environment > </environments >
MyBatis 可以配置成适应多种环境,这种机制有助于将 SQL 映射应用于多种数据库之中, 现实情况下有多种理由需要这么做。例如,开发、测试和生产环境需要有不同的配置;或者想在具有相同 Schema 的多个生产数据库中使用相同的 SQL 映射。还有许多类似的使用场景。
不过要记住:尽管可以配置多个环境,但每个 SqlSessionFactory 实例只能选择一种环境
注意一些关键点:
默认使用的环境 ID(比如:default=”development”)。
每个 environment 元素定义的环境 ID(比如:id=”development”)。
事务管理器的配置(比如:type=”JDBC”)。
数据源的配置(比如:type=”POOLED”)。
默认环境和环境 ID 顾名思义。 环境可以随意命名,但务必保证默认的环境 ID 要匹配其中一个环境 ID。
在 MyBatis 中有两种类型的事务管理器(也就是 type=”[JDBC|MANAGED]”):
JDBC – 这个配置直接使用了 JDBC 的提交和回滚设施,它依赖从数据源获得的连接来管理事务作用域。
MANAGED – 这个配置几乎没做什么。它从不提交或回滚一个连接,而是让容器来管理事务的整个生命周期(比如 JEE 应用服务器的上下文)。 默认情况下它会关闭连接。然而一些容器并不希望连接被关闭,因此需要将 closeConnection 属性设置为 false 来阻止默认的关闭行为。
数据源(dataSource)
dataSource 元素使用标准的 JDBC 数据源接口来配置 JDBC 连接对象的资源。
大多数 MyBatis 应用程序会按示例中的例子来配置数据源。虽然数据源配置是可选的,但如果要启用延迟加载特性,就必须配置数据源。
有三种内建的数据源类型(也就是 type=”[UNPOOLED|POOLED|JNDI]”)
UNPOOLED – 这个数据源的实现会每次请求时打开和关闭连接。
POOLED – 这种数据源的实现利用“池”的概念将 JDBC 连接对象组织起来,避免了创建新的连接实例时所必需的初始化和认证时间。
JNDI – 这个数据源实现是为了能在如 EJB 或应用服务器这类容器中使用,容器可以集中或在外部配置数据源,然后放置一个 JNDI 上下文的数据源引用。
三、Mappers 既然 MyBatis 的行为已经由上述元素配置完了,我们现在就要来定义 SQL 映射语句了。 但首先,我们需要告诉 MyBatis 到哪里去找到这些语句。 在自动查找资源方面,Java 并没有提供一个很好的解决方案,所以最好的办法是直接告诉 MyBatis 到哪里去找映射文件。 你可以使用相对于类路径的资源引用,或完全限定资源定位符(包括 file:///
形式的 URL),或类名和包名等。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 <mappers > <mapper resource ="org/mybatis/builder/AuthorMapper.xml" /> <mapper resource ="org/mybatis/builder/BlogMapper.xml" /> <mapper resource ="org/mybatis/builder/PostMapper.xml" /> </mappers > <mappers > <mapper url ="file:///var/mappers/AuthorMapper.xml" /> <mapper url ="file:///var/mappers/BlogMapper.xml" /> <mapper url ="file:///var/mappers/PostMapper.xml" /> </mappers > <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 >
四、properties 可导入外部文件:
1 2 3 4 <properties resource ="org/mybatis/example/config.properties" > <property name ="username" value ="dev_user" /> <property name ="password" value ="F2Fa3!33TYyg" /> </properties >
使用内部文件:
1 2 3 4 5 6 <dataSource type ="POOLED" > <property name ="driver" value ="com.mysql.cj.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 ="root" /> </dataSource >
使用外部文件时,引入文件内的优先级大于外部配置的优先级
五、typeAliases起别名 1 2 3 4 5 6 7 8 <typeAliases > <typeAlias alias ="Author" type ="domain.blog.Author" /> <typeAlias alias ="Blog" type ="domain.blog.Blog" /> <typeAlias alias ="Comment" type ="domain.blog.Comment" /> <typeAlias alias ="Post" type ="domain.blog.Post" /> <typeAlias alias ="Section" type ="domain.blog.Section" /> <typeAlias alias ="Tag" type ="domain.blog.Tag" /> </typeAliases >
当这样配置时,Blog
可以用在任何使用 domain.blog.Blog
的地方。
也可以指定一个包名,MyBatis 会在包名下面搜索需要的 Java Bean,比如:
1 2 3 <typeAliases > <package name ="domain.blog" /> </typeAliases >
每一个在包 domain.blog
中的 Java Bean,在没有注解的情况下,会使用 Bean 的首字母小写的非限定类名来作为它的别名。 比如 domain.blog.Author
的别名为 author
;若有注解,则别名为其注解值。见下面的例子:
1 2 3 4 5 6 7 8 9 ackage pojo; import org.apache.ibatis.type.Alias;@Alias("user") public class User { private int id; private String name; private String pwd;
可在官网查看mybatis一些默认的类型别名
六、settings 一个配置完整的 settings 元素的示例如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 <settings > <setting name ="cacheEnabled" value ="true" /> <setting name ="lazyLoadingEnabled" value ="true" /> <setting name ="multipleResultSetsEnabled" value ="true" /> <setting name ="useColumnLabel" value ="true" /> <setting name ="useGeneratedKeys" value ="false" /> <setting name ="autoMappingBehavior" value ="PARTIAL" /> <setting name ="autoMappingUnknownColumnBehavior" value ="WARNING" /> <setting name ="defaultExecutorType" value ="SIMPLE" /> <setting name ="defaultStatementTimeout" value ="25" /> <setting name ="defaultFetchSize" value ="100" /> <setting name ="safeRowBoundsEnabled" value ="false" /> <setting name ="mapUnderscoreToCamelCase" value ="false" /> <setting name ="localCacheScope" value ="SESSION" /> <setting name ="jdbcTypeForNull" value ="OTHER" /> <setting name ="lazyLoadTriggerMethods" value ="equals,clone,hashCode,toString" /> </settings >
重点关注一下三个:
cacheEnabled
全局性地开启或关闭所有映射器配置文件中已配置的任何缓存。
true | false
true
lazyLoadingEnabled
延迟加载的全局开关。当开启时,所有关联对象都会延迟加载。 特定关联关系中可通过设置 fetchType
属性来覆盖该项的开关状态。
true | false
false
mapUnderscoreToCamelCase
是否开启驼峰命名自动映射,即从经典数据库列名 A_COLUMN 映射到经典 Java 属性名 aColumn。
true | false
False
logImpl
指定 MyBatis 所用日志的具体实现,未指定时将自动查找。
SLF4J | LOG4J | LOG4J2 | JDK_LOGGING | COMMONS_LOGGING | STDOUT_LOGGING | NO_LOGGING
未设置