<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd"> <configuration> <properties resource="jdbc.properties"/> <environments default="development"> <environment id="development"> <transactionManager type="JDBC" /> <dataSource type="POOLED"> <property name="driver" value="${jdbc.driver}" /> <property name="url" value="${jdbc.url}" /> <property name="username" value="${jdbc.username}" /> <property name="password" value="${jdbc.password}" /> </dataSource> </environment> </environments> <mappers> <mapper resource="com/neuedu/mapper/EmployeeMapper.xml" /> </mappers> </configuration>
- 建立测试用例,.复制mybatis官方文档代码,代码以下:java
public class TestMyBatis { @Test public void test() { String resource = "mybatis-config.xml"; InputStream inputStream = null; try { inputStream = Resources.getResourceAsStream(resource);//从配置文件中读取一个流 } catch (IOException e) { e.printStackTrace(); } //利用这个流建立一个sqlSessionFactory对象,也就是总控文件建立了这个对象 SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); //和数据库创建的一次会话,经过openSession,建立一个sqlsession对象 SqlSession sqlsession = sqlSessionFactory.openSession(); try { //selectOne查询一条记录,第一个参数时sql语句的惟一标识,第二个参数时sql要用的参数 //为了确保惟一标识惟一,因此在前面写上namespace,由于namesapce惟一 //若是第二个参数"4"在数据库中找不到的话,不会报错,返回null Object selectOne = sqlsession.selectOne("com.neuedu.MyBatis.EmployeeMapper.selectStudentById",4 ); System.out.println(selectOne); } finally { sqlsession.close(); } } }
- 建立sql语句的映射文件EmployeeMapper.xml;mysql
<mapper namespace="com.neuedu.MyBatis.EmployeeMapper"> <!-- namespace:名称空间,随便起一个名,可是要惟一 id:sql 语句的惟一标识 #{id}:接收参数传递过来的id值 resultType:将 sql语句返回成什么对象 --> <select id="selectStudentById" resultType="com.neuedu.entity.Employee"> select * from student where id = #{id} </select> </mapper>
HelloWorld----接口式编程 git
public interface EmployeeMapper { /* * 增删改查方法 * */ public Employee getEmployeeById(Integer id); }
- 经过mapper.xml的 namespace 相关联github
<mapper namespace="com.neuedu.mapper.EmployeeMapper"> <!-- namespace:将sql映射文件和Mapper接口进行关联 id:要和相对应的mapper接口的方法名保持一致 #{id}:从参数中获取id resultType:将 sql语句返回成什么对象 --> <!-- public Employee getEmployeeById(Integer id); --> <select id="getEmployeeById" resultType="com.neuedu.entity.Employee"> select * from student where id = #{id} </select> </mapper>
- sqlSession 对象表示服务器和数据库的一次会话,是一个非线程安全的,因此不能定义在类中,定义在类中,多线程的状况下会有多个线程共用,一次使用获取一次 ,保证时线程安全的spring
private SqlSessionFactory getSqlSessionFactory(){ String resource = "mybatis-config.xml"; InputStream inputStream = null; try { inputStream = Resources.getResourceAsStream(resource);//从配置文件中读取一个流 } catch (IOException e) { e.printStackTrace(); } //利用这个流建立一个sqlSessionFactory对象 SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); return sqlSessionFactory; }
- 测试sql
@Test public void test01(){ //1.获取sqlSessionFactory对象 SqlSessionFactory sqlSessionFactory = getSqlSessionFactory(); //2.利用sqlSessionFactory建立一个session对象,表示和数据库的一次会话 SqlSession session = sqlSessionFactory.openSession(); //3.用session对象获取mapper接口的代理对象 //由于sql映射文件给相应的接口建立了一个代理对象,因此mapper接口类不须要实现类 EmployeeMapper mapper = session.getMapper(EmployeeMapper.class); //经过mapper接口的代理对象就能够对数据库进行增删改查操做 Employee employee = mapper.getEmployeeById(4); System.out.println(employee); session.close(); }
之前都是须要为接口写一个实现类,可是此时,mybatis提供了接口能够与sql配置文件动态绑定!数据库
<!--将接口与xml文件进行绑定 --> EmployeeMapper employeeMapper = sqlSession.getMapper(EmployeeMapper.class);
<configuration> <!-- mybatis可使用properties来引入外部properties配置文件的内容 resource:引入类路径下的资源 url:引入网络路径或者磁盘路径下的资源 --> <properties resource="jdbc.properties"></properties> <environments default="development"> <environment id="development"> <transactionManager type="JDBC"/> <dataSource type="POOLED"> <property name="driver" value="${jdbc.driver}"/> <property name="url" value="${jdbc.url}"/> <property name="username" value="${jdbc.user}"/> <property name="password" value="${jdbc.passowrd}"/> </dataSource> </environment> </environments> <!-- 将咱们写好的sql映射文件必定要注册到全局配置文件中,文件用/,类用.,也就是若是是class就用.分隔 --> <mappers> <mapper resource="EmployeeMapper.xml"/> </mappers> </configuration>
<!-- settings标签能够设置多个属性值 --> <settings> <!-- setting标签负责每个属性的设置 --> <setting name="mapUnderscoreToCamelCase" value="true"/> </settings>
<!-- typeAliases能够为多个类起别名 --> <typeAliases> <!-- 别名处理器,能够为某个java类型设置别名 默认是该类名的首字母小写,别名不区分大小写 alias:能够经过该属性单独指定别名--> <!-- <typeAlias type="com.neuedu.entity.Employee" alias="asd"/> --> <!-- 用package能够批量为类起别名 --> <!-- 批量起别名的状况下,使用@Alias注解为某个实体类指定新的别名 --> <package name="com.neuedu.entity"/> </typeAliases>
虽然有这么多的别名可使用:可是建议仍是使用全类名,看SQL语句是怎么被封装为JAVA 对象的时候简单!apache
<!-- environments:环境们,mybatis能够配置多种环境,default指定使用某种环境。能够达到快速切换环境。 environment:配置一个具体的环境信息;必须有两个标签;id表明当前环境的惟一标识 transactionManager:事务管理器 type:事务管理器的类型;type="[JDBC|MANAGED]"),这两个都是别名,在Configuration类中能够查看具体类!可是Spring对事务的控制才是最终的管理方案! 固然也能够自定义事务管理器:只须要和人家同样实现TransactionFactory接口,type指定为全类名。 dataSource:数据源 type:type="[UNPOOLED|POOLED|JNDI]" 自定义数据源:实现DataSourceFactory接口,type也是全类名 可是咱们也说了,不管是事务管理器的配置仍是数据源的配置咱们都会使用spring来作,这里只须要了解一下便可! --> <environments default="development"> <environment id="test"> <transactionManager type="JDBC"/> <dataSource type="POOLED"> <property name="driver" value="${jdbc.driver}"/> <property name="url" value="${jdbc.url}"/> <property name="username" value="${jdbc.user}"/> <property name="password" value="${jdbc.passowrd}"/> </dataSource> </environment> <environment id="development"> <transactionManager type="JDBC"/> <dataSource type="POOLED"> <property name="driver" value="${jdbc.driver}"/> <property name="url" value="${jdbc.url}"/> <property name="username" value="${jdbc.user}"/> <property name="password" value="${jdbc.passowrd}"/> </dataSource> </environment> </environments>
<databaseIdProvider type="DB_VENDOR"> <property name="SQL Server" value="sqlserver"/> <property name="DB2" value="db2"/> <property name="Oracle" value="oracle"/> <property name="MySQL" value="mysql"/> </databaseIdProvider>
<select id="getEmployeeById" resultType="emp"> select * from tbl_employee where id = #{id} </select> <select id="getEmployeeById" resultType="emp" databaseId="mysql"> select * from tbl_employee where id = #{id} </select> <select id="getEmployeeById" resultType="emp" databaseId="oracle"> select * from tbl_employee where id = #{id} </select>
<environments default="development"> <environment id="development"> <transactionManager type="JDBC" /> <dataSource type="POOLED"> <property name="driver" value="${jdbc.driver}" /> <property name="url" value="${jdbc.url}" /> <property name="username" value="${jdbc.username}" /> <property name="password" value="${jdbc.password}" /> </dataSource> </environment> <environment id="dev_oracle"> <transactionManager type="JDBC" /> <dataSource type="POOLED"> <property name="driver" value="${jdbc.driver}" /> <property name="url" value="${jdbc.url}" /> <property name="username" value="${jdbc.username}" /> <property name="password" value="${jdbc.password}" /> </dataSource> </environment> </environments>
8.mapper映射编程
<!-- mappers:将sql映射注册到全局配置中 --> <mappers> <!-- mapper:注册一个sql映射 注册配置文件: resource:引用类路径下的sql映射文件 mybatis/mapper/EmployeeMapper.xml url:引用网络路径下或者磁盘路径下的sql映射文件 url="file:///var/mappers/AuthorMapper.xml" 注册接口 class:引用(注册)接口: 1.有sql映射文件,映射文件名必须和接口同名,而且放在与接口同一个目录下(能够在conf下见一个同名的包,放在里面); 2.没有sql映射文件,全部的sql都是利用注解写在接口方法上; 推荐: 比较重要的,复杂的Dao接口咱们来写sql映射文件 不重要,见到的Dao接口为了开发快速可使用注解 --> <!-- <mapper class="com.neuedu.mapper.EmployeeMapper"/> --> <mapper resource="com/neuedu/mapper/EmployeeMapper.xml"/> <!-- 批量注册: 对于sql 映射文件和接口须要保证在同一个包下,且名字必须相同 --> <package name="com.neuedu.mapper"/> </mappers>
public interface EmployeeMapper { /* * 增删改查方法 * */ @Select("select * from student where id = #{id}") public Employee getEmployeeById(Integer id); }
public class C3P0DateSource extends UnpooledDataSourceFactory{ public C3P0DateSource() { this.dataSource = new ComboPooledDataSource(); } }
<environments default="development"> <environment id="development"> <transactionManager type="JDBC" /> <dataSource type="com.neuedu.datasource.C3P0DateSource"> <property name="driverClass" value="${jdbc.driver}" /> <property name="jdbcUrl" value="${jdbc.url}" /> <property name="user" value="${jdbc.username}" /> <property name="password" value="${jdbc.password}" /> </dataSource> </environment> </environments>