需求:对用户信息进行CURD操作

一.环境搭建

2.mybatis_demo(传智播客)
2.mybatis_demo(传智播客)
2.mybatis_demo(传智播客)
4.在日志文件log4j.properties中添加如下配置信息

#在控制台输出日志信息
# Global logging configuration
log4j.rootLogger=DEBUG, stdout
# MyBatis logging configuration...
log4j.logger.org.mybatis.example.BlogMapper=TRACE
# Console output...
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n
#在文件中台输出日志信息
log4j.rootLogger = DEBUG,FILE
# Define the file appender
log4j.appender.FILE=org.apache.log4j.FileAppender
# Set the name of the file
log4j.appender.FILE.File=/Users/wenlei/study/log.log
# Set the immediate flush to true (default)
log4j.appender.FILE.ImmediateFlush=true
# Set the threshold to debug mode
log4j.appender.FILE.Threshold=debug
# Set the append to false, overwrite
log4j.appender.FILE.Append=false
# Define the layout for file appender
log4j.appender.FILE.layout=org.apache.log4j.PatternLayout
log4j.appender.FILE.layout.conversionPattern=%m%n

5.pom.xml中添加相关依赖

<dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.11</version>
      <scope>test</scope>
    </dependency>
    <dependency>
      <groupId>mysql</groupId>
      <artifactId>mysql-connector-java</artifactId>
      <version>5.1.41</version>
      <scope>runtime</scope>
    </dependency>
    <dependency>
      <groupId>org.mybatis</groupId>
      <artifactId>mybatis</artifactId>
      <version>3.2.2</version>
    </dependency>
    <dependency>
      <groupId>log4j</groupId>
      <artifactId>log4j</artifactId>
      <version>1.2.17</version>
    </dependency>
  </dependencies>

二.开发步骤

1.mybatis.xml

mybatis的全局配置文件:配置数据源以及加载sql映射文件。

<?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>
	    <!-- 环境配置,和spring整合后environments配置将废除-->
	    <environments default="development">
	        <environment id="development">
	            <transactionManager type="JDBC"/>
	            <!--1.配置数据源-->
	            <dataSource type="POOLED">
	                <property name="driver" value="com.mysql.jdbc.Driver" />
	                <property name="url" value="jdbc:mysql://localhost:3306/mybatis?useSSL=false" />
	                <property name="username" value="root" />
	                <property name="password" value="admin123" />
	            </dataSource>
	        </environment>
	    </environments>
	
	    <!--2.在全局配置文件中加载sql映射文件-->
	    <mappers>
	        <mapper resource="mapper/User.xml"/>
	    </mappers>
	</configuration>

2.sql映射文件

完成sql的编写,并使用namespace用于隔离sql语句

<?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的作用就是对sql进行分类管理,注意:使用mapper代理方法开发,namespace的值是该文件的全限定名-->
    <mapper namespace="com">
        <!-- 在映射文件中配置有很多的sql语句 -->
        <!-- 通过select执行数据库查询
         id:标识映射文件中的sql,称为statement的id
         parameterType:指定输入参数的类型
         resultType:指定sql输出结果的映射的java对象类型,select指定resultType表示将单条记录映射成java对象
         #{}表示一个占位符
         #{value}其中value表示接收输入参数的名称,如果输入参数是简单类型,那么#{}中的值可以任意。
         -->
        <!-- 根据用户id查找用户 -->
        <select id="findUserById" resultType="po.User" parameterType="int">
            select * from user where id=#{id}
        </select>

        <!-- 添加用户 -->
        <insert id="insertUser" parameterType="po.User">
              insert into user(id,username,birthday,sex,address) values(#{id},#{username},#{birthday},#{sex},#{address})
        </insert>

        <!-- 根据id删除用户 -->
        <delete id="deleteUser" parameterType="java.lang.Integer">
            delete from user where id=#{id}
        </delete>

        <!-- 根据id更新用户 -->
        <update id="updateUser" parameterType="po.User">
            update user set username=#{username},birthday=#{birthday},sex=#{sex},address=#{address}
            where id=#{id}
        </update>
    </mapper>

3.po编写

public class User {
    //属性名要和数据库表的字段对应
    private int id;
    private String username;// 用户姓名
    private String sex;// 性别
    private String birthday;// 生日
    private String address;// 地址
    //get和set方法......
}

4.测试

// 1.获取mybatis配置文件的路径
String resource = "config/mybatis.xml";
// 2.得到配置文件流
InputStream inputStream = Resources.getResourceAsStream(resource);
// 3.根据mybatis配置文件的信息创建会话工厂
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
// 4.获取会话对象
SqlSession sqlSession = sqlSessionFactory.openSession();

User user = sqlSession.selectOne("findUserById",1);
System.out.println(user);

三.总结

1.sql映射和操作方法

<!-- 查询用户 -->
<select id="findUserById" resultType="po.User" parameterType="int">
	select * from user where id=#{id}
</select>

sqlSession.selectOne(“sql片段”,param);

 <!-- 添加用户 -->
 <insert id="insertUser" parameterType="po.User">
       insert into user(id,username,birthday,sex,address) values(#{id},#{username},#{birthday},#{sex},#{address})
 </insert>

sqlSession.insert(“sql片段”,param);

 <!-- 根据id删除用户 -->
 <delete id="deleteUser" parameterType="java.lang.Integer">
      delete from user where id=#{id}
  </delete>

sqlSession.delete(“sql片段”,param);

<!-- 根据id更新用户 -->
<update id="updateUser" parameterType="po.User">
     update user set username=#{username},birthday=#{birthday},sex=#{sex},address=#{address}
     where id=#{id}
 </update>

sqlSession.update(“sql片段”,param);
2.#{}和${}

{}表示一个占位符号,通过#{}可以实现preparedStatement向占位符中设置值,自动进行java类型和jdbc类型转换,#{}可以有效防止sql注入。 #{}可以接收简单类型值或pojo属性值。 如果parameterType传输单个简单类型值,#{}括号中可以是value或其它名称。
sql{}表示拼接sql串,通过{}可以将parameterType 传入的内容拼接在sql中且不进行jdbc类型转换, pojoparameterType{}可以接收简单类型值或pojo属性值,如果parameterType传输单个简单类型值,{}括号中只能是value。
3.parameterType和resultType
parameterType:指定输入参数类型,mybatis通过ognl从输入对象中获取参数值拼接在sql中。
resultType:指定输出结果类型,mybatis将sql查询结果的一行记录数据映射为resultType指定类型的对象。
4.selectOne和selectList
selectOne查询一条记录,如果使用selectOne查询多条记录则抛出异常:
org.apache.ibatis.exceptions.TooManyResultsException: Expected one result (or null) to be returned by selectOne(), but found: 3
at org.apache.ibatis.session.defaults.DefaultSqlSession.selectOne(DefaultSqlSession.java:70)
selectList可以查询一条或多条记录。

相关文章: