发表于: 2020-04-21 22:22:14
1 1243
配置服务器,这里我没去新买了,就用国外的小水管试试。
安装好 mysql server 后先用 navicat 连接:
这里需要注意的是安装好了之后需要修改配置文件,因为安装好之后默认只能本地连接,想要其他机器访问最好是绑定客户端的 ip 地址,不过咱大局域网的 ip 地址我也不知道怎么找,直接注释掉这句算了。
尝试连接报错,显示没有权限连接:
粘贴如下神秘代码刷新搞定:
mysql> GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY '我的数据库密码' WITH GRANT OPTION;
Query OK, 0 rows affected (0.00 sec)
mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)
navicat 成功连接数据库:
这里为了方便连接,已经把远程数据库的格式与本地数据库统一。
在配置文件 db.properties 中修改数据库 url 即可,测试连接成功:
用昨晚写的 mybatis 方法测试了一下,插入成功,自增主键返回也没有问题,就是中文显示乱码:
服务器上显示也乱码:
搜索了一下,原来是传输数据的过程中编码不对,再次修改 db 配置的 url 如下:
jdbc.url = jdbc:mysql://1xx.xx.xx.x2:3306/school?useUnicode=true&characterEncoding=utf-8
jdbc.user = root
jdbc.passwd = 我的数据库密码
jdbc.driverClass = com.mysql.jdbc.Driver
清空数据库后测试完全莫得问题:
==============================
去辅导师兄的日报里看了一眼,感觉我的代码写的太乱了,仿照师兄的目录改了一下,添加了一些功能,本来目的就是做增删改查,之前写的太少了。
修改后的目录结构:
DBTools.java
package cn.mogeek.mybatis;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import java.io.IOException;
import java.io.InputStream;
public class DBTools {
public static SqlSession getSqlSession(){
SqlSessionFactory sessionFactory;
InputStream inputStream = DBTools.class.getClassLoader().getResourceAsStream("mybatis-config.xml");
sessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
return sessionFactory.openSession();
}
}
MybatisDao.java
package cn.mogeek.mybatis;
import cn.mogeek.domain.Disciple;
import java.io.IOException;
import java.util.List;
public interface MybatisDao {
public Disciple selectById(int id);
public int insert(Disciple disciple);
public void deleteById(int id);
public List<Disciple> selectAll();
public void update(Disciple disciple);
}
MybatisDaoImpl.java
package cn.mogeek.mybatis;
import cn.mogeek.domain.Disciple;
import org.apache.ibatis.session.SqlSession;
import java.io.IOException;
import java.util.List;
public class MybatisDaoImpl implements MybatisDao {
public Disciple selectById(int id){
SqlSession session = DBTools.getSqlSession();
Disciple disciple = session.selectOne("mapper.discipleMapper.getDisciple", id);
session.close();
return disciple;
}
public int insert(Disciple disciple){
SqlSession session = DBTools.getSqlSession();
session.insert("mapper.discipleMapper.insertDisciple", disciple);
session.commit();
session.close();
return disciple.getId();
}
public void deleteById(int id){
SqlSession sqlSession = DBTools.getSqlSession();
sqlSession.delete("mapper.discipleMapper.deleteDisciple", id);
sqlSession.commit();
sqlSession.clearCache();
sqlSession.close();
}
public List<Disciple> selectAll(){
SqlSession sqlSession = DBTools.getSqlSession();
List<Disciple> discipleList = sqlSession.selectList("mapper.discipleMapper.selectAllDisciples");
sqlSession.close();
return discipleList;
}
public void update(Disciple disciple){
SqlSession sqlSession = DBTools.getSqlSession();
sqlSession.update("mapper.discipleMapper.updateDisciple", disciple);
sqlSession.commit();
sqlSession.clearCache();
sqlSession.close();
}
}
映射配置:
discipleMapper.xml
<?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="mapper.discipleMapper">
<!--name, object, graduated_school, brother, comefrom, daily_report, aims;-->
<resultMap id="disciples" type="cn.mogeek.domain.Disciple">
<id property="id" column="id" javaType="int"></id>
<result property="qq" column="qq" javaType="int"></result>
<result property="name" column="name" javaType="String"></result>
<result property="aims" column="aims" javaType="String"></result>
<result property="object" column="object" javaType="String"></result>
<result property="brother" column="brother" javaType="String"></result>
<result property="comefrom" column="comefrom" javaType="String"></result>
<result property="graduated_school" column="graduated_school" javaType="String"></result>
<result property="daily_report" column="daily_report" javaType="String"></result>
</resultMap>
<!-- 根据id查询得到一个disciple对象-->
<select id="getDisciple" parameterType="int" resultType="cn.mogeek.domain.Disciple">
select * from jnshu_copy1 where id = #{id}
</select>
<!--插入一个新的 disciple 对象-->
<insert id="insertDisciple" parameterType="cn.mogeek.domain.Disciple" useGeneratedKeys="true" keyProperty="id">
insert into jnshu_copy1 (qq, name, object, graduated_school, brother, comefrom, daily_report, aims)
values (#{qq},#{name},#{object},#{graduated_school},#{brother},#{comefrom},#{daily_report},#{aims})
</insert>
<delete id="deleteDisciple" parameterType="int" >
delete from jnshu_copy1 where id=#{id}
</delete>
<select id="selectAllDisciples" resultMap="disciples">
select * from jnshu_copy1
</select>
<update id="updateDisciple" parameterType="cn.mogeek.domain.Disciple">
update jnshu_copy1
<set>
<if test="qq != null"> qq = #{qq}, </if>
<if test="name != null"> name = #{name}, </if>
<if test="object != null"> object = #{object}, </if>
<if test="graduated_school != null"> graduated_school = #{graduated_school}, </if>
<if test="brother != null"> brother = #{brother}, </if>
<if test="comefrom != null"> comefrom = #{comefrom}, </if>
<if test="daily_report != null"> daily_report = #{daily_report}, </if>
<if test="aims != null"> aims = #{aims}</if>
</set>
where id = #{id}
</update>
</mapper>
感觉字段有点多,不想每次更新的时候全部 set 一遍,discipleMapper.xml 只会修改部分改动的字段。
当然测试也是通过的,没有问题:
数据库设置的时自增长主键(id),在我测试的时候发现一个问题:
比如当下最大的 id 为 3,我删除了这条数据,那么当前最大的 id 为 2,此时当我执行插入的时候自动生成的 id 为 4 而不是 3
我之前怀疑是我没有清除 SqlSession 中的缓存导致的,后来 sqlsession.clearCacher() 清楚了缓存之后还是一样的结果。
经过搜索后发现删除之后重启 mysql 服务,那么这个删除的主键才会真正的被释放,再次插入的时候又可以用了。(经过验证确实是这样)
评论