首先来说一下Mybatis链接的注意事项:
要想成功链接mybatis,必须要遵循以下几点规则:
1、在Mybatis中把持久层的操作接口名称和映射文件叫做:Mapper,
其实userDao和userMapper是一样的。
2、在idea中创建目录的时候,和创建包是不一样的。
包在创建的时候,com.aaa.Dao是三级结构
但是在创建目录的时候,com.aaa.Dao是一级结构
3、mybatis的映射配置文件位置必须和dao接口的包结构相同。
4、映射配置文件的mapper标签的namespace属性的取值必须是dao接口的全限定类名。就像是接口和实现类一样。
5、映射配置文件的操作配置(select),id属性的取值必须是dao接口的方法名。
如果实现了以上五点,呢么我们在开发中就无需再写dao的实现类
然后来说一下从零开始构建maven和mybatis的步骤:
首先第一步:创建完maven工程后,必须要在pom.xml文件中配置相关的依赖:
<dependencies> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.5.1</version> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.6</version> </dependency> <dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>1.2.12</version> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> </dependency> </dependencies>
配置完依赖后,我们来看一下链接数据库的过程:
传统JDBC为:
1、加载配置;2、获取链接3、获取prepareState4、执行sql;5、获取结果;6、关闭连接;
而Mybatis为:
1、加载配置;2、创建SqlSessionFactory工厂类;3、使用工厂生产SqlSession对象; 4、使用SqlSession创建Dao接口的代理对象 ;5、使用代理对象执行方法;6、释放资源;
可以看出,基本都是呢几件事,只不过mybatis将传统的jdbc过程做了一个封装。将我们的操作做的更加简单便捷,具体的细节封装理论可以在B站上观看;
下边我们来捋一下这几个步骤:
在进行Mybatis链接之前我们要做一些前置工作。
(1)、在resource包下创建一个xml文件,用来配置mybatis和数据库的链接信息:
<?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"> <!-- 配置mybatis链接--> <environments default="mysql"> <environment id="mysql"> <transactionManager type="JDBC"> </transactionManager> <dataSource type="POOLED"> <property name="driver" value="com.mysql.jdbc.Driver"/> <property name="url" value="jdbc:mysql://localhost:3306/world"/> <property name="username" value="root"/> <property name="password" value="476988"/> </dataSource> </environment> </environment
开启实体类和接口的别名:
实体类:
<typeAliases> <!-- <typeAlias type="com.aaa.Entity.Goods" alias="student"></typeAlias> --> <package name="com.aaa.Entity"></package> </typeAliases>
接口:
<mappers> <!-- <mapper class="com.aaa.Dao.StudentDao"></mapper>--> <!-- <mapper resource="com/aaa/Dao/StudentDao.xml"></mapper>--> <package name="com.aaa.Dao"/> </mappers>
开启驼峰写法:
<settings> <!--开启驼峰写法--> <setting name="mapUnderscoreToCamelCase" value="true"/> </settings>
(2)、配置log4j日志:也是在resource包下创建一个properties文件:
其中,debug info warn error fatal 分别为log4j的日志等级
# Set root category priority to INFO and its only appender to CONSOLE. #log4j.rootCategory=INFO, CONSOLE debug info warn error fatal log4j.rootCategory=debug, CONSOLE, LOGFILE # Set the enterprise logger category to FATAL and its only appender to CONSOLE. log4j.logger.org.apache.axis.enterprise=FATAL, CONSOLE # CONSOLE is set to be a ConsoleAppender using a PatternLayout. log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout log4j.appender.CONSOLE.layout.ConversionPattern=%d{ISO8601} %-6r [%15.15t] %-5p %30.30c %x - %m\n # LOGFILE is set to be a File appender using a PatternLayout. log4j.appender.LOGFILE=org.apache.log4j.FileAppender log4j.appender.LOGFILE.File=mybatis.log log4j.appender.LOGFILE.Append=true log4j.appender.LOGFILE.layout=org.apache.log4j.PatternLayout log4j.appender.LOGFILE.layout.ConversionPattern=%d{ISO8601} %-6r [%15.15t] %-5p %30.30c %x - %m
(3)、书写对应的映射实体类:记住最好是要和数据库内的字段名字一致。
(4)、创建dao层接口:
public interface GoodsDao { //查询方法: public List<Goods> findAllGoods(); public List<Goods> findGoodsByName(String likeName); int insertGoods(Goods goods); int updateGoods(Goods goods); }
(5)、在dao层的同级目录创建xml配置文件并且写对应的mapper映射方法:
首先所有的方法都应该写道mapper标签内,并且要书写命名空间,命名空间必须是对应的dao接口的全限定名。
<mapper namespace="com.aaa.Dao.GoodsDao"></mapper>
注意增删改查不同的方法有不同的书写格式哦~
普通的查询方法:id必须是dao接口中对应的方法名,resultType必须是对应的返回值类型
<select id="findAllGoods" resultType="goods"> select * from goods; </select>
模糊查询1:采用${value} 的方式进行值的录入新增,这个的话容易发生sql注入。所以不太建议用。
<select id="findStudentListByName" parameterType="string" resultType="com.aaa.entity.Student"> select * from student where s_name='${value}' </select>
模糊查询2:采用占位符的方式进行拼接,比较安全:
<select id="findStudentListByName" parameterType="string" resultType="student" > select * from student where s_name = #{likeName} </select>
新增方法:用insert标签:
<insert id="insertGoods"> insert into goods(img_id,name,content,status,create_time,update_time) values(#{imgId},#{name},#{content},#{status},#{createTime},#{updateTime}) </insert>
新增返回主键1:其中啊,userGeneratedKeys这个标签属性的意思是是否打开返回主键自增;
然后呢,keyColumn属性是对应的你数据库表内的主键字段是哪个,然后keyProperty属性的意思是你要把你返回的自增主键返回给你对应的实体类中的哪个字段。
新增返回主键2:order属性的意思是你要获取自增前的主键还是自增后的主键,呢肯定自增后啊,所以是after。
<insert id="insertStudent"> insert into student(s_name,s_birth,s_sex,g_type) values(#{s_name},#{s_birth},#{s_sex},#{g_type}) <selectKey keyColumn="s_id" keyProperty="id" resultType="java.lang.Integer" order="AFTER"> /* keyProperty 的意思是将自增的主键赋值到studnet的哪个字段 */ select last_insert_id() </selectKey> </insert>
***********************************************************************************************************
修改方法:用update标签
其中parameterType可写可不写。
<update id="updateStudent" parameterType="com.aaa.entity.Student"> update student set s_name=#{s_name},s_birth=#{s_birth},s_sex=#{s_sex},g_type=#{g_type} where s_id=#{s_id} </update>
删除方法:用delete标签:
<delete id="deleteStudentById" parameterType="java.lang.Integer"> delete from student where s_id=#{id} </delete>
(6)、在测试类中链接数据库,用六步:
1、读取配置文件
2、创建SqlsessionFactory工厂
3、使用工厂生产SqlSsion对象
4、使用SqlSession创建Dao接口的代理对象
5、使用代理对象执行方法
6、释放资源
//读取配置文件 InputStream inputStream=Resources.getResourceAsStream("MybatisConfig.xml"); //创建SqlSessionFacroty工厂:建造者模式 SqlSessionFactoryBuilder builder=new SqlSessionFactoryBuilder(); SqlSessionFactory sqlSessionFactory=builder.build(inputStream); //使用工厂生产SqlSession对象: SqlSession sqlSession=sqlSessionFactory.openSession(true); //使用SqlSession对象创建Dao接口的代理对象 GoodsDao goodsDao=sqlSession.getMapper(GoodsDao.class); //执行方法: List<Goods> list=goodsDao.findAllGoods(); //释放资源 sqlSession.close();
当你想要数据库内的名字和实体类中的名字不一样的时候,有三种方法:
1、在sql语句起别名;
2、开启驼峰命名;
3、使用自定义关联结果集映射;
现在着重讲一下第三种方法:
语法:其中,id代表当前自定义关联结果集映射的名字,type代表结果集的类型
id标签是主键 result标签是其他的列
<resultMap id="student2Map" type="student2"> <id property="s_id" column="s_id"></id> <result property="sName" column="s_name" ></result> <result property="s_sex" column="s_sex" ></result> <result property="s_birth" column="s_birth" ></result> <result property="g_type" column="g_type" ></result> </resultMap>