Mybatis简单应用
Posted 大-雄
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Mybatis简单应用相关的知识,希望对你有一定的参考价值。
Mybatis的核心组件:
- SqlSeeeionFactoryBuilder (构建器):它会根据配置或者代码来生成SqlSessionFactory,采用的是分布构建的Builder模式;
- SqlSessionFactory:依靠它来生成SqlSession,使用的是工厂模式。
- SqlSession(会话)发送SQL执行并返回结果,也可以获取Mapper接口。
- SQL Mapper(映射器): 由一个java接口和XML文件(或注解)构成,需要给出SQL的映射规则。它负责发送SQL去执行返回结果。
1.使用XML:mybatis-config.xml创建SqlSessionFactory的配置;
<?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 alias="role" type="com.learn.ssm.chapter3.pojo.Role"/> </typeAliases> <!-- 数据库环境 --> <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/ssm"/> <property name="username" value="root"/> <property name="password" value="admin123"/> </dataSource> </environment> </environments> <!-- 映射文件 --> <mappers> <mapper resource="com/learn/ssm/chapter3/mapper/RoleMapper.xml"/> <mapper class="com.learn.ssm.chapter3.mapper.RoleMapper2"/> </mappers> </configuration>
1.1 使用代码或xml创建SqlSessionFactory
package com.learn.ssm.chapter3.utils; import java.io.IOException; import java.io.InputStream; import org.apache.ibatis.datasource.pooled.PooledDataSource; import org.apache.ibatis.io.Resources; import org.apache.ibatis.mapping.Environment; import org.apache.ibatis.session.Configuration; import org.apache.ibatis.session.SqlSession; import org.apache.ibatis.session.SqlSessionFactory; import org.apache.ibatis.session.SqlSessionFactoryBuilder; import org.apache.ibatis.transaction.TransactionFactory; import org.apache.ibatis.transaction.jdbc.JdbcTransactionFactory; import com.learn.ssm.chapter3.mapper.RoleMapper; import com.learn.ssm.chapter3.mapper.RoleMapper2; import com.learn.ssm.chapter3.pojo.Role; public class SqlSessionFactoryUtils { private final static Class<SqlSessionFactoryUtils> LOCK = SqlSessionFactoryUtils.class; private static SqlSessionFactory sqlSessionFactory = null; private SqlSessionFactoryUtils() { } public static SqlSessionFactory getSqlSessionFactory() { synchronized (LOCK) { if (sqlSessionFactory != null) { return sqlSessionFactory; } String resource = "mybatis-config.xml"; InputStream inputStream; try { inputStream = Resources.getResourceAsStream(resource); sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); } catch (IOException e) { e.printStackTrace(); return null; } return sqlSessionFactory; } } //代码生成SqlSessionFactory public static SqlSessionFactory getSqlSessionFactory2() { synchronized (LOCK) { //数据库连接池信息 PooledDataSource dataSource = new PooledDataSource(); dataSource.setDriver("com.mysql.jdbc.Driver"); dataSource.setUsername("root"); dataSource.setPassword("admin123"); dataSource.setUrl("jdbc:mysql://localhost:3306/ssm"); dataSource.setDefaultAutoCommit(false); //采用MyBatis的JDBC事务方式 TransactionFactory transactionFactory = new JdbcTransactionFactory(); Environment environment = new Environment("development", transactionFactory, dataSource); //创建Configuration对象 Configuration configuration = new Configuration(environment); //注册一个MyBatis上下文别名 configuration.getTypeAliasRegistry().registerAlias("role", Role.class); //加入一个映射器 configuration.addMapper(RoleMapper.class); configuration.addMapper(RoleMapper2.class); //使用SqlSessionFactoryBuilder构建SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(configuration); return sqlSessionFactory; } } public static SqlSession openSqlSession() { if (sqlSessionFactory == null) { getSqlSessionFactory(); } return sqlSessionFactory.openSession(); } }
2. 映射器,由一个java接口和XML文件(或注解)构成
首先定义一个POJO
package com.learn.ssm.chapter3.pojo; public class Role { private Long id; private String roleName; private String note; /** setter and getter **/ public Long getId() { return id; } public void setId(Long id) { this.id = id; } public String getRoleName() { return roleName; } public void setRoleName(String roleName) { this.roleName = roleName; } public String getNote() { return note; } public void setNote(String note) { this.note = note; } }
2.1, 接口和XML实现映射
映射器接口:
public interface RoleMapper { public int insertRole(Role role); public int deleteRole(Long id); public int updateRole(Role role); public Role getRole(Long id); public List<Role> findRoles(String roleName); }
在XML创建SqlSession中有这样代码
<mapper resource="com/learn/ssm/chapter3/mapper/RoleMapper.xml"/>
引入XML(RoleMapper.xml)创建映射器(insert/select/update/delete)代表增/查/改/删
id 代表RoleMapper中方法名字
parameterType代表传入参数类型
resultType代表返回值 "role"是别名,代表<typeAlias alias="role" type="com.learn.ssm.chapter3.pojo.Role"/>
<?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.learn.ssm.chapter3.mapper.RoleMapper"> <insert id="insertRole" parameterType="role"> insert into t_role(role_name, note) values(#{roleName}, #{note}) </insert> <delete id="deleteRole" parameterType="long"> delete from t_role where id= #{id} </delete> <update id="updateRole" parameterType="role"> update t_role set role_name = #{roleName}, note = #{note} where id= #{id} </update> <select id="getRole" parameterType="long" resultType="role"> select id, role_name as roleName, note from t_role where id = #{id} </select> <select id="findRoles" parameterType="string" resultType="role"> select id, role_name as roleName, note from t_role where role_name like concat(‘%‘, #{roleName}, ‘%‘) </select> </mapper>
2.2注解实现映射器
XML中引入Mapper:
<mapper class="com.learn.ssm.chapter3.mapper.RoleMapper2"/>
public interface RoleMapper2 { @Select("select id, role_name as roleName, note from t_role where id=#{id}") public Role getRole(Long id); @Insert("insert into t_role(role_name,note) values(#{roleName},#{note})") public void insertRole(Role role); }
注解不易于维护
3. 测试:
public class Chapter3Main { public static void main(String[] args) { testRoleMapper(); testRoleMapper2(); } //xml 测试 private static void testRoleMapper() { Logger log = Logger.getLogger(Chapter3Main.class); SqlSession sqlSession = null; try { sqlSession = SqlSessionFactoryUtils.openSqlSession(); RoleMapper roleMapper = sqlSession.getMapper(RoleMapper.class); Role role = roleMapper.getRole(1L); Role r1 = new Role(); r1.setRoleName("testRole name"); r1.setNote("note..."); roleMapper.insertRole(r1); sqlSession.commit(); log.info(role.getRoleName()); } catch(Exception ex) { sqlSession.rollback(); } finally { if (sqlSession != null) { sqlSession.close(); } } } //注解SQL测试 private static void testRoleMapper2() { Logger log = Logger.getLogger(Chapter3Main.class); SqlSession sqlSession = null; try { sqlSession = SqlSessionFactoryUtils.openSqlSession(); RoleMapper2 roleMapper2 = sqlSession.getMapper(RoleMapper2.class); Role role = roleMapper2.getRole(1L); Role r1 = new Role(); r1.setRoleName("testRole name map2"); r1.setNote("note..."); roleMapper2.insertRole(r1); sqlSession.commit(); log.info(role.getRoleName()); } catch(Exception ex) { sqlSession.rollback(); } finally { if (sqlSession != null) { sqlSession.close(); } } } }
以上是关于Mybatis简单应用的主要内容,如果未能解决你的问题,请参考以下文章